coltrane 0.0.2 → 1.0.0
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 +5 -5
- data/.gitignore +2 -0
- data/.ruby-version +1 -0
- data/Gemfile +15 -10
- data/Gemfile.lock +47 -128
- data/README.md +30 -8
- data/Rakefile +0 -4
- data/bin/bundle +105 -0
- data/bin/byebug +29 -0
- data/bin/coderay +12 -0
- data/bin/coltrane +25 -7
- data/bin/htmldiff +12 -0
- data/bin/kill-pry-rescue +12 -0
- data/bin/ldiff +12 -0
- data/bin/pry +12 -0
- data/bin/rake +12 -0
- data/bin/rescue +12 -0
- data/bin/rspec +12 -0
- data/bin/rubocop +12 -0
- data/bin/ruby-parse +12 -0
- data/bin/ruby-rewrite +12 -0
- data/exe/coltrane +173 -0
- data/lib/cli/bass_guitar.rb +9 -0
- data/lib/cli/chord.rb +24 -0
- data/lib/cli/errors.rb +28 -0
- data/lib/cli/guitar.rb +55 -0
- data/lib/cli/notes.rb +18 -0
- data/lib/cli/piano.rb +54 -0
- data/lib/cli/representation.rb +47 -0
- data/lib/cli/scale.rb +48 -0
- data/lib/cli/text.rb +13 -0
- data/lib/cli/ukulele.rb +11 -0
- data/lib/coltrane-cli.rb +12 -0
- data/lib/coltrane.rb +16 -31
- data/lib/coltrane/cache.rb +34 -0
- data/lib/coltrane/chord.rb +28 -41
- data/lib/coltrane/chord_quality.rb +14 -39
- data/lib/coltrane/classic_progressions.rb +37 -0
- data/lib/coltrane/classic_scales.rb +92 -118
- data/lib/coltrane/errors.rb +54 -0
- data/lib/coltrane/interval.rb +25 -17
- data/lib/coltrane/interval_sequence.rb +57 -27
- data/lib/coltrane/note.rb +44 -30
- data/lib/coltrane/note_set.rb +37 -22
- data/lib/coltrane/piano_representation.rb +0 -58
- data/lib/coltrane/pitch.rb +12 -3
- data/lib/coltrane/progression.rb +31 -0
- data/lib/coltrane/qualities.rb +115 -114
- data/lib/coltrane/roman_chord.rb +36 -0
- data/lib/coltrane/scale.rb +85 -77
- data/lib/coltrane/version.rb +1 -1
- data/lib/core_ext.rb +12 -0
- data/pkg/coltrane-0.0.2.gem +0 -0
- metadata +27 -14
- data/lib/coltrane/essential_guitar_chords.rb +0 -82
- data/lib/coltrane/fret_set.rb +0 -0
- data/lib/coltrane/guitar.rb +0 -15
- data/lib/coltrane/guitar_chord.rb +0 -50
- data/lib/coltrane/guitar_chord_finder.rb +0 -98
- data/lib/coltrane/guitar_note.rb +0 -50
- data/lib/coltrane/guitar_note_set.rb +0 -61
- data/lib/coltrane/guitar_representation.rb +0 -96
- data/lib/coltrane/guitar_string.rb +0 -52
- data/lib/coltrane/scale_cache.rb +0 -4
data/lib/coltrane/note.rb
CHANGED
@@ -1,7 +1,11 @@
|
|
1
1
|
module Coltrane
|
2
2
|
# It describes a musical note, independent of octave
|
3
|
+
|
3
4
|
class Note
|
4
|
-
|
5
|
+
include Multiton
|
6
|
+
|
7
|
+
attr_reader :name, :number
|
8
|
+
alias_method :id, :number
|
5
9
|
|
6
10
|
NOTES = {
|
7
11
|
'C' => 0,
|
@@ -23,52 +27,68 @@ module Coltrane
|
|
23
27
|
'B' => 11
|
24
28
|
}.freeze
|
25
29
|
|
30
|
+
def initialize(name)
|
31
|
+
@name, @number = name, NOTES[name]
|
32
|
+
end
|
33
|
+
|
34
|
+
private_class_method :new
|
35
|
+
|
36
|
+
def self.[](arg)
|
37
|
+
name =
|
38
|
+
case arg
|
39
|
+
when Note then return arg
|
40
|
+
when String then find_note(arg)
|
41
|
+
when Numeric then NOTES.key(arg % 12)
|
42
|
+
else raise InvalidNote.new("Wrong type: #{arg.class}")
|
43
|
+
end
|
44
|
+
|
45
|
+
new(name) || (raise InvalidNote.new("#{arg}"))
|
46
|
+
end
|
47
|
+
|
26
48
|
def self.all
|
27
|
-
|
49
|
+
%w[C C# D D# E F F# G G# A A# B].map { |n| Note[n] }
|
28
50
|
end
|
29
51
|
|
30
|
-
def
|
31
|
-
|
52
|
+
def self.find_note(str)
|
53
|
+
NOTES.each { |k, v| return k if str.casecmp?(k) }
|
54
|
+
nil
|
32
55
|
end
|
33
56
|
|
34
|
-
def
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
57
|
+
def pretty_name
|
58
|
+
@name.gsub('b',"\u266D").gsub('#',"\u266F")
|
59
|
+
end
|
60
|
+
|
61
|
+
alias_method :to_s, :name
|
62
|
+
|
63
|
+
def accident?
|
64
|
+
[1,3,6,8,10].include?(number)
|
41
65
|
end
|
42
66
|
|
43
67
|
def +(n)
|
44
68
|
case n
|
45
|
-
when
|
46
|
-
when
|
69
|
+
when Interval then Note[number + n.semitones]
|
70
|
+
when Numeric then Note[number + n]
|
71
|
+
when Note then Chord.new(number + n.number)
|
47
72
|
end
|
48
73
|
end
|
49
74
|
|
50
75
|
def -(n)
|
51
76
|
case n
|
52
|
-
when Numeric then Note.new(
|
53
|
-
when Note
|
77
|
+
when Numeric then Note.new(n - number)
|
78
|
+
when Note then Interval.new(n.number - number)
|
54
79
|
end
|
55
80
|
end
|
56
81
|
|
57
82
|
def valid_note?(note_name)
|
58
|
-
|
59
|
-
end
|
60
|
-
|
61
|
-
def number
|
62
|
-
NOTES[name]
|
83
|
+
find_note(note_name)
|
63
84
|
end
|
64
85
|
|
65
86
|
def interval_to(note_name)
|
66
|
-
|
87
|
+
Note[note_name] - self
|
67
88
|
end
|
68
89
|
|
69
|
-
def transpose_by(
|
70
|
-
|
71
|
-
self
|
90
|
+
def transpose_by(semitones)
|
91
|
+
self + semitones
|
72
92
|
end
|
73
93
|
|
74
94
|
def guitar_notes
|
@@ -88,11 +108,5 @@ module Coltrane
|
|
88
108
|
def in_guitar_string_region(guitar_string, region)
|
89
109
|
guitar_string.guitar_notes_for_note_in_region(self, region)
|
90
110
|
end
|
91
|
-
|
92
|
-
protected
|
93
|
-
|
94
|
-
def name_from_number(number)
|
95
|
-
NOTES.key(number % 12)
|
96
|
-
end
|
97
111
|
end
|
98
112
|
end
|
data/lib/coltrane/note_set.rb
CHANGED
@@ -1,17 +1,47 @@
|
|
1
1
|
module Coltrane
|
2
2
|
# It describes a set of notes
|
3
3
|
class NoteSet
|
4
|
+
extend Forwardable
|
5
|
+
|
6
|
+
def_delegators :@notes, :first, :each, :size, :map, :reduce, :index,
|
7
|
+
:[], :index, :empty?, :permutation, :include?
|
8
|
+
|
4
9
|
attr_reader :notes
|
5
10
|
|
11
|
+
alias_method :root, :first
|
12
|
+
alias_method :all, :notes
|
13
|
+
|
14
|
+
def self.[](*notes)
|
15
|
+
new(notes)
|
16
|
+
end
|
17
|
+
|
6
18
|
def initialize(arg)
|
7
|
-
@notes =
|
8
|
-
|
9
|
-
|
10
|
-
|
19
|
+
@notes =
|
20
|
+
case arg
|
21
|
+
when NoteSet then arg.notes
|
22
|
+
when Array then arg.map {|n| n.is_a?(Note) ? n : Note[n] }
|
23
|
+
else raise InvalidNotes.new(arg)
|
24
|
+
end
|
11
25
|
end
|
12
26
|
|
13
|
-
def
|
14
|
-
notes.
|
27
|
+
def &(another)
|
28
|
+
NoteSet[*(notes & another.notes)]
|
29
|
+
end
|
30
|
+
|
31
|
+
def degree(note)
|
32
|
+
index(note)+1
|
33
|
+
end
|
34
|
+
|
35
|
+
def +(other_noteset)
|
36
|
+
NoteSet[*(notes + other_noteset.notes)]
|
37
|
+
end
|
38
|
+
|
39
|
+
def pretty_names
|
40
|
+
map(&:pretty_name)
|
41
|
+
end
|
42
|
+
|
43
|
+
def names
|
44
|
+
map(&:name)
|
15
45
|
end
|
16
46
|
|
17
47
|
def transpose_to(note_name)
|
@@ -29,22 +59,7 @@ module Coltrane
|
|
29
59
|
end
|
30
60
|
|
31
61
|
def interval_sequence
|
32
|
-
IntervalSequence.new(self)
|
33
|
-
end
|
34
|
-
|
35
|
-
protected
|
36
|
-
|
37
|
-
def notes_from_note_string(note_string)
|
38
|
-
notes_from_note_array(note_string.split(' '))
|
39
|
-
end
|
40
|
-
|
41
|
-
def notes_from_note_array(note_array)
|
42
|
-
note_array.collect do |note|
|
43
|
-
case note
|
44
|
-
when String then Note.new(note)
|
45
|
-
when Note then note
|
46
|
-
end
|
47
|
-
end
|
62
|
+
IntervalSequence.new(notes: self)
|
48
63
|
end
|
49
64
|
end
|
50
65
|
end
|
@@ -1,58 +0,0 @@
|
|
1
|
-
module Coltrane
|
2
|
-
class PianoRepresentation
|
3
|
-
PIANO_TEMPLATE = <<~ASCII
|
4
|
-
┌─┬─┬┬─┬─╥─┬─┬┬─┬┬─┬─╥─┬─┬┬─┬─╥─┬─┬┬─┬┬─┬─┐
|
5
|
-
│ │ ││ │ ║ │ ││ ││ │ ║ │ ││ │ ║ │ ││ ││ │ │
|
6
|
-
│ │X││X│ ║ │X││X││X│ ║ │X││X│ ║ │X││X││X│ │
|
7
|
-
│ │X││X│ ║ │X││X││X│ ║ │X││X│ ║ │X││X││X│ │
|
8
|
-
│ ┕╥┙┕╥┙ ║ ┕╥┙┕╥┙┕╥┙ ║ ┕╥┙┕╥┙ ║ ┕╥┙┕╥┙┕╥┙ │
|
9
|
-
│XX║XX║XX║XX║XX║XX║XX║XX║XX║XX║XX║XX║XX║XX│
|
10
|
-
└──╨──╨──╨──╨──╨──╨──╨──╨──╨──╨──╨──╨──╨──┘
|
11
|
-
ASCII
|
12
|
-
|
13
|
-
class << self
|
14
|
-
def render_intervals(notes, ref_note)
|
15
|
-
output = place_black_notes(Paint[PIANO_TEMPLATE, 'gray'], notes, ref_note)
|
16
|
-
place_white_notes(output, notes, ref_note)
|
17
|
-
end
|
18
|
-
|
19
|
-
def place_white_notes(input, notes, ref_note)
|
20
|
-
white_notes = Scale.major.notes
|
21
|
-
i = 0
|
22
|
-
output_array = input.split("\n")
|
23
|
-
output_array[5].gsub!('XX') do |match|
|
24
|
-
note = white_notes[i%7]
|
25
|
-
interval_name = (note - ref_note).name
|
26
|
-
i += 1
|
27
|
-
notes.map(&:name).include?(note.name) ? Paint[interval_name, 'red'] : ' '
|
28
|
-
end
|
29
|
-
|
30
|
-
output_array.join("\n")
|
31
|
-
end
|
32
|
-
|
33
|
-
def place_black_notes(input, notes, ref_note)
|
34
|
-
black_notes = Scale.pentatonic_major('C#',4).notes
|
35
|
-
output_array = input.split("\n")
|
36
|
-
|
37
|
-
i = 0
|
38
|
-
output_array[2].gsub!('X') do |match|
|
39
|
-
note = black_notes[i%5]
|
40
|
-
interval_name = (note - ref_note).name
|
41
|
-
i += 1
|
42
|
-
notes.map(&:name).include?(note.name) ? Paint[interval_name[0], 'red'] : ' '
|
43
|
-
end
|
44
|
-
|
45
|
-
i = 0
|
46
|
-
output_array[3].gsub!('X') do |match|
|
47
|
-
note = black_notes[i%5]
|
48
|
-
interval_name = (black_notes[i%5] - ref_note).name
|
49
|
-
i += 1
|
50
|
-
notes.map(&:name).include?(note.name) ? Paint[interval_name[1], 'red'] : ' '
|
51
|
-
end
|
52
|
-
|
53
|
-
output_array.join("\n")
|
54
|
-
end
|
55
|
-
end
|
56
|
-
|
57
|
-
end
|
58
|
-
end
|
data/lib/coltrane/pitch.rb
CHANGED
@@ -13,15 +13,24 @@ module Coltrane
|
|
13
13
|
|
14
14
|
def number_from_name(pitch_string)
|
15
15
|
_, note, octaves = pitch_string.match(/(.*)(\d)/).to_a
|
16
|
-
Note
|
16
|
+
Note[note].number + 12 * octaves.to_i
|
17
17
|
end
|
18
18
|
|
19
19
|
def name
|
20
|
-
"#{note.name}#{
|
20
|
+
"#{note.name}#{octave}"
|
21
|
+
end
|
22
|
+
|
23
|
+
def octave
|
24
|
+
number / 12
|
21
25
|
end
|
22
26
|
|
23
27
|
def note
|
24
|
-
Note
|
28
|
+
Note[number]
|
29
|
+
end
|
30
|
+
|
31
|
+
def +(arg)
|
32
|
+
n = arg.is_a?(Pitch) ? arg.number : arg
|
33
|
+
Pitch.new(number + n)
|
25
34
|
end
|
26
35
|
end
|
27
36
|
end
|
data/lib/coltrane/progression.rb
CHANGED
@@ -1,4 +1,35 @@
|
|
1
1
|
module Coltrane
|
2
2
|
class Progression
|
3
|
+
extend ClassicProgressions
|
4
|
+
|
5
|
+
attr_reader :scale
|
6
|
+
|
7
|
+
def initialize(roman_notation, key: nil, scale: nil)
|
8
|
+
if !key.nil?
|
9
|
+
@scale = get_scale_from_key(key)
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
def chords
|
14
|
+
all_chords.values_at(*chord_indexes)
|
15
|
+
end
|
16
|
+
|
17
|
+
def on_guitar
|
18
|
+
chords.map(&:on_guitar)
|
19
|
+
end
|
20
|
+
|
21
|
+
def on_piano
|
22
|
+
chords.map(&:on_piano)
|
23
|
+
end
|
24
|
+
|
25
|
+
private
|
26
|
+
|
27
|
+
def all_chords
|
28
|
+
scale.sevenths
|
29
|
+
end
|
30
|
+
|
31
|
+
def chord_indexes
|
32
|
+
degrees.map { |d| d-1 }
|
33
|
+
end
|
3
34
|
end
|
4
35
|
end
|
data/lib/coltrane/qualities.rb
CHANGED
@@ -1,115 +1,116 @@
|
|
1
|
-
module
|
2
|
-
|
3
|
-
|
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
|
-
|
1
|
+
module Coltrane
|
2
|
+
module Qualities
|
3
|
+
CHORD_QUALITIES = {
|
4
|
+
"5" => [0, 7],
|
5
|
+
"Msus2" => [0, 2, 7],
|
6
|
+
"dim" => [0, 3, 6],
|
7
|
+
"m" => [0, 3, 7],
|
8
|
+
"m#5" => [0, 3, 8],
|
9
|
+
"Mb5" => [0, 4, 6],
|
10
|
+
"M" => [0, 4, 7],
|
11
|
+
"M#5" => [0, 4, 8],
|
12
|
+
"Mb6" => [0, 4, 8],
|
13
|
+
"7ndim5" => [0, 4, 10],
|
14
|
+
"Msus4" => [0, 5, 7],
|
15
|
+
"mb6b9" => [0, 1, 3, 8],
|
16
|
+
"addb9" => [0, 1, 4, 7],
|
17
|
+
"madd9" => [0, 2, 3, 7],
|
18
|
+
"Madd9" => [0, 2, 4, 7],
|
19
|
+
"sus24" => [0, 2, 5, 7],
|
20
|
+
"M#5add9" => [0, 2, 4, 8],
|
21
|
+
"9ndim5" => [0, 2, 4, 10],
|
22
|
+
"+add#9" => [0, 3, 4, 8],
|
23
|
+
"madd4" => [0, 3, 5, 7],
|
24
|
+
"4" => [0, 3, 5, 10],
|
25
|
+
"dim7" => [0, 3, 6, 9],
|
26
|
+
"m7" => [0, 3, 7, 10],
|
27
|
+
"mM7" => [0, 3, 7, 11],
|
28
|
+
"m7#5" => [0, 3, 8, 10],
|
29
|
+
"7b5" => [0, 4, 6, 10],
|
30
|
+
"7" => [0, 4, 7, 10],
|
31
|
+
"7#5" => [0, 4, 8, 10],
|
32
|
+
"7b13" => [0, 4, 8, 10],
|
33
|
+
"M7#5" => [0, 4, 8, 11],
|
34
|
+
"M7b6" => [0, 4, 8, 11],
|
35
|
+
"M7b5" => [0, 4, 6, 11],
|
36
|
+
"M7#5sus4" => [0, 5, 8, 11],
|
37
|
+
"7sus4" => [0, 5, 7, 10],
|
38
|
+
"7#5sus4" => [0, 5, 8, 10],
|
39
|
+
"M7sus4" => [0, 5, 7, 11],
|
40
|
+
"M6" => [0, 4, 7, 9],
|
41
|
+
"m7b5" => [0, 3, 6, 10],
|
42
|
+
"M7" => [0, 4, 7, 11],
|
43
|
+
"maj7" => [0, 4, 7, 11],
|
44
|
+
"mb6M7" => [0, 3, 8, 11],
|
45
|
+
"dimM7" => [0, 3, 6, 11],
|
46
|
+
"m6" => [0, 3, 5, 7, 9],
|
47
|
+
"m6/9" => [0, 2, 3, 7, 9],
|
48
|
+
"M6/9" => [0, 2, 4, 7, 9],
|
49
|
+
"M6#11" => [0, 4, 6, 7, 9],
|
50
|
+
"m7add11" => [0, 3, 5, 7, 10],
|
51
|
+
"dim7M7" => [0, 3, 6, 9, 11],
|
52
|
+
"m9" => [0, 2, 3, 7, 10],
|
53
|
+
"m9#5" => [0, 2, 3, 8, 10],
|
54
|
+
"m9b5" => [0, 2, 3, 6, 10],
|
55
|
+
"mM7b6" => [0, 3, 7, 8, 11],
|
56
|
+
"mM9" => [0, 2, 3, 7, 11],
|
57
|
+
"M7b9" => [0, 1, 4, 7, 11],
|
58
|
+
"M9" => [0, 2, 4, 7, 11],
|
59
|
+
"M9#5" => [0, 2, 4, 8, 11],
|
60
|
+
"M9#5sus4" => [0, 2, 5, 8, 11],
|
61
|
+
"M9b5" => [0, 2, 4, 6, 11],
|
62
|
+
"M9sus4" => [0, 2, 5, 7, 11],
|
63
|
+
"M7#11" => [0, 4, 6, 7, 11],
|
64
|
+
"7#9" => [0, 3, 4, 7, 10],
|
65
|
+
"7#11" => [0, 4, 6, 7, 10],
|
66
|
+
"11" => [0, 2, 5, 7, 10],
|
67
|
+
"11b9" => [0, 1, 5, 7, 10],
|
68
|
+
"13ndim5" => [0, 2, 4, 9, 10],
|
69
|
+
"7#5#9" => [0, 3, 4, 8, 10],
|
70
|
+
"7#5b9" => [0, 1, 4, 8, 10],
|
71
|
+
"7add6" => [0, 4, 7, 9, 10],
|
72
|
+
"7b6" => [0, 4, 7, 8, 10],
|
73
|
+
"7b9" => [0, 1, 4, 7, 10],
|
74
|
+
"7sus4b9" => [0, 1, 5, 7, 10],
|
75
|
+
"9" => [0, 2, 4, 7, 10],
|
76
|
+
"9#5" => [0, 2, 4, 8, 10],
|
77
|
+
"9b13" => [0, 2, 4, 8, 10],
|
78
|
+
"9b5" => [0, 2, 4, 6, 10],
|
79
|
+
"9sus4" => [0, 2, 5, 7, 10],
|
80
|
+
"M6/9#11" => [0, 2, 4, 6, 7, 9],
|
81
|
+
"6/9#11" => [0, 2, 4, 6, 7, 9],
|
82
|
+
"9#5#11" => [0, 2, 4, 6, 8, 10],
|
83
|
+
"Blues" => [0, 3, 5, 6, 7, 10],
|
84
|
+
"m11" => [0, 2, 3, 5, 7, 10],
|
85
|
+
"m11#5" => [0, 2, 3, 5, 8, 10],
|
86
|
+
"m11b5" => [0, 2, 3, 5, 6, 10],
|
87
|
+
"13b5" => [0, 2, 4, 6, 9, 10],
|
88
|
+
"13b9" => [0, 1, 4, 7, 9, 10],
|
89
|
+
"13sus4" => [0, 2, 5, 7, 9, 10],
|
90
|
+
"7#11b13" => [0, 4, 6, 7, 8, 10],
|
91
|
+
"7#5b9#11" => [0, 1, 4, 6, 8, 10],
|
92
|
+
"7#9#11" => [0, 3, 4, 6, 7, 10],
|
93
|
+
"7#9b13" => [0, 3, 4, 7, 8, 10],
|
94
|
+
"13#9" => [0, 3, 4, 7, 9, 10],
|
95
|
+
"13" => [0, 2, 4, 7, 9, 10],
|
96
|
+
"7b9#11" => [0, 1, 4, 6, 7, 10],
|
97
|
+
"7b9#9" => [0, 1, 3, 4, 7, 10],
|
98
|
+
"7b9b13" => [0, 1, 4, 7, 8, 10],
|
99
|
+
"7sus4b9b13" => [0, 1, 5, 7, 8, 10],
|
100
|
+
"9#11" => [0, 2, 4, 6, 7, 10],
|
101
|
+
"M13" => [0, 2, 4, 7, 9, 11],
|
102
|
+
"M7#9#11" => [0, 3, 4, 6, 7, 11],
|
103
|
+
"M7add13" => [0, 2, 4, 7, 9, 11],
|
104
|
+
"M9#11" => [0, 2, 4, 6, 7, 11],
|
105
|
+
"mM9b6" => [0, 2, 3, 7, 8, 11],
|
106
|
+
"7b9b13#11" => [0, 1, 4, 6, 7, 8, 10],
|
107
|
+
"13b9#11" => [0, 1, 4, 6, 7, 9, 10],
|
108
|
+
"9#11b13" => [0, 2, 4, 6, 7, 8, 10],
|
109
|
+
"13#11" => [0, 2, 4, 6, 7, 9, 10],
|
110
|
+
"M13#11" => [0, 2, 4, 6, 7, 9, 11],
|
111
|
+
"m13" => [0, 2, 3, 5, 7, 9, 10],
|
112
|
+
"13#9#11" => [0, 3, 4, 6, 7, 9, 10],
|
113
|
+
"7#9#11b13" => [0, 3, 4, 6, 7, 8, 10]
|
114
|
+
}
|
115
|
+
end
|
115
116
|
end
|