coltrane 0.0.2 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
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