1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
mod constants;
mod types;
pub use constants::OCTAVE;
use rug::Rational;
pub use types::{IntExt, LatticeDimension, Ordinal, Pitch, Ratio};

pub fn lattice_relation(prime: usize, ordinal: Ordinal) -> Rational {
    let octave = Rational::from(OCTAVE);
    let p = Rational::from((prime, 1));
    let ratio = match ordinal {
        Ordinal::Otonal => p / octave,
        Ordinal::Utonal => octave / p,
    };

    ratio.flatten()
}

pub fn gen_lattice(dimensions: &[usize], steps: usize) -> Vec<LatticeDimension> {
    let mut result = vec![];

    for dimension in dimensions {
        result.push(LatticeDimension::new(*dimension, steps));
    }

    result
}