Skip to content

Commit 12e4d3d

Browse files
committed
fixes #100, sort tab chords based no root in scale
1 parent f2754ab commit 12e4d3d

File tree

2 files changed

+34
-12
lines changed

2 files changed

+34
-12
lines changed

crates/notation_core/src/scale.rs

Lines changed: 28 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
use serde::{Deserialize, Serialize};
22
use std::fmt::Display;
33

4-
use crate::prelude::{Key, Note, Pitch, Semitones, Syllable, SyllableNote};
4+
use crate::prelude::{Key, Note, Pitch, Semitones, Syllable, SyllableNote, Chord};
55

66
// https://hellomusictheory.com/learn/music-scales-beginners-guide/
77
#[derive(Copy, Clone, PartialEq, Eq, Serialize, Deserialize, Debug)]
@@ -50,19 +50,36 @@ impl Scale {
5050
}
5151

5252
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+
}
5364
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();
6466
Semitones(semitones)
6567
}
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+
}
6683
pub fn calc_syllable(&self, key: &Key, pitch: &Pitch) -> Syllable {
6784
(Semitones::from(*pitch) - self.calc_do_semitones(key)).into()
6885
}

crates/notation_model/src/track.rs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,12 @@ impl Track {
122122
}
123123
})
124124
.collect::<Vec<TabChord>>();
125-
chords.sort_by(|a, b| a.chord.cmp(&b.chord));
125+
let scale = self.tab().map(|t| t.meta.scale);
126+
chords.sort_by(|a, b| {
127+
let chord_a = scale.map(|s| s.calc_chord_for_sort(&a.chord)).unwrap_or(a.chord);
128+
let chord_b = scale.map(|s| s.calc_chord_for_sort(&b.chord)).unwrap_or(b.chord);
129+
chord_a.cmp(&chord_b)
130+
});
126131
chords
127132
}
128133
}

0 commit comments

Comments
 (0)