Skip to main content

minstrel/
mode.rs

1use strum_macros::{Display as EnumDisplay, EnumIter, EnumString};
2
3/// An enumeration over the seven musical modes.
4#[derive(EnumString, EnumIter, EnumDisplay, Debug, Copy, Clone)]
5pub enum Mode {
6    Ionian,
7    Dorian,
8    Phrygian,
9    Mixolydian,
10    Lydian,
11    Aeolian,
12    Locrian,
13}
14
15impl IntoIterator for Mode {
16    type Item = &'static usize;
17    type IntoIter = std::slice::Iter<'static, usize>;
18
19    fn into_iter(self) -> Self::IntoIter {
20        // The seventh interval is ignored, since it simply returns to the octave
21        // (which is already stored as the root note in a `Key`)
22        match self {
23            Mode::Ionian => [2, 2, 1, 2, 2, 2].iter(),
24            Mode::Dorian => [2, 1, 2, 2, 2, 1].iter(),
25            Mode::Phrygian => [1, 2, 2, 2, 1, 2].iter(),
26            Mode::Mixolydian => [2, 2, 2, 1, 2, 2].iter(),
27            Mode::Lydian => [2, 2, 1, 2, 2, 1].iter(),
28            Mode::Aeolian => [2, 1, 2, 2, 1, 2].iter(),
29            Mode::Locrian => [1, 2, 2, 1, 2, 2].iter(),
30        }
31    }
32}