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.
@@ -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
- '1P',
8
- '2m',
9
- '2M',
10
- '3m',
11
- '3M',
12
- '4P',
13
- '4A',
14
- '5P',
15
- '6m',
16
- '6M',
17
- '7m',
18
- '7M'
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
- when Interval then arg.semitones
24
- when String then NAMES.index(arg)
25
- when Numeric then arg
26
- end) % 12
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 +(x)
34
- case x
35
- when Numeric then Interval.new(semitones + x)
36
- when Interval then Interval.new(semitones + x.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 == 0
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
- self.shift(-intervals.first.semitones)
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
@@ -1,4 +1,5 @@
1
1
 
2
+ # frozen_string_literal: true
2
3
  # class IntervalSet
3
4
  # def initialize(*intervals)
4
5
  # @intervals = intervals
data/lib/coltrane/note.rb CHANGED
@@ -1,11 +1,12 @@
1
- module Coltrane
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
- alias_method :id, :number
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, @number = name, NOTES[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 raise InvalidNote.new("Wrong type: #{arg.class}")
44
+ else
45
+ raise InvalidNoteError, "Wrong type: #{arg.class}"
43
46
  end
44
47
 
45
- new(name) || (raise InvalidNote.new("#{arg}"))
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.each { |k, v| return k if str.casecmp?(k) }
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.gsub('b',"\u266D").gsub('#',"\u266F")
61
+ @name.tr('b', "\u266D").tr('#', "\u266F")
59
62
  end
60
63
 
61
- alias_method :to_s, :name
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 +(n)
68
- case n
69
- when Interval then Note[number + n.semitones]
70
- when Numeric then Note[number + n]
71
- when Note then Chord.new(number + n.number)
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 -(n)
76
- case n
77
- when Numeric then Note.new(n - number)
78
- when Note then Interval.new(n.number - number)
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
@@ -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
- alias_method :root, :first
12
- alias_method :all, :notes
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 InvalidNotes.new(arg)
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 &(another)
28
- NoteSet[*(notes & another.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 +(other_noteset)
36
- NoteSet[*(notes + other_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
@@ -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 +(arg)
32
- n = arg.is_a?(Pitch) ? arg.number : arg
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
@@ -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(roman_notation, key: nil, scale: nil)
8
- if !key.nil?
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
- def on_guitar
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
@@ -1,116 +1,118 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Coltrane
2
4
  module Qualities
3
5
  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
- }
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