coltrane 1.0.11 → 1.0.20

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