rstmt_core/comp/
scale.rs

1/*
2    Appellation: scale <module>
3    Created At: 2025.12.29:16:46:22
4    Contrib: @FL03
5*/
6use crate::Frequency;
7
8/// The [`Scale`] implementation uses the defined _root_ or _anchor_ frequency as the basis for
9/// classfifications and other related computations.
10#[derive(Clone, Copy, Debug, Default, Eq, Hash, Ord, PartialEq, PartialOrd)]
11#[cfg_attr(feature = "serde", derive(serde::Deserialize, serde::Serialize))]
12pub struct Scale<T = f32> {
13    pub root: Frequency<T>,
14}
15
16#[cfg(test)]
17mod tests {
18    use super::Scale;
19    use crate::freq::Frequency;
20
21    const A4: Frequency<f64> = Frequency(440.0);
22    const C4: Frequency<f64> = Frequency(261.6255653005986);
23
24    #[test]
25    fn test_freq_converter() {
26        let n: isize = -9; // C4;
27        let scale = Scale::from_freq(A4); // A4
28
29        assert! { (scale.get_freq_of_class(n) - C4).abs() < 1e-5 }
30        assert_eq! { scale.classify(C4), Some(n) }
31    }
32}