coltrane 1.0.1 → 1.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.rubocop.yml +19 -0
- data/Gemfile +5 -2
- data/Gemfile.lock +3 -3
- data/coltrane.gemspec +1 -1
- data/exe/coltrane +27 -21
- data/lib/{coltrane-cli.rb → cli.rb} +7 -1
- data/lib/cli/bass_guitar.rb +4 -1
- data/lib/cli/chord.rb +10 -3
- data/lib/cli/errors.rb +10 -4
- data/lib/cli/guitar.rb +12 -10
- data/lib/cli/notes.rb +7 -4
- data/lib/cli/piano.rb +11 -8
- data/lib/cli/representation.rb +14 -14
- data/lib/cli/scale.rb +15 -11
- data/lib/cli/text.rb +6 -3
- data/lib/cli/ukulele.rb +5 -2
- data/lib/coltrane.rb +4 -7
- data/lib/coltrane/cache.rb +10 -9
- data/lib/coltrane/cadence.rb +3 -1
- data/lib/coltrane/chord.rb +16 -8
- data/lib/coltrane/chord_quality.rb +7 -8
- data/lib/coltrane/classic_progressions.rb +10 -7
- data/lib/coltrane/classic_scales.rb +30 -43
- data/lib/coltrane/errors.rb +17 -10
- data/lib/coltrane/interval.rb +24 -23
- data/lib/coltrane/interval_sequence.rb +8 -7
- data/lib/coltrane/interval_set.rb +1 -0
- data/lib/coltrane/note.rb +23 -46
- data/lib/coltrane/note_set.rb +12 -14
- data/lib/coltrane/pitch.rb +5 -4
- data/lib/coltrane/progression.rb +9 -20
- data/lib/coltrane/qualities.rb +114 -112
- data/lib/coltrane/roman_chord.rb +8 -5
- data/lib/coltrane/scale.rb +25 -33
- data/lib/coltrane/version.rb +3 -1
- data/lib/core_ext.rb +7 -4
- metadata +7 -10
- data/db/schema.rb +0 -30
- data/lib/coltrane/chord_cache.rb +0 -4
- data/lib/coltrane/scale_chord.rb +0 -4
data/lib/coltrane/interval.rb
CHANGED
@@ -1,41 +1,42 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Coltrane
|
2
4
|
# It describes a interval between 2 pitches
|
3
5
|
class Interval
|
4
6
|
attr_reader :semitones
|
5
7
|
|
6
|
-
NAMES = [
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
8
|
+
NAMES = %w[
|
9
|
+
1P
|
10
|
+
2m
|
11
|
+
2M
|
12
|
+
3m
|
13
|
+
3M
|
14
|
+
4P
|
15
|
+
4A
|
16
|
+
5P
|
17
|
+
6m
|
18
|
+
6M
|
19
|
+
7m
|
20
|
+
7M
|
19
21
|
].freeze
|
20
22
|
|
21
23
|
def initialize(arg)
|
22
24
|
@semitones = (case arg
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
25
|
+
when Interval then arg.semitones
|
26
|
+
when String then NAMES.index(arg)
|
27
|
+
when Numeric then arg
|
28
|
+
end) % 12
|
27
29
|
end
|
28
30
|
|
29
31
|
def name
|
30
32
|
NAMES[semitones]
|
31
33
|
end
|
32
34
|
|
33
|
-
def +(
|
34
|
-
case
|
35
|
-
when Numeric then Interval.new(semitones +
|
36
|
-
when Interval then Interval.new(semitones +
|
35
|
+
def +(other)
|
36
|
+
case other
|
37
|
+
when Numeric then Interval.new(semitones + other)
|
38
|
+
when Interval then Interval.new(semitones + other.semitones)
|
37
39
|
end
|
38
40
|
end
|
39
|
-
|
40
41
|
end
|
41
|
-
end
|
42
|
+
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Coltrane
|
2
4
|
# It describes a sequence of intervals
|
3
5
|
class IntervalSequence
|
@@ -22,7 +24,7 @@ module Coltrane
|
|
22
24
|
|
23
25
|
def distances
|
24
26
|
intervals_semitones[1..-1].each_with_index.map do |n, i|
|
25
|
-
if i
|
27
|
+
if i.zero?
|
26
28
|
n
|
27
29
|
elsif i < intervals_semitones.size
|
28
30
|
n - intervals_semitones[i]
|
@@ -45,7 +47,7 @@ module Coltrane
|
|
45
47
|
end
|
46
48
|
|
47
49
|
def zero_it
|
48
|
-
|
50
|
+
shift(-intervals.first.semitones)
|
49
51
|
end
|
50
52
|
|
51
53
|
def inversion(index)
|
@@ -53,11 +55,11 @@ module Coltrane
|
|
53
55
|
end
|
54
56
|
|
55
57
|
def next_inversion
|
56
|
-
inversion(index+1)
|
58
|
+
inversion(index + 1)
|
57
59
|
end
|
58
60
|
|
59
61
|
def previous_inversion
|
60
|
-
inversion(index-1)
|
62
|
+
inversion(index - 1)
|
61
63
|
end
|
62
64
|
|
63
65
|
def inversions
|
@@ -66,8 +68,7 @@ module Coltrane
|
|
66
68
|
end
|
67
69
|
end
|
68
70
|
|
69
|
-
def quality
|
70
|
-
end
|
71
|
+
def quality; end
|
71
72
|
|
72
73
|
def intervals_semitones
|
73
74
|
map(&:semitones)
|
@@ -97,4 +98,4 @@ module Coltrane
|
|
97
98
|
notes.map { |n| notes.root - n }.sort_by(&:semitones)
|
98
99
|
end
|
99
100
|
end
|
100
|
-
end
|
101
|
+
end
|
data/lib/coltrane/note.rb
CHANGED
@@ -1,11 +1,12 @@
|
|
1
|
-
|
2
|
-
# It describes a musical note, independent of octave
|
1
|
+
# frozen_string_literal: true
|
3
2
|
|
3
|
+
module Coltrane
|
4
|
+
# Describes a musical note, independent of octave (that'd be pitch)
|
4
5
|
class Note
|
5
6
|
include Multiton
|
6
7
|
|
7
8
|
attr_reader :name, :number
|
8
|
-
|
9
|
+
alias id number
|
9
10
|
|
10
11
|
NOTES = {
|
11
12
|
'C' => 0,
|
@@ -28,7 +29,8 @@ module Coltrane
|
|
28
29
|
}.freeze
|
29
30
|
|
30
31
|
def initialize(name)
|
31
|
-
@name
|
32
|
+
@name = name
|
33
|
+
@number = NOTES[name]
|
32
34
|
end
|
33
35
|
|
34
36
|
private_class_method :new
|
@@ -39,10 +41,11 @@ module Coltrane
|
|
39
41
|
when Note then return arg
|
40
42
|
when String then find_note(arg)
|
41
43
|
when Numeric then NOTES.key(arg % 12)
|
42
|
-
else
|
44
|
+
else
|
45
|
+
raise InvalidNoteError, "Wrong type: #{arg.class}"
|
43
46
|
end
|
44
47
|
|
45
|
-
new(name) || (raise
|
48
|
+
new(name) || (raise InvalidNoteError, arg.to_s)
|
46
49
|
end
|
47
50
|
|
48
51
|
def self.all
|
@@ -50,63 +53,37 @@ module Coltrane
|
|
50
53
|
end
|
51
54
|
|
52
55
|
def self.find_note(str)
|
53
|
-
NOTES.
|
56
|
+
NOTES.each_key { |k, _v| return k if str.casecmp?(k) }
|
54
57
|
nil
|
55
58
|
end
|
56
59
|
|
57
60
|
def pretty_name
|
58
|
-
@name.
|
61
|
+
@name.tr('b', "\u266D").tr('#', "\u266F")
|
59
62
|
end
|
60
63
|
|
61
|
-
|
64
|
+
alias to_s name
|
62
65
|
|
63
66
|
def accident?
|
64
|
-
[1,3,6,8,10].include?(number)
|
67
|
+
[1, 3, 6, 8, 10].include?(number)
|
65
68
|
end
|
66
69
|
|
67
|
-
def +(
|
68
|
-
case
|
69
|
-
|
70
|
-
|
71
|
-
|
70
|
+
def +(other)
|
71
|
+
case other
|
72
|
+
when Interval then Note[number + other.semitones]
|
73
|
+
when Numeric then Note[number + other]
|
74
|
+
when Note then Chord.new(number + other.number)
|
72
75
|
end
|
73
76
|
end
|
74
77
|
|
75
|
-
def -(
|
76
|
-
case
|
77
|
-
|
78
|
-
|
78
|
+
def -(other)
|
79
|
+
case other
|
80
|
+
when Numeric then Note.new(other - number)
|
81
|
+
when Note then Interval.new(other.number - number)
|
79
82
|
end
|
80
83
|
end
|
81
84
|
|
82
|
-
def valid_note?(note_name)
|
83
|
-
find_note(note_name)
|
84
|
-
end
|
85
|
-
|
86
85
|
def interval_to(note_name)
|
87
86
|
Note[note_name] - self
|
88
87
|
end
|
89
|
-
|
90
|
-
def transpose_by(semitones)
|
91
|
-
self + semitones
|
92
|
-
end
|
93
|
-
|
94
|
-
def guitar_notes
|
95
|
-
Guitar.strings.reduce([]) do |memo, guitar_string|
|
96
|
-
memo + in_guitar_string(guitar_string)
|
97
|
-
end
|
98
|
-
end
|
99
|
-
|
100
|
-
def on_guitar
|
101
|
-
GuitarNoteSet.new(guitar_notes).render
|
102
|
-
end
|
103
|
-
|
104
|
-
def in_guitar_string(guitar_string)
|
105
|
-
guitar_string.guitar_notes_for_note(self)
|
106
|
-
end
|
107
|
-
|
108
|
-
def in_guitar_string_region(guitar_string, region)
|
109
|
-
guitar_string.guitar_notes_for_note_in_region(self, region)
|
110
|
-
end
|
111
88
|
end
|
112
|
-
end
|
89
|
+
end
|
data/lib/coltrane/note_set.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Coltrane
|
2
4
|
# It describes a set of notes
|
3
5
|
class NoteSet
|
@@ -8,8 +10,8 @@ module Coltrane
|
|
8
10
|
|
9
11
|
attr_reader :notes
|
10
12
|
|
11
|
-
|
12
|
-
|
13
|
+
alias root first
|
14
|
+
alias all notes
|
13
15
|
|
14
16
|
def self.[](*notes)
|
15
17
|
new(notes)
|
@@ -19,21 +21,21 @@ module Coltrane
|
|
19
21
|
@notes =
|
20
22
|
case arg
|
21
23
|
when NoteSet then arg.notes
|
22
|
-
when Array then arg.map {|n| n.is_a?(Note) ? n : Note[n] }
|
23
|
-
else raise
|
24
|
+
when Array then arg.map { |n| n.is_a?(Note) ? n : Note[n] }
|
25
|
+
else raise InvalidNotesError, arg
|
24
26
|
end
|
25
27
|
end
|
26
28
|
|
27
|
-
def &(
|
28
|
-
NoteSet[*(notes &
|
29
|
+
def &(other)
|
30
|
+
NoteSet[*(notes & other.notes)]
|
29
31
|
end
|
30
32
|
|
31
33
|
def degree(note)
|
32
|
-
index(note)+1
|
34
|
+
index(note) + 1
|
33
35
|
end
|
34
36
|
|
35
|
-
def +(
|
36
|
-
NoteSet[*(notes +
|
37
|
+
def +(other)
|
38
|
+
NoteSet[*(notes + other.notes)]
|
37
39
|
end
|
38
40
|
|
39
41
|
def pretty_names
|
@@ -54,12 +56,8 @@ module Coltrane
|
|
54
56
|
end
|
55
57
|
end
|
56
58
|
|
57
|
-
def guitar_notes
|
58
|
-
GuitarNoteSet.new(notes.map(&:guitar_notes).flatten)
|
59
|
-
end
|
60
|
-
|
61
59
|
def interval_sequence
|
62
60
|
IntervalSequence.new(notes: self)
|
63
61
|
end
|
64
62
|
end
|
65
|
-
end
|
63
|
+
end
|
data/lib/coltrane/pitch.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Coltrane
|
2
4
|
# It describes a pitch, like E4 or Bb5. It's like a note, but it has an octave
|
3
5
|
class Pitch
|
@@ -28,9 +30,8 @@ module Coltrane
|
|
28
30
|
Note[number]
|
29
31
|
end
|
30
32
|
|
31
|
-
def +(
|
32
|
-
|
33
|
-
Pitch.new(number + n)
|
33
|
+
def +(other)
|
34
|
+
Pitch.new(number + (other.is_a?(Pitch) ? other.number : other))
|
34
35
|
end
|
35
36
|
end
|
36
|
-
end
|
37
|
+
end
|
data/lib/coltrane/progression.rb
CHANGED
@@ -1,35 +1,24 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Coltrane
|
4
|
+
# Allows creation of chord progressions
|
2
5
|
class Progression
|
3
6
|
extend ClassicProgressions
|
4
7
|
|
5
8
|
attr_reader :scale
|
6
9
|
|
7
|
-
def initialize(
|
8
|
-
|
9
|
-
@scale = get_scale_from_key(key)
|
10
|
-
end
|
10
|
+
def initialize(_roman_notation, key: nil, scale: nil)
|
11
|
+
@scale = Scale.from_key(key) unless key.nil?
|
11
12
|
end
|
12
13
|
|
13
|
-
def chords
|
14
|
-
all_chords.values_at(*chord_indexes)
|
15
|
-
end
|
14
|
+
# def chords
|
16
15
|
|
17
|
-
|
18
|
-
chords.map(&:on_guitar)
|
19
|
-
end
|
20
|
-
|
21
|
-
def on_piano
|
22
|
-
chords.map(&:on_piano)
|
23
|
-
end
|
16
|
+
# end
|
24
17
|
|
25
18
|
private
|
26
19
|
|
27
|
-
def all_chords
|
28
|
-
scale.sevenths
|
29
|
-
end
|
30
|
-
|
31
20
|
def chord_indexes
|
32
|
-
degrees.map { |d| d-1 }
|
21
|
+
scale.degrees.map { |d| d - 1 }
|
33
22
|
end
|
34
23
|
end
|
35
|
-
end
|
24
|
+
end
|
data/lib/coltrane/qualities.rb
CHANGED
@@ -1,116 +1,118 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Coltrane
|
2
4
|
module Qualities
|
3
5
|
CHORD_QUALITIES = {
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
6
|
+
'5' => [0, 7],
|
7
|
+
'Msus2' => [0, 2, 7],
|
8
|
+
'dim' => [0, 3, 6],
|
9
|
+
'm' => [0, 3, 7],
|
10
|
+
'm#5' => [0, 3, 8],
|
11
|
+
'Mb5' => [0, 4, 6],
|
12
|
+
'M' => [0, 4, 7],
|
13
|
+
'M#5' => [0, 4, 8],
|
14
|
+
'Mb6' => [0, 4, 8],
|
15
|
+
'7ndim5' => [0, 4, 10],
|
16
|
+
'Msus4' => [0, 5, 7],
|
17
|
+
'mb6b9' => [0, 1, 3, 8],
|
18
|
+
'addb9' => [0, 1, 4, 7],
|
19
|
+
'madd9' => [0, 2, 3, 7],
|
20
|
+
'Madd9' => [0, 2, 4, 7],
|
21
|
+
'sus24' => [0, 2, 5, 7],
|
22
|
+
'M#5add9' => [0, 2, 4, 8],
|
23
|
+
'9ndim5' => [0, 2, 4, 10],
|
24
|
+
'+add#9' => [0, 3, 4, 8],
|
25
|
+
'madd4' => [0, 3, 5, 7],
|
26
|
+
'4' => [0, 3, 5, 10],
|
27
|
+
'dim7' => [0, 3, 6, 9],
|
28
|
+
'm7' => [0, 3, 7, 10],
|
29
|
+
'mM7' => [0, 3, 7, 11],
|
30
|
+
'm7#5' => [0, 3, 8, 10],
|
31
|
+
'7b5' => [0, 4, 6, 10],
|
32
|
+
'7' => [0, 4, 7, 10],
|
33
|
+
'7#5' => [0, 4, 8, 10],
|
34
|
+
'7b13' => [0, 4, 8, 10],
|
35
|
+
'M7#5' => [0, 4, 8, 11],
|
36
|
+
'M7b6' => [0, 4, 8, 11],
|
37
|
+
'M7b5' => [0, 4, 6, 11],
|
38
|
+
'M7#5sus4' => [0, 5, 8, 11],
|
39
|
+
'7sus4' => [0, 5, 7, 10],
|
40
|
+
'7#5sus4' => [0, 5, 8, 10],
|
41
|
+
'M7sus4' => [0, 5, 7, 11],
|
42
|
+
'M6' => [0, 4, 7, 9],
|
43
|
+
'm7b5' => [0, 3, 6, 10],
|
44
|
+
'M7' => [0, 4, 7, 11],
|
45
|
+
'maj7' => [0, 4, 7, 11],
|
46
|
+
'mb6M7' => [0, 3, 8, 11],
|
47
|
+
'dimM7' => [0, 3, 6, 11],
|
48
|
+
'm6' => [0, 3, 5, 7, 9],
|
49
|
+
'm6/9' => [0, 2, 3, 7, 9],
|
50
|
+
'M6/9' => [0, 2, 4, 7, 9],
|
51
|
+
'M6#11' => [0, 4, 6, 7, 9],
|
52
|
+
'm7add11' => [0, 3, 5, 7, 10],
|
53
|
+
'dim7M7' => [0, 3, 6, 9, 11],
|
54
|
+
'm9' => [0, 2, 3, 7, 10],
|
55
|
+
'm9#5' => [0, 2, 3, 8, 10],
|
56
|
+
'm9b5' => [0, 2, 3, 6, 10],
|
57
|
+
'mM7b6' => [0, 3, 7, 8, 11],
|
58
|
+
'mM9' => [0, 2, 3, 7, 11],
|
59
|
+
'M7b9' => [0, 1, 4, 7, 11],
|
60
|
+
'M9' => [0, 2, 4, 7, 11],
|
61
|
+
'M9#5' => [0, 2, 4, 8, 11],
|
62
|
+
'M9#5sus4' => [0, 2, 5, 8, 11],
|
63
|
+
'M9b5' => [0, 2, 4, 6, 11],
|
64
|
+
'M9sus4' => [0, 2, 5, 7, 11],
|
65
|
+
'M7#11' => [0, 4, 6, 7, 11],
|
66
|
+
'7#9' => [0, 3, 4, 7, 10],
|
67
|
+
'7#11' => [0, 4, 6, 7, 10],
|
68
|
+
'11' => [0, 2, 5, 7, 10],
|
69
|
+
'11b9' => [0, 1, 5, 7, 10],
|
70
|
+
'13ndim5' => [0, 2, 4, 9, 10],
|
71
|
+
'7#5#9' => [0, 3, 4, 8, 10],
|
72
|
+
'7#5b9' => [0, 1, 4, 8, 10],
|
73
|
+
'7add6' => [0, 4, 7, 9, 10],
|
74
|
+
'7b6' => [0, 4, 7, 8, 10],
|
75
|
+
'7b9' => [0, 1, 4, 7, 10],
|
76
|
+
'7sus4b9' => [0, 1, 5, 7, 10],
|
77
|
+
'9' => [0, 2, 4, 7, 10],
|
78
|
+
'9#5' => [0, 2, 4, 8, 10],
|
79
|
+
'9b13' => [0, 2, 4, 8, 10],
|
80
|
+
'9b5' => [0, 2, 4, 6, 10],
|
81
|
+
'9sus4' => [0, 2, 5, 7, 10],
|
82
|
+
'M6/9#11' => [0, 2, 4, 6, 7, 9],
|
83
|
+
'6/9#11' => [0, 2, 4, 6, 7, 9],
|
84
|
+
'9#5#11' => [0, 2, 4, 6, 8, 10],
|
85
|
+
'Blues' => [0, 3, 5, 6, 7, 10],
|
86
|
+
'm11' => [0, 2, 3, 5, 7, 10],
|
87
|
+
'm11#5' => [0, 2, 3, 5, 8, 10],
|
88
|
+
'm11b5' => [0, 2, 3, 5, 6, 10],
|
89
|
+
'13b5' => [0, 2, 4, 6, 9, 10],
|
90
|
+
'13b9' => [0, 1, 4, 7, 9, 10],
|
91
|
+
'13sus4' => [0, 2, 5, 7, 9, 10],
|
92
|
+
'7#11b13' => [0, 4, 6, 7, 8, 10],
|
93
|
+
'7#5b9#11' => [0, 1, 4, 6, 8, 10],
|
94
|
+
'7#9#11' => [0, 3, 4, 6, 7, 10],
|
95
|
+
'7#9b13' => [0, 3, 4, 7, 8, 10],
|
96
|
+
'13#9' => [0, 3, 4, 7, 9, 10],
|
97
|
+
'13' => [0, 2, 4, 7, 9, 10],
|
98
|
+
'7b9#11' => [0, 1, 4, 6, 7, 10],
|
99
|
+
'7b9#9' => [0, 1, 3, 4, 7, 10],
|
100
|
+
'7b9b13' => [0, 1, 4, 7, 8, 10],
|
101
|
+
'7sus4b9b13' => [0, 1, 5, 7, 8, 10],
|
102
|
+
'9#11' => [0, 2, 4, 6, 7, 10],
|
103
|
+
'M13' => [0, 2, 4, 7, 9, 11],
|
104
|
+
'M7#9#11' => [0, 3, 4, 6, 7, 11],
|
105
|
+
'M7add13' => [0, 2, 4, 7, 9, 11],
|
106
|
+
'M9#11' => [0, 2, 4, 6, 7, 11],
|
107
|
+
'mM9b6' => [0, 2, 3, 7, 8, 11],
|
108
|
+
'7b9b13#11' => [0, 1, 4, 6, 7, 8, 10],
|
109
|
+
'13b9#11' => [0, 1, 4, 6, 7, 9, 10],
|
110
|
+
'9#11b13' => [0, 2, 4, 6, 7, 8, 10],
|
111
|
+
'13#11' => [0, 2, 4, 6, 7, 9, 10],
|
112
|
+
'M13#11' => [0, 2, 4, 6, 7, 9, 11],
|
113
|
+
'm13' => [0, 2, 3, 5, 7, 9, 10],
|
114
|
+
'13#9#11' => [0, 3, 4, 6, 7, 9, 10],
|
115
|
+
'7#9#11b13' => [0, 3, 4, 6, 7, 8, 10]
|
116
|
+
}.freeze
|
115
117
|
end
|
116
|
-
end
|
118
|
+
end
|