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.
Files changed (64) hide show
  1. checksums.yaml +5 -5
  2. data/.gitignore +2 -0
  3. data/.ruby-version +1 -0
  4. data/Gemfile +15 -10
  5. data/Gemfile.lock +47 -128
  6. data/README.md +30 -8
  7. data/Rakefile +0 -4
  8. data/bin/bundle +105 -0
  9. data/bin/byebug +29 -0
  10. data/bin/coderay +12 -0
  11. data/bin/coltrane +25 -7
  12. data/bin/htmldiff +12 -0
  13. data/bin/kill-pry-rescue +12 -0
  14. data/bin/ldiff +12 -0
  15. data/bin/pry +12 -0
  16. data/bin/rake +12 -0
  17. data/bin/rescue +12 -0
  18. data/bin/rspec +12 -0
  19. data/bin/rubocop +12 -0
  20. data/bin/ruby-parse +12 -0
  21. data/bin/ruby-rewrite +12 -0
  22. data/exe/coltrane +173 -0
  23. data/lib/cli/bass_guitar.rb +9 -0
  24. data/lib/cli/chord.rb +24 -0
  25. data/lib/cli/errors.rb +28 -0
  26. data/lib/cli/guitar.rb +55 -0
  27. data/lib/cli/notes.rb +18 -0
  28. data/lib/cli/piano.rb +54 -0
  29. data/lib/cli/representation.rb +47 -0
  30. data/lib/cli/scale.rb +48 -0
  31. data/lib/cli/text.rb +13 -0
  32. data/lib/cli/ukulele.rb +11 -0
  33. data/lib/coltrane-cli.rb +12 -0
  34. data/lib/coltrane.rb +16 -31
  35. data/lib/coltrane/cache.rb +34 -0
  36. data/lib/coltrane/chord.rb +28 -41
  37. data/lib/coltrane/chord_quality.rb +14 -39
  38. data/lib/coltrane/classic_progressions.rb +37 -0
  39. data/lib/coltrane/classic_scales.rb +92 -118
  40. data/lib/coltrane/errors.rb +54 -0
  41. data/lib/coltrane/interval.rb +25 -17
  42. data/lib/coltrane/interval_sequence.rb +57 -27
  43. data/lib/coltrane/note.rb +44 -30
  44. data/lib/coltrane/note_set.rb +37 -22
  45. data/lib/coltrane/piano_representation.rb +0 -58
  46. data/lib/coltrane/pitch.rb +12 -3
  47. data/lib/coltrane/progression.rb +31 -0
  48. data/lib/coltrane/qualities.rb +115 -114
  49. data/lib/coltrane/roman_chord.rb +36 -0
  50. data/lib/coltrane/scale.rb +85 -77
  51. data/lib/coltrane/version.rb +1 -1
  52. data/lib/core_ext.rb +12 -0
  53. data/pkg/coltrane-0.0.2.gem +0 -0
  54. metadata +27 -14
  55. data/lib/coltrane/essential_guitar_chords.rb +0 -82
  56. data/lib/coltrane/fret_set.rb +0 -0
  57. data/lib/coltrane/guitar.rb +0 -15
  58. data/lib/coltrane/guitar_chord.rb +0 -50
  59. data/lib/coltrane/guitar_chord_finder.rb +0 -98
  60. data/lib/coltrane/guitar_note.rb +0 -50
  61. data/lib/coltrane/guitar_note_set.rb +0 -61
  62. data/lib/coltrane/guitar_representation.rb +0 -96
  63. data/lib/coltrane/guitar_string.rb +0 -52
  64. data/lib/coltrane/scale_cache.rb +0 -4
@@ -1,7 +1,11 @@
1
1
  module Coltrane
2
2
  # It describes a musical note, independent of octave
3
+
3
4
  class Note
4
- attr_reader :name
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
- NOTES.keys.map {|n| Note.new(n)}
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 accident?
31
- [1,3,6,8,10].include?(number)
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 initialize(arg)
35
- case arg
36
- when String
37
- raise "invalid note: #{arg}" unless valid_note?(arg)
38
- @name = arg
39
- when Numeric then @name = name_from_number(arg)
40
- end
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 Numeric then Note.new(number + n)
46
- when Note then Chord.new(number + n.number)
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(number + n)
53
- when Note then Interval.new((number - n.number) % 12)
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
- NOTES.key?(note_name)
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
- Interval.new(Note.new(note_name).number - number)
87
+ Note[note_name] - self
67
88
  end
68
89
 
69
- def transpose_by(interval_number)
70
- @name = name_from_number(number + interval_number)
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
@@ -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 = case arg
8
- when String then notes_from_note_string(arg)
9
- when Array then notes_from_note_array(arg)
10
- end
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 root_note
14
- notes.sort_by(&:number).first
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
@@ -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.new(note).number + 12 * octaves.to_i
16
+ Note[note].number + 12 * octaves.to_i
17
17
  end
18
18
 
19
19
  def name
20
- "#{note.name}#{number / 12}"
20
+ "#{note.name}#{octave}"
21
+ end
22
+
23
+ def octave
24
+ number / 12
21
25
  end
22
26
 
23
27
  def note
24
- Note.new(number)
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
@@ -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
@@ -1,115 +1,116 @@
1
- module Qualities
2
- CHORD_QUALITIES = {
3
- "5" => [0, 7],
4
- "Msus2" => [0, 2, 7],
5
- "dim" => [0, 3, 6],
6
- "m" => [0, 3, 7],
7
- "m#5" => [0, 3, 8],
8
- "Mb5" => [0, 4, 6],
9
- "M" => [0, 4, 7],
10
- "" => [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
- }
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