euphony_units/pitch/mode/
chromatic.rs

1//! https://en.wikipedia.org/wiki/Chromatic_scale
2
3use crate::pitch::interval::Interval;
4
5named_interval!(A(0, 1)); // 0/12
6named_interval!(B(1, 6)); // 2/12
7named_interval!(C(1, 4)); // 3/12
8named_interval!(D(5, 12));
9named_interval!(E(7, 12));
10named_interval!(F(2, 3)); // 8/12
11named_interval!(G(5, 6)); // 10/12
12
13named_interval!(SEMITONE(1, 12));
14named_interval!(WHOLETONE(1, 6));
15
16pub trait ChromaticInterval {
17    fn sharp(self) -> Self;
18    fn flat(self) -> Self;
19}
20
21impl ChromaticInterval for Interval {
22    fn sharp(self) -> Self {
23        self + SEMITONE
24    }
25
26    fn flat(self) -> Self {
27        self - SEMITONE
28    }
29}
30
31#[test]
32fn modifier_test() {
33    assert_eq!(A.sharp(), B.flat());
34}