redact_composer_musical/scale/mode.rs
1#[cfg(feature = "serde")]
2use serde::{Deserialize, Serialize};
3
4#[cfg(feature = "redact-composer")]
5use redact_composer_core::derive::Element;
6
7/// Offset applied to a [`Scale`](super::Scale)'s interval sequence.
8#[derive(Debug, Default, Clone, Copy, PartialEq, Eq, Hash)]
9#[cfg_attr(feature = "redact-composer", derive(Element))]
10#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
11pub enum Mode {
12 /// No offset
13 #[default]
14 Ionian,
15 /// Offset of 1, starting a scale from the second interval step.
16 Dorian,
17 /// Offset of 2, starting a scale from the third interval step.
18 Phrygian,
19 /// Offset of 3, starting a scale from the fourth interval step.
20 Lydian,
21 /// Offset of 4, starting a scale from the fifth interval step.
22 Mixolydian,
23 /// Offset of 5, starting a scale from the sixth interval step.
24 Aeolian,
25 /// Offset of 6, starting a scale from the seventh interval step.
26 Locrian,
27}
28
29impl Mode {
30 /// Returns a [Vec]<[Mode]> of all types.
31 pub fn values() -> Vec<Mode> {
32 vec![
33 Self::Ionian,
34 Self::Dorian,
35 Self::Phrygian,
36 Self::Lydian,
37 Self::Mixolydian,
38 Self::Aeolian,
39 Self::Locrian,
40 ]
41 }
42}