|
1 | 1 | use serde::{Deserialize, Serialize}; |
2 | 2 | use std::fmt::Display; |
3 | 3 |
|
4 | | -use crate::prelude::{Key, Note, Pitch, Semitones, Syllable, SyllableNote}; |
| 4 | +use crate::prelude::{Key, Note, Pitch, Semitones, Syllable, SyllableNote, Chord}; |
5 | 5 |
|
6 | 6 | // https://hellomusictheory.com/learn/music-scales-beginners-guide/ |
7 | 7 | #[derive(Copy, Clone, PartialEq, Eq, Serialize, Deserialize, Debug)] |
@@ -50,19 +50,36 @@ impl Scale { |
50 | 50 | } |
51 | 51 |
|
52 | 52 | impl Scale { |
| 53 | + pub fn calc_do_offset(&self) -> i8 { |
| 54 | + match self { |
| 55 | + Scale::Ionian => 0, |
| 56 | + Scale::Dorian => -2, |
| 57 | + Scale::Phrygian => -4, |
| 58 | + Scale::Lydian => -5, |
| 59 | + Scale::Mixolydian => 5, |
| 60 | + Scale::Aeolian => 3, |
| 61 | + Scale::Locrian => 1, |
| 62 | + } |
| 63 | + } |
53 | 64 | pub fn calc_do_semitones(&self, key: &Key) -> Semitones { |
54 | | - let semitones = Semitones::from(*key).0 |
55 | | - + match self { |
56 | | - Scale::Ionian => 0, |
57 | | - Scale::Dorian => -2, |
58 | | - Scale::Phrygian => -4, |
59 | | - Scale::Lydian => -5, |
60 | | - Scale::Mixolydian => 5, |
61 | | - Scale::Aeolian => 3, |
62 | | - Scale::Locrian => 1, |
63 | | - }; |
| 65 | + let semitones = Semitones::from(*key).0 + self.calc_do_offset(); |
64 | 66 | Semitones(semitones) |
65 | 67 | } |
| 68 | + pub fn calc_syllable_for_sort(&self, syllable: &Syllable) -> Syllable { |
| 69 | + let semitones = Semitones::from(*syllable).0 + self.calc_do_offset(); |
| 70 | + Semitones(semitones).into() |
| 71 | + } |
| 72 | + pub fn calc_chord_for_sort(&self, chord: &Chord) -> Chord { |
| 73 | + if *self == Scale::Ionian { |
| 74 | + return chord.clone(); |
| 75 | + } |
| 76 | + let root = self.calc_syllable_for_sort(&chord.root); |
| 77 | + Chord { |
| 78 | + root, |
| 79 | + intervals: chord.intervals.clone(), |
| 80 | + base: chord.base.clone(), |
| 81 | + } |
| 82 | + } |
66 | 83 | pub fn calc_syllable(&self, key: &Key, pitch: &Pitch) -> Syllable { |
67 | 84 | (Semitones::from(*pitch) - self.calc_do_semitones(key)).into() |
68 | 85 | } |
|
0 commit comments