jazz_model 0.1.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 (49) hide show
  1. data/CHANGELOG.rdoc +14 -0
  2. data/Gemfile +4 -0
  3. data/README.rdoc +186 -0
  4. data/Rakefile +14 -0
  5. data/lib/jazz_model.rb +34 -0
  6. data/lib/jazz_model/base.rb +15 -0
  7. data/lib/jazz_model/chord.rb +141 -0
  8. data/lib/jazz_model/chord_collection.rb +68 -0
  9. data/lib/jazz_model/chord_quality.rb +19 -0
  10. data/lib/jazz_model/chord_scale.rb +30 -0
  11. data/lib/jazz_model/chord_symbol.rb +27 -0
  12. data/lib/jazz_model/chord_symbol_collection.rb +17 -0
  13. data/lib/jazz_model/chord_tone.rb +32 -0
  14. data/lib/jazz_model/definition.rb +66 -0
  15. data/lib/jazz_model/definitions/default.rb +502 -0
  16. data/lib/jazz_model/definitions/keys.rb +48 -0
  17. data/lib/jazz_model/key.rb +49 -0
  18. data/lib/jazz_model/key_context.rb +28 -0
  19. data/lib/jazz_model/mode.rb +47 -0
  20. data/lib/jazz_model/mode_context.rb +32 -0
  21. data/lib/jazz_model/mode_sequence.rb +15 -0
  22. data/lib/jazz_model/note_sequence.rb +15 -0
  23. data/lib/jazz_model/notes_collection.rb +89 -0
  24. data/lib/jazz_model/scale.rb +136 -0
  25. data/lib/jazz_model/scale_tone.rb +24 -0
  26. data/lib/jazz_model/tone.rb +51 -0
  27. data/lib/jazz_model/tone_sequence.rb +62 -0
  28. data/lib/jazz_model/version.rb +3 -0
  29. data/lib/jazz_model/voicing.rb +12 -0
  30. data/lib/jazz_model/voicing_tone.rb +11 -0
  31. data/spec/chord_collection_spec.rb +21 -0
  32. data/spec/chord_quality_spec.rb +27 -0
  33. data/spec/chord_scale_spec.rb +7 -0
  34. data/spec/chord_spec.rb +29 -0
  35. data/spec/chord_symbol_spec.rb +6 -0
  36. data/spec/chord_tone_spec.rb +6 -0
  37. data/spec/definition_spec.rb +35 -0
  38. data/spec/key_context_spec.rb +27 -0
  39. data/spec/key_spec.rb +15 -0
  40. data/spec/mode_spec.rb +9 -0
  41. data/spec/notes_collection_spec.rb +25 -0
  42. data/spec/scale_spec.rb +42 -0
  43. data/spec/scale_tone_spec.rb +6 -0
  44. data/spec/spec_helper.rb +12 -0
  45. data/spec/tone_sequence_spec.rb +17 -0
  46. data/spec/tone_spec.rb +4 -0
  47. data/spec/voicing_spec.rb +6 -0
  48. data/spec/voicing_tone_spec.rb +6 -0
  49. metadata +194 -0
@@ -0,0 +1,19 @@
1
+ module JazzModel
2
+ # A basic chord quality such as major or minor. This may be abandoned in the future in favor of a
3
+ # deep heirarchy based soley around chords.
4
+ #
5
+ # == Associations
6
+ # * +chords+ - A collection of chords associated with the chord quality.
7
+ #
8
+ class ChordQuality < JazzModel::Base
9
+ has_many :chords
10
+
11
+ class << self
12
+ def resolve(name)
13
+ self.find_by_name(name)
14
+ end
15
+ alias_method :[], :resolve
16
+ end
17
+
18
+ end
19
+ end
@@ -0,0 +1,30 @@
1
+ module JazzModel
2
+ # A relationship of one chord to one scale, with some other optional
3
+ # information such as +strength+, representing the strength of the
4
+ # relationships.
5
+ #
6
+ # == Associations
7
+ #
8
+ # * +chord+ - Associated chord.
9
+ # * +mode+ - Associated scale mode.
10
+ # * +scale+ - Associated scale through mode.
11
+ #
12
+ # == Key Context
13
+ #
14
+ # Delegates +key+ to the associated chord to access key context through this relationship.
15
+ #
16
+ class ChordScale < JazzModel::Base
17
+ belongs_to :chord
18
+ belongs_to :mode
19
+
20
+ delegate :scale, :to => :mode
21
+ delegate :key, :to => :chord
22
+
23
+ def self.specify(mode, strength = 1)
24
+ chord_scale = self.new
25
+ chord_scale.mode = mode
26
+ chord_scale.strength = strength
27
+ chord_scale
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,27 @@
1
+ module JazzModel
2
+ # A standard chord symbol (if there is such a thing...).
3
+ # Several chord symbols can be associated with a given chord,
4
+ # and each chord can be designated +case_sensitive+ or not, to handle
5
+ # cases such as M representing Major and m representing minor.
6
+ # Act as a list to facilitate preference ordering. May abandong this
7
+ # in the future to prefer a simple +primary+ designation.
8
+ #
9
+ # == Associations
10
+ #
11
+ # * +chord+ - Chord associated with the chord symbol.
12
+ #
13
+ class ChordSymbol < JazzModel::Base
14
+ belongs_to :chord
15
+
16
+ class << self
17
+ # Finds a chord symbol
18
+ def resolve(symbol)
19
+ self.all.detect do |cs|
20
+ cs.case_sensitive? ? (cs.name == symbol) : (cs.name.downcase == symbol.downcase)
21
+ end
22
+ end
23
+ alias_method :[], :resolve
24
+ end
25
+
26
+ end
27
+ end
@@ -0,0 +1,17 @@
1
+ module JazzModel
2
+ # Module mixin for Chord symbols
3
+ module ChordSymbolCollection
4
+
5
+ # WARNING: This is basically duplicated from ChordSymbol
6
+ # Find way to make this DRY!
7
+ #
8
+ # Finds a chord symbol
9
+ def resolve(symbol)
10
+ self.detect do |cs|
11
+ cs.case_sensitive? ? (cs.name == symbol) : (cs.name.downcase == symbol.downcase)
12
+ end
13
+ end
14
+ alias_method :[], :resolve
15
+
16
+ end
17
+ end
@@ -0,0 +1,32 @@
1
+ module JazzModel
2
+ # Represents one non-octval tone in a chord. Chord tones are not ordered
3
+ # and arrays of chord tones should be compared using +to_set+.
4
+ #
5
+ # == Attributes
6
+ #
7
+ # * +tone+ - A tone index from 0-11 representing the relative position of the
8
+ # tone within the chromatic scale.
9
+ #
10
+ # * +letter_index+ - A 0-6 value representing the relative letter position, which
11
+ # helps to disambiguate theoretic values such as Eb and D#. See +Key+.
12
+ #
13
+ # * +strength+ - A strength metric representing the tonal strength of the tone
14
+ # within the context of the chord. Lower numbers are stronger. Zero always
15
+ # represents the root of the chord and any guide tones should be defined as one.
16
+ #
17
+ # * +omitable+ - Specifies whether the tone can commonly be ommitted in jazz voicings
18
+ # for this chord. For example, the root and the fifth are often not necessary.
19
+ #
20
+ # == Key Context
21
+ #
22
+ # +key+ is delgated to chord to access the chord's key context.
23
+ #
24
+ class ChordTone < Tone
25
+ belongs_to :chord
26
+
27
+ acts_as_list :scope => :chord
28
+
29
+ delegate :key, :to => :chord
30
+
31
+ end
32
+ end
@@ -0,0 +1,66 @@
1
+ module JazzModel
2
+ class Definition
3
+ cattr_accessor :definitions
4
+ @@definitions = []
5
+
6
+ attr_reader :name
7
+ attr_reader :definition
8
+ attr_reader :included_definitions
9
+
10
+ def initialize(name = nil, &block)
11
+ if name.is_a?(Hash)
12
+ raise ArgumentError, "Only one hash key expected" if name.keys.size > 1
13
+ @name = name.keys[0]
14
+ @included_definitions = name.values[0].is_a?(Array) ? name.values[0].map(&:to_sym) : [name.values[0].to_sym]
15
+ else
16
+ @name = name
17
+ @included_definitions = []
18
+ end
19
+
20
+ @definition = block
21
+ @loaded = false
22
+
23
+ @@definitions << self
24
+ end
25
+
26
+ def loaded?
27
+ !!@loaded
28
+ end
29
+
30
+ def self.[](name)
31
+ definitions.find {|d| d.name.to_s == name.to_s }
32
+ end
33
+
34
+ def self.define(name, &block)
35
+ definition = self.new(name, &block)
36
+ end
37
+
38
+ def self.load(name)
39
+ if definition = self[name]
40
+ definition.load
41
+ else
42
+ raise ArgumentError, "No definition known '#{name}'."
43
+ end
44
+ end
45
+
46
+ def ensure_loaded
47
+ load unless loaded?
48
+ end
49
+
50
+ def load
51
+ (all_included_definitions.uniq - [self]).each do |d|
52
+ self.class[d].ensure_loaded
53
+ end
54
+
55
+ instance_eval(&@definition)
56
+
57
+ @loaded = true
58
+ end
59
+
60
+ def all_included_definitions
61
+ (@included_definitions.map {|d| self.class[d].try(:all_included_definitions) } + @included_definitions).flatten.compact.uniq
62
+ end
63
+ end
64
+ end
65
+
66
+ Dir[File.join(File.dirname(__FILE__), "definitions", "*.rb")].each {|f| require f}
@@ -0,0 +1,502 @@
1
+ JazzModel::Definition.define :default => [:keys] do
2
+ JazzModel::Scale.create!(:name => 'Major').tap do |s|
3
+ s.tones.create([
4
+ {:tone => 0, :letter_index => JazzModel::Tone::LetterInterval::FIRST},
5
+ {:tone => 2, :letter_index => JazzModel::Tone::LetterInterval::SECOND},
6
+ {:tone => 4, :letter_index => JazzModel::Tone::LetterInterval::THIRD},
7
+ {:tone => 5, :letter_index => JazzModel::Tone::LetterInterval::FOURTH},
8
+ {:tone => 7, :letter_index => JazzModel::Tone::LetterInterval::FIFTH},
9
+ {:tone => 9, :letter_index => JazzModel::Tone::LetterInterval::SIXTH},
10
+ {:tone => 11, :letter_index => JazzModel::Tone::LetterInterval::SEVENTH}
11
+ ])
12
+
13
+ s.modes.create!(:mode => 1, :name => 'Ionian')
14
+ s.modes.create!(:mode => 2, :name => 'Dorian')
15
+ s.modes.create!(:mode => 3, :name => 'Phrygian')
16
+ s.modes.create!(:mode => 4, :name => 'Lydian')
17
+ s.modes.create!(:mode => 5, :name => 'Mixolydian')
18
+ s.modes.create!(:name => 6, :name => 'Aeolian')
19
+ s.modes.create!(:name => 7, :name => 'Locrian')
20
+ end
21
+
22
+ JazzModel::Scale.create!(:name => 'Melodic Minor').tap do |s|
23
+ s.tones.create([
24
+ {:tone => 0, :letter_index => JazzModel::Tone::LetterInterval::FIRST},
25
+ {:tone => 2, :letter_index => JazzModel::Tone::LetterInterval::SECOND},
26
+ {:tone => 3, :letter_index => JazzModel::Tone::LetterInterval::THIRD},
27
+ {:tone => 5, :letter_index => JazzModel::Tone::LetterInterval::FOURTH},
28
+ {:tone => 7, :letter_index => JazzModel::Tone::LetterInterval::FIFTH},
29
+ {:tone => 9, :letter_index => JazzModel::Tone::LetterInterval::SIXTH},
30
+ {:tone => 11, :letter_index => JazzModel::Tone::LetterInterval::SEVENTH}
31
+ ])
32
+
33
+ s.modes.create!(:mode => 1, :name => 'Melodic Minor')
34
+ s.modes.create!(:mode => 2, :name => 'Phrygian #6', :synonyms => 'Dorian b2')
35
+ s.modes.create!(:mode => 3, :name => 'Lydian Augmented')
36
+ s.modes.create!(:mode => 4, :name => 'Lydian Dominant', :synonyms => 'Mixolydian #4')
37
+ s.modes.create!(:mode => 5, :name => 'Mixolydian b6')
38
+ s.modes.create!(:name => 6, :name => 'Locrian #2', :synonyms => 'Aeolian b5')
39
+ s.modes.create!(:name => 7, :name => 'Super Locrian', :synonyms => 'Diminished Whole Tone')
40
+ end
41
+
42
+ JazzModel::Scale.create!(:name => 'Whole Tone', :symmetry_index => 2).tap do |s|
43
+ s.tones.create([
44
+ {:tone => 0, :letter_index => JazzModel::Tone::LetterInterval::FIRST},
45
+ {:tone => 2, :letter_index => JazzModel::Tone::LetterInterval::SECOND},
46
+ {:tone => 4, :letter_index => JazzModel::Tone::LetterInterval::THIRD},
47
+ {:tone => 6, :letter_index => JazzModel::Tone::LetterInterval::FOURTH},
48
+ {:tone => 8, :letter_index => JazzModel::Tone::LetterInterval::FIFTH},
49
+ {:tone => 10, :letter_index => JazzModel::Tone::LetterInterval::SEVENTH}
50
+ ])
51
+
52
+ s.modes.create!(:mode => 1, :name => 'Whole Tone')
53
+ end
54
+
55
+ JazzModel::Scale.create!(:name => 'Pentatonic').tap do |s|
56
+ s.tones.create([
57
+ {:tone => 0, :letter_index => JazzModel::Tone::LetterInterval::FIRST},
58
+ {:tone => 2, :letter_index => JazzModel::Tone::LetterInterval::SECOND},
59
+ {:tone => 4, :letter_index => JazzModel::Tone::LetterInterval::THIRD},
60
+ {:tone => 7, :letter_index => JazzModel::Tone::LetterInterval::FIFTH},
61
+ {:tone => 9, :letter_index => JazzModel::Tone::LetterInterval::SIXTH}
62
+ ])
63
+
64
+ s.modes.create!(:mode => 1, :name => 'Pentatonic')
65
+ end
66
+
67
+ JazzModel::Scale.create!(:name => 'Blues').tap do |s|
68
+ s.tones.create([
69
+ {:tone => 0, :letter_index => JazzModel::Tone::LetterInterval::FIRST},
70
+ {:tone => 2, :letter_index => JazzModel::Tone::LetterInterval::SECOND},
71
+ {:tone => 3, :letter_index => JazzModel::Tone::LetterInterval::THIRD},
72
+ {:tone => 4, :letter_index => JazzModel::Tone::LetterInterval::THIRD},
73
+ {:tone => 7, :letter_index => JazzModel::Tone::LetterInterval::FIFTH},
74
+ {:tone => 9, :letter_index => JazzModel::Tone::LetterInterval::SIXTH}
75
+ ])
76
+
77
+ s.modes.create!(:mode => 1, :name => 'Major Blues')
78
+ s.modes.create!(:mode => 5, :name => 'Minor Blues')
79
+ end
80
+
81
+ JazzModel::Scale.create!(:name => 'Diminished', :symmetry_index => 3).tap do |s|
82
+ s.tones.create([
83
+ {:tone => 0, :letter_index => JazzModel::Tone::LetterInterval::FIRST},
84
+ {:tone => 1, :letter_index => JazzModel::Tone::LetterInterval::SECOND},
85
+ {:tone => 3, :letter_index => JazzModel::Tone::LetterInterval::THIRD},
86
+ {:tone => 4, :letter_index => JazzModel::Tone::LetterInterval::THIRD},
87
+ {:tone => 6, :letter_index => JazzModel::Tone::LetterInterval::FOURTH},
88
+ {:tone => 7, :letter_index => JazzModel::Tone::LetterInterval::FIFTH},
89
+ {:tone => 9, :letter_index => JazzModel::Tone::LetterInterval::SIXTH},
90
+ {:tone => 10, :letter_index => JazzModel::Tone::LetterInterval::SEVENTH}
91
+ ])
92
+
93
+ s.modes.create!(:mode => 1, :name => 'Half-Whole')
94
+ s.modes.create!(:mode => 2, :name => 'Whole-Half')
95
+ end
96
+
97
+ JazzModel::Scale.create!(:name => 'Harmonic Minor').tap do |s|
98
+ s.tones.create([
99
+ {:tone => 0, :letter_index => JazzModel::Tone::LetterInterval::FIRST},
100
+ {:tone => 2, :letter_index => JazzModel::Tone::LetterInterval::SECOND},
101
+ {:tone => 3, :letter_index => JazzModel::Tone::LetterInterval::THIRD},
102
+ {:tone => 5, :letter_index => JazzModel::Tone::LetterInterval::FOURTH},
103
+ {:tone => 7, :letter_index => JazzModel::Tone::LetterInterval::FIFTH},
104
+ {:tone => 8, :letter_index => JazzModel::Tone::LetterInterval::SIXTH},
105
+ {:tone => 11, :letter_index => JazzModel::Tone::LetterInterval::SEVENTH}
106
+ ])
107
+ end
108
+
109
+ JazzModel::Scale.create!(:name => 'Bebop').tap do |s|
110
+ s.tones.create([
111
+ {:tone => 0, :letter_index => JazzModel::Tone::LetterInterval::FIRST},
112
+ {:tone => 2, :letter_index => JazzModel::Tone::LetterInterval::SECOND},
113
+ {:tone => 4, :letter_index => JazzModel::Tone::LetterInterval::THIRD},
114
+ {:tone => 5, :letter_index => JazzModel::Tone::LetterInterval::FOURTH},
115
+ {:tone => 7, :letter_index => JazzModel::Tone::LetterInterval::FIFTH},
116
+ {:tone => 9, :letter_index => JazzModel::Tone::LetterInterval::SIXTH},
117
+ {:tone => 10, :letter_index => JazzModel::Tone::LetterInterval::SEVENTH},
118
+ {:tone => 11, :letter_index => JazzModel::Tone::LetterInterval::SEVENTH}
119
+ ])
120
+
121
+ s.modes.create!(:mode => 1, :name => 'Dominant Bebop')
122
+ s.modes.create!(:mode => 2, :name => 'Major Bebop')
123
+ end
124
+
125
+
126
+ ##### Initialize Chords #####
127
+
128
+ JazzModel::ChordQuality.create!(:name => 'Major', :code => 'MAJ').tap do |q|
129
+ q.chords.create!(:name => 'Major Triad').tap do |c|
130
+ c.symbols.create!(:name => 'maj', :primary => true)
131
+ c.symbols.create!(:name => 'M', :case_sensitive => true)
132
+ c.symbols.create!(:name => 'major')
133
+
134
+ c.tones.create([
135
+ {:tone => JazzModel::Tone::Interval::ROOT, :letter_index => JazzModel::Tone::LetterInterval::FIRST, :strength => 0},
136
+ {:tone => JazzModel::Tone::Interval::MAJOR_3RD, :letter_index => JazzModel::Tone::LetterInterval::THIRD, :strength => 2},
137
+ {:tone => JazzModel::Tone::Interval::PERFECT_5TH, :letter_index => JazzModel::Tone::LetterInterval::FIFTH, :strength => 1}
138
+ ])
139
+
140
+ c.chord_scales << JazzModel::ChordScale.specify(JazzModel::Scale['Major'][1])
141
+ end
142
+
143
+ q.chords.create!(:name => 'Major 7').tap do |c|
144
+ c.symbols.create!(:name => 'maj7', :primary => true)
145
+ c.symbols.create!(:name => 'M7', :case_sensitive => true)
146
+ c.symbols.create!(:name => 'major7')
147
+
148
+ c.tones.create([
149
+ {:tone => JazzModel::Tone::Interval::ROOT, :letter_index => JazzModel::Tone::LetterInterval::FIRST, :strength => 0, :omitable => true},
150
+ {:tone => JazzModel::Tone::Interval::MAJOR_3RD, :letter_index => JazzModel::Tone::LetterInterval::THIRD, :strength => 1},
151
+ {:tone => JazzModel::Tone::Interval::PERFECT_5TH, :letter_index => JazzModel::Tone::LetterInterval::FIFTH, :strength => 2, :omitable => true},
152
+ {:tone => JazzModel::Tone::Interval::MAJOR_7TH, :letter_index => JazzModel::Tone::LetterInterval::SEVENTH, :strength => 2}
153
+ ])
154
+
155
+ c.children.create!(:name => 'Major 7 #11').tap do |cc|
156
+ cc.symbols.create!(:name => 'maj7#11', :primary => true)
157
+ cc.symbols.create!(:name => 'M7#11')
158
+ cc.symbols.create!(:name => 'major7#11')
159
+ cc.symbols.create!(:name => 'lyd')
160
+ cc.symbols.create!(:name => 'lydian')
161
+
162
+ cc.tones.create([
163
+ {:tone => JazzModel::Tone::Interval::ROOT, :letter_index => JazzModel::Tone::LetterInterval::FIRST, :strength => 0, :omitable => true},
164
+ {:tone => JazzModel::Tone::Interval::MAJOR_3RD, :letter_index => JazzModel::Tone::LetterInterval::THIRD, :strength => 1},
165
+ {:tone => JazzModel::Tone::Interval::PERFECT_5TH, :letter_index => JazzModel::Tone::LetterInterval::FIFTH, :strength => 2, :omitable => true},
166
+ {:tone => JazzModel::Tone::Interval::MAJOR_7TH, :letter_index => JazzModel::Tone::LetterInterval::SEVENTH, :strength => 2},
167
+ {:tone => JazzModel::Tone::Interval::AUGMENTED_4TH, :letter_index => JazzModel::Tone::LetterInterval::FOURTH, :strength => 3}
168
+ ])
169
+
170
+ cc.chord_scales << JazzModel::ChordScale.specify(JazzModel::Scale['Major'][4])
171
+ end
172
+
173
+ c.children.create!(:name => 'Lydian Augmented').tap do |cc|
174
+ cc.symbols.create!(:name => 'maj7#4#5', :primary => true)
175
+ cc.symbols.create!(:name => 'lydaug')
176
+ cc.symbols.create!(:name => 'maj7#11#5')
177
+
178
+ cc.tones.create([
179
+ {:tone => JazzModel::Tone::Interval::ROOT, :letter_index => JazzModel::Tone::LetterInterval::FIRST, :strength => 0, :omitable => true},
180
+ {:tone => JazzModel::Tone::Interval::MAJOR_3RD, :letter_index => JazzModel::Tone::LetterInterval::THIRD, :strength => 1},
181
+ {:tone => JazzModel::Tone::Interval::AUGMENTED_5TH, :letter_index => JazzModel::Tone::LetterInterval::FIFTH, :strength => 2, :omitable => true},
182
+ {:tone => JazzModel::Tone::Interval::MAJOR_7TH, :letter_index => JazzModel::Tone::LetterInterval::SEVENTH, :strength => 2},
183
+ {:tone => JazzModel::Tone::Interval::AUGMENTED_4TH, :letter_index => JazzModel::Tone::LetterInterval::FOURTH, :strength => 3}
184
+ ])
185
+
186
+ cc.chord_scales << JazzModel::ChordScale.specify(JazzModel::Scale['Melodic Minor'][3])
187
+ end
188
+
189
+ c.chord_scales << JazzModel::ChordScale.specify(JazzModel::Scale['Major'][1])
190
+ end
191
+
192
+ q.chords.create!(:name => 'Major 6').tap do |c|
193
+ c.symbols.create!(:name => '6', :primary => true)
194
+ c.symbols.create!(:name => 'maj6')
195
+ c.symbols.create!(:name => 'M6', :case_sensitive => true)
196
+ c.symbols.create!(:name => 'major6')
197
+
198
+ c.tones.create([
199
+ {:tone => JazzModel::Tone::Interval::ROOT, :letter_index => JazzModel::Tone::LetterInterval::FIRST, :strength => 0},
200
+ {:tone => JazzModel::Tone::Interval::MAJOR_3RD, :letter_index => JazzModel::Tone::LetterInterval::THIRD, :strength => 1},
201
+ {:tone => JazzModel::Tone::Interval::PERFECT_5TH, :letter_index => JazzModel::Tone::LetterInterval::FIFTH, :strength => 2},
202
+ {:tone => JazzModel::Tone::Interval::MAJOR_6TH, :letter_index => JazzModel::Tone::LetterInterval::SIXTH, :strength => 3}
203
+ ])
204
+
205
+ c.chord_scales << JazzModel::ChordScale.specify(JazzModel::Scale['Pentatonic'][1])
206
+ c.chord_scales << JazzModel::ChordScale.specify(JazzModel::Scale['Major'][1], 2)
207
+ end
208
+ end
209
+
210
+
211
+ JazzModel::ChordQuality.create!(:name => 'Minor', :code => 'MIN').tap do |q|
212
+ q.chords.create!(:name => 'Minor Triad').tap do |c|
213
+ c.symbols.create!(:name => 'min', :primary => true)
214
+ c.symbols.create!(:name => 'm', :case_sensitive => true)
215
+ c.symbols.create!(:name => 'minor')
216
+
217
+ c.tones.create([
218
+ {:tone => JazzModel::Tone::Interval::ROOT, :letter_index => JazzModel::Tone::LetterInterval::FIRST, :strength => 0},
219
+ {:tone => JazzModel::Tone::Interval::MINOR_3RD, :letter_index => JazzModel::Tone::LetterInterval::THIRD, :strength => 1},
220
+ {:tone => JazzModel::Tone::Interval::PERFECT_5TH, :letter_index => JazzModel::Tone::LetterInterval::FIFTH, :strength => 2}
221
+ ])
222
+
223
+ c.chord_scales << JazzModel::ChordScale.specify(JazzModel::Scale['Major'][2])
224
+ c.chord_scales << JazzModel::ChordScale.specify(JazzModel::Scale['Major'][6], 2)
225
+ c.chord_scales << JazzModel::ChordScale.specify(JazzModel::Scale['Major'][3], 3)
226
+ end
227
+
228
+ q.chords.create!(:name => 'Minor 7').tap do |c|
229
+ c.symbols.create!(:name => 'min7', :primary => true)
230
+ c.symbols.create!(:name => 'm7', :case_sensitive => true)
231
+ c.symbols.create!(:name => 'minor7')
232
+
233
+ c.tones.create([
234
+ {:tone => JazzModel::Tone::Interval::ROOT, :letter_index => JazzModel::Tone::LetterInterval::FIRST, :strength => 0, :omitable => true},
235
+ {:tone => JazzModel::Tone::Interval::MINOR_3RD, :letter_index => JazzModel::Tone::LetterInterval::THIRD, :strength => 1},
236
+ {:tone => JazzModel::Tone::Interval::PERFECT_5TH, :letter_index => JazzModel::Tone::LetterInterval::FIFTH, :strength => 2, :omitable => true},
237
+ {:tone => JazzModel::Tone::Interval::MINOR_7TH, :letter_index => JazzModel::Tone::LetterInterval::SEVENTH, :strength => 1}
238
+ ])
239
+
240
+ c.chord_scales << JazzModel::ChordScale.specify(JazzModel::Scale['Major'][2])
241
+ c.chord_scales << JazzModel::ChordScale.specify(JazzModel::Scale['Major'][6], 2)
242
+ end
243
+
244
+ q.chords.create!(:name => 'Minor 6').tap do |c|
245
+ c.symbols.create!(:name => 'min6', :primary => true)
246
+ c.symbols.create!(:name => 'm6', :case_sensitive => true)
247
+ c.symbols.create!(:name => 'minor6')
248
+
249
+ c.tones.create([
250
+ {:tone => JazzModel::Tone::Interval::ROOT, :letter_index => JazzModel::Tone::LetterInterval::FIRST, :strength => 0, :omitable => true},
251
+ {:tone => JazzModel::Tone::Interval::MINOR_3RD, :letter_index => JazzModel::Tone::LetterInterval::THIRD, :strength => 1},
252
+ {:tone => JazzModel::Tone::Interval::PERFECT_5TH, :letter_index => JazzModel::Tone::LetterInterval::FIFTH, :strength => 2},
253
+ {:tone => JazzModel::Tone::Interval::MAJOR_6TH, :letter_index => JazzModel::Tone::LetterInterval::SIXTH, :strength => 1}
254
+ ])
255
+
256
+ c.chord_scales << JazzModel::ChordScale.specify(JazzModel::Scale['Major'][1])
257
+ end
258
+
259
+ q.chords.create!(:name => 'Phrygian').tap do |c|
260
+ c.symbols.create!(:name => 'phryg', :primary => true)
261
+ c.symbols.create!(:name => 'minb2')
262
+ c.symbols.create!(:name => 'mb2')
263
+ c.symbols.create!(:name => 'minorb2')
264
+ c.symbols.create!(:name => 'phrygian')
265
+ c.symbols.create!(:name => 'susb9')
266
+
267
+ c.tones.create([
268
+ {:tone => JazzModel::Tone::Interval::ROOT, :letter_index => JazzModel::Tone::LetterInterval::FIRST, :strength => 0, :omitable => true},
269
+ {:tone => JazzModel::Tone::Interval::MINOR_3RD, :letter_index => JazzModel::Tone::LetterInterval::THIRD, :strength => 1},
270
+ {:tone => JazzModel::Tone::Interval::PERFECT_5TH, :letter_index => JazzModel::Tone::LetterInterval::FIFTH, :strength => 2},
271
+ {:tone => JazzModel::Tone::Interval::MINOR_2ND, :letter_index => JazzModel::Tone::LetterInterval::SECOND, :strength => 1},
272
+ {:tone => JazzModel::Tone::Interval::MINOR_6TH, :letter_index => JazzModel::Tone::LetterInterval::SIXTH, :strength => 3}
273
+ ])
274
+
275
+ c.chord_scales << JazzModel::ChordScale.specify(JazzModel::Scale['Major'][3])
276
+ end
277
+
278
+ q.chords.create!(:name => 'Minor b6').tap do |c|
279
+ c.symbols.create!(:name => 'minb6', :primary => true)
280
+ c.symbols.create!(:name => 'mb6')
281
+ c.symbols.create!(:name => 'minorb6')
282
+ c.symbols.create!(:name => 'aeolian')
283
+
284
+ c.tones.create([
285
+ {:tone => JazzModel::Tone::Interval::ROOT, :letter_index => JazzModel::Tone::LetterInterval::FIRST, :strength => 0, :omitable => true},
286
+ {:tone => JazzModel::Tone::Interval::MINOR_3RD, :letter_index => JazzModel::Tone::LetterInterval::THIRD, :strength => 1},
287
+ {:tone => JazzModel::Tone::Interval::PERFECT_5TH, :letter_index => JazzModel::Tone::LetterInterval::FIFTH, :strength => 2},
288
+ {:tone => JazzModel::Tone::Interval::MINOR_6TH, :letter_index => JazzModel::Tone::LetterInterval::SIXTH, :strength => 3}
289
+ ])
290
+
291
+ c.chord_scales << JazzModel::ChordScale.specify(JazzModel::Scale['Major'][6])
292
+ end
293
+
294
+ q.chords.create!(:name => 'Major-Minor').tap do |c|
295
+ c.symbols.create!(:name => 'min#7', :primary => true)
296
+ c.symbols.create!(:name => 'majmin')
297
+ c.symbols.create!(:name => 'm#7', :case_sensitive => true)
298
+ c.symbols.create!(:name => 'minor#7')
299
+ c.symbols.create!(:name => 'major-minor')
300
+
301
+ c.tones.create([
302
+ {:tone => JazzModel::Tone::Interval::ROOT, :letter_index => JazzModel::Tone::LetterInterval::FIRST, :strength => 0, :omitable => true},
303
+ {:tone => JazzModel::Tone::Interval::MINOR_3RD, :letter_index => JazzModel::Tone::LetterInterval::THIRD, :strength => 1},
304
+ {:tone => JazzModel::Tone::Interval::PERFECT_5TH, :letter_index => JazzModel::Tone::LetterInterval::FIFTH, :strength => 2},
305
+ {:tone => JazzModel::Tone::Interval::MAJOR_7TH, :letter_index => JazzModel::Tone::LetterInterval::SEVENTH, :strength => 1}
306
+ ])
307
+
308
+ c.chord_scales << JazzModel::ChordScale.specify(JazzModel::Scale['Melodic Minor'][1])
309
+ end
310
+ end
311
+
312
+
313
+ JazzModel::ChordQuality.create!(:name => 'Dominant', :code => 'DOM').tap do |q|
314
+ q.chords.create!(:name => 'Dominant 7').tap do |c|
315
+ c.symbols.create!(:name => '7', :primary => true)
316
+ c.symbols.create!(:name => 'dom')
317
+
318
+ c.tones.create([
319
+ {:tone => JazzModel::Tone::Interval::ROOT, :letter_index => JazzModel::Tone::LetterInterval::FIRST, :strength => 0, :omitable => true},
320
+ {:tone => JazzModel::Tone::Interval::MAJOR_3RD, :letter_index => JazzModel::Tone::LetterInterval::THIRD, :strength => 1},
321
+ {:tone => JazzModel::Tone::Interval::PERFECT_5TH, :letter_index => JazzModel::Tone::LetterInterval::FIFTH, :strength => 3, :omitable => true},
322
+ {:tone => JazzModel::Tone::Interval::DOMINANT_7TH, :letter_index => JazzModel::Tone::LetterInterval::SEVENTH, :strength => 2}
323
+ ])
324
+
325
+ c.chord_scales << JazzModel::ChordScale.specify(JazzModel::Scale['Major']['Mixolydian'])
326
+
327
+ c.children.create!(:name => 'Dominant 9').tap do |cc|
328
+ cc.symbols.create!(:name => '9', :primary => true)
329
+ cc.symbols.create!(:name => 'dom9')
330
+
331
+ cc.tones.create([
332
+ {:tone => JazzModel::Tone::Interval::ROOT, :letter_index => JazzModel::Tone::LetterInterval::FIRST, :strength => 0, :omitable => true},
333
+ {:tone => JazzModel::Tone::Interval::MAJOR_3RD, :letter_index => JazzModel::Tone::LetterInterval::THIRD, :strength => 1},
334
+ {:tone => JazzModel::Tone::Interval::PERFECT_5TH, :letter_index => JazzModel::Tone::LetterInterval::FIFTH, :strength => 3, :omitable => true},
335
+ {:tone => JazzModel::Tone::Interval::DOMINANT_7TH, :letter_index => JazzModel::Tone::LetterInterval::SEVENTH, :strength => 2},
336
+ {:tone => JazzModel::Tone::Interval::MAJOR_2ND, :letter_index => JazzModel::Tone::LetterInterval::SECOND, :strength => 4}
337
+ ])
338
+
339
+ cc.chord_scales << JazzModel::ChordScale.specify(JazzModel::Scale['Major']['Mixolydian'])
340
+ end
341
+
342
+ c.children.create!(:name => 'Dominant 6/9').tap do |cc|
343
+ cc.symbols.create!(:name => '6/9', :primary => true)
344
+ cc.symbols.create!(:name => '69')
345
+
346
+ cc.tones.create([
347
+ {:tone => JazzModel::Tone::Interval::ROOT, :letter_index => JazzModel::Tone::LetterInterval::FIRST, :strength => 0, :omitable => true},
348
+ {:tone => JazzModel::Tone::Interval::MAJOR_3RD, :letter_index => JazzModel::Tone::LetterInterval::THIRD, :strength => 1},
349
+ {:tone => JazzModel::Tone::Interval::PERFECT_5TH, :letter_index => JazzModel::Tone::LetterInterval::FIFTH, :strength => 3, :omitable => true},
350
+ {:tone => JazzModel::Tone::Interval::DOMINANT_7TH, :letter_index => JazzModel::Tone::LetterInterval::SEVENTH, :strength => 2},
351
+ {:tone => JazzModel::Tone::Interval::MAJOR_2ND, :letter_index => JazzModel::Tone::LetterInterval::SECOND, :strength => 4},
352
+ {:tone => JazzModel::Tone::Interval::MAJOR_6TH, :letter_index => JazzModel::Tone::LetterInterval::SIXTH, :strength => 4}
353
+ ])
354
+
355
+ cc.chord_scales << JazzModel::ChordScale.specify(JazzModel::Scale['Major']['Mixolydian'])
356
+ cc.chord_scales << JazzModel::ChordScale.specify(JazzModel::Scale['Major']['Ionian'])
357
+ end
358
+
359
+ c.children.create!(:name => 'Dominant b9').tap do |cc|
360
+ cc.symbols.create!(:name => '7b9', :primary => true)
361
+
362
+ cc.tones.create([
363
+ {:tone => JazzModel::Tone::Interval::ROOT, :letter_index => JazzModel::Tone::LetterInterval::FIRST, :strength => 0, :omitable => true},
364
+ {:tone => JazzModel::Tone::Interval::MAJOR_3RD, :letter_index => JazzModel::Tone::LetterInterval::THIRD, :strength => 1},
365
+ {:tone => JazzModel::Tone::Interval::PERFECT_5TH, :letter_index => JazzModel::Tone::LetterInterval::FIFTH, :strength => 3, :omitable => true},
366
+ {:tone => JazzModel::Tone::Interval::DOMINANT_7TH, :letter_index => JazzModel::Tone::LetterInterval::SEVENTH, :strength => 2},
367
+ {:tone => JazzModel::Tone::Interval::MINOR_2ND, :letter_index => JazzModel::Tone::LetterInterval::SECOND, :strength => 4}
368
+ ])
369
+
370
+ cc.chord_scales << JazzModel::ChordScale.specify(JazzModel::Scale['Diminished'][1])
371
+ cc.chord_scales << JazzModel::ChordScale.specify(JazzModel::Scale['Major']['Mixolydian'], 2)
372
+ end
373
+
374
+ c.children.create!(:name => 'Dominant #9').tap do |cc|
375
+ cc.symbols.create!(:name => '7#9', :primary => true)
376
+
377
+ cc.tones.create([
378
+ {:tone => JazzModel::Tone::Interval::ROOT, :letter_index => JazzModel::Tone::LetterInterval::FIRST, :strength => 0, :omitable => true},
379
+ {:tone => JazzModel::Tone::Interval::MAJOR_3RD, :letter_index => JazzModel::Tone::LetterInterval::THIRD, :strength => 1},
380
+ {:tone => JazzModel::Tone::Interval::PERFECT_5TH, :letter_index => JazzModel::Tone::LetterInterval::FIFTH, :strength => 3, :omitable => true},
381
+ {:tone => JazzModel::Tone::Interval::DOMINANT_7TH, :letter_index => JazzModel::Tone::LetterInterval::SEVENTH, :strength => 2},
382
+ {:tone => JazzModel::Tone::Interval::AUGMENTED_2ND, :letter_index => JazzModel::Tone::LetterInterval::SECOND, :strength => 4}
383
+ ])
384
+
385
+ cc.chord_scales << JazzModel::ChordScale.specify(JazzModel::Scale['Melodic Minor'][7])
386
+ cc.chord_scales << JazzModel::ChordScale.specify(JazzModel::Scale['Diminished'][1], 2)
387
+ end
388
+
389
+ c.children.create!(:name => 'Dominant #11').tap do |cc|
390
+ cc.symbols.create!(:name => '7#11', :primary => true)
391
+ cc.symbols.create!(:name => 'lyd7')
392
+ cc.symbols.create!(:name => 'lydiandom')
393
+
394
+ cc.tones.create([
395
+ {:tone => JazzModel::Tone::Interval::ROOT, :letter_index => JazzModel::Tone::LetterInterval::FIRST, :strength => 0, :omitable => true},
396
+ {:tone => JazzModel::Tone::Interval::MAJOR_3RD, :letter_index => JazzModel::Tone::LetterInterval::THIRD, :strength => 1},
397
+ {:tone => JazzModel::Tone::Interval::PERFECT_5TH, :letter_index => JazzModel::Tone::LetterInterval::FIFTH, :strength => 3, :omitable => true},
398
+ {:tone => JazzModel::Tone::Interval::DOMINANT_7TH, :letter_index => JazzModel::Tone::LetterInterval::SEVENTH, :strength => 2},
399
+ {:tone => JazzModel::Tone::Interval::AUGMENTED_4TH, :letter_index => JazzModel::Tone::LetterInterval::FOURTH, :strength => 4}
400
+ ])
401
+
402
+ cc.chord_scales << JazzModel::ChordScale.specify(JazzModel::Scale['Melodic Minor'][4])
403
+ end
404
+
405
+ c.children.create!(:name => 'Mixoylidian b6').tap do |cc|
406
+ cc.symbols.create!(:name => '7b6', :primary => true)
407
+
408
+ cc.tones.create([
409
+ {:tone => JazzModel::Tone::Interval::ROOT, :letter_index => JazzModel::Tone::LetterInterval::FIRST, :strength => 0, :omitable => true},
410
+ {:tone => JazzModel::Tone::Interval::MAJOR_3RD, :letter_index => JazzModel::Tone::LetterInterval::THIRD, :strength => 1},
411
+ {:tone => JazzModel::Tone::Interval::PERFECT_5TH, :letter_index => JazzModel::Tone::LetterInterval::FIFTH, :strength => 3},
412
+ {:tone => JazzModel::Tone::Interval::DOMINANT_7TH, :letter_index => JazzModel::Tone::LetterInterval::SEVENTH, :strength => 2},
413
+ {:tone => JazzModel::Tone::Interval::MINOR_6TH, :letter_index => JazzModel::Tone::LetterInterval::SIXTH, :strength => 4}
414
+ ])
415
+
416
+ cc.chord_scales << JazzModel::ChordScale.specify(JazzModel::Scale['Melodic Minor'][5])
417
+ end
418
+
419
+ c.children.create!(:name => 'Altered').tap do |cc|
420
+ cc.symbols.create!(:name => 'alt', :primary => true)
421
+ cc.symbols.create!(:name => 'altered')
422
+ cc.symbols.create!(:name => '7#9#5')
423
+ cc.symbols.create!(:name => '7#5#9')
424
+ cc.symbols.create!(:name => '7b9#9')
425
+ cc.symbols.create!(:name => '7#9b9')
426
+ cc.symbols.create!(:name => '7#5')
427
+
428
+ cc.tones.create([
429
+ {:tone => JazzModel::Tone::Interval::ROOT, :letter_index => JazzModel::Tone::LetterInterval::FIRST, :strength => 0, :omitable => true},
430
+ {:tone => JazzModel::Tone::Interval::MAJOR_3RD, :letter_index => JazzModel::Tone::LetterInterval::THIRD, :strength => 1},
431
+ {:tone => JazzModel::Tone::Interval::DOMINANT_7TH, :letter_index => JazzModel::Tone::LetterInterval::SEVENTH, :strength => 2},
432
+ {:tone => JazzModel::Tone::Interval::MINOR_2ND, :letter_index => JazzModel::Tone::LetterInterval::SECOND, :strength => 4},
433
+ {:tone => JazzModel::Tone::Interval::AUGMENTED_2ND, :letter_index => JazzModel::Tone::LetterInterval::SECOND, :strength => 4},
434
+ {:tone => JazzModel::Tone::Interval::AUGMENTED_5TH, :letter_index => JazzModel::Tone::LetterInterval::FIFTH, :strength => 4}
435
+ ])
436
+
437
+ cc.chord_scales << JazzModel::ChordScale.specify(JazzModel::Scale['Melodic Minor'][7])
438
+ end
439
+
440
+ c.children.create!(:name => 'Dominant b5').tap do |cc|
441
+ cc.symbols.create!(:name => '7b5', :primary => true)
442
+
443
+ cc.tones.create([
444
+ {:tone => JazzModel::Tone::Interval::ROOT, :letter_index => JazzModel::Tone::LetterInterval::FIRST, :strength => 0, :omitable => true},
445
+ {:tone => JazzModel::Tone::Interval::MAJOR_3RD, :letter_index => JazzModel::Tone::LetterInterval::THIRD, :strength => 1},
446
+ {:tone => JazzModel::Tone::Interval::DIMINISHED_5TH, :letter_index => JazzModel::Tone::LetterInterval::FIFTH, :strength => 3},
447
+ {:tone => JazzModel::Tone::Interval::DOMINANT_7TH, :letter_index => JazzModel::Tone::LetterInterval::SEVENTH, :strength => 2}
448
+ ])
449
+
450
+ cc.chord_scales << JazzModel::ChordScale.specify(JazzModel::Scale['Melodic Minor'][4])
451
+ end
452
+
453
+ end
454
+ end
455
+
456
+
457
+ JazzModel::ChordQuality.create!(:name => 'Diminished', :code => 'DIM').tap do |q|
458
+ q.chords.create!(:name => 'Diminished Triad').tap do |c|
459
+ c.symbols.create!(:name => 'dim', :primary => true)
460
+ c.symbols.create!(:name => 'b5')
461
+
462
+ c.tones.create([
463
+ {:tone => JazzModel::Tone::Interval::ROOT, :letter_index => JazzModel::Tone::LetterInterval::FIRST, :strength => 0},
464
+ {:tone => JazzModel::Tone::Interval::MINOR_3RD, :letter_index => JazzModel::Tone::LetterInterval::THIRD, :strength => 1},
465
+ {:tone => JazzModel::Tone::Interval::DIMINISHED_5TH, :letter_index => JazzModel::Tone::LetterInterval::FIFTH, :strength => 1}
466
+ ])
467
+
468
+ c.chord_scales << JazzModel::ChordScale.specify(JazzModel::Scale['Diminished'][1])
469
+ c.chord_scales << JazzModel::ChordScale.specify(JazzModel::Scale['Diminished'][2])
470
+ end
471
+
472
+ q.chords.create!(:name => 'Half Diminished').tap do |c|
473
+ c.symbols.create!(:name => 'dim7', :primary => true)
474
+ c.symbols.create!(:name => '7b5')
475
+
476
+ c.tones.create([
477
+ {:tone => JazzModel::Tone::Interval::ROOT, :letter_index => JazzModel::Tone::LetterInterval::FIRST, :strength => 0},
478
+ {:tone => JazzModel::Tone::Interval::MINOR_3RD, :letter_index => JazzModel::Tone::LetterInterval::THIRD, :strength => 2},
479
+ {:tone => JazzModel::Tone::Interval::DIMINISHED_5TH, :letter_index => JazzModel::Tone::LetterInterval::FIFTH, :strength => 1},
480
+ {:tone => JazzModel::Tone::Interval::MINOR_7TH, :letter_index => JazzModel::Tone::LetterInterval::SEVENTH, :strength => 1}
481
+ ])
482
+
483
+ c.chord_scales << JazzModel::ChordScale.specify(JazzModel::Scale['Major'][7])
484
+ c.chord_scales << JazzModel::ChordScale.specify(JazzModel::Scale['Melodic Minor'][6])
485
+ end
486
+
487
+ q.chords.create!(:name => 'Full Diminished').tap do |c|
488
+ c.symbols.create!(:name => 'fulldim', :primary => true)
489
+ c.symbols.create!(:name => 'b5bb7')
490
+
491
+ c.tones.create([
492
+ {:tone => JazzModel::Tone::Interval::ROOT, :letter_index => JazzModel::Tone::LetterInterval::FIRST, :strength => 0},
493
+ {:tone => JazzModel::Tone::Interval::MINOR_3RD, :letter_index => JazzModel::Tone::LetterInterval::THIRD, :strength => 2},
494
+ {:tone => JazzModel::Tone::Interval::DIMINISHED_5TH, :letter_index => JazzModel::Tone::LetterInterval::FIFTH, :strength => 1},
495
+ {:tone => JazzModel::Tone::Interval::DIMINISHED_7TH, :letter_index => JazzModel::Tone::LetterInterval::SEVENTH, :strength => 1}
496
+ ])
497
+
498
+ c.chord_scales << JazzModel::ChordScale.specify(JazzModel::Scale['Diminished'][1])
499
+ c.chord_scales << JazzModel::ChordScale.specify(JazzModel::Scale['Diminished'][2])
500
+ end
501
+ end
502
+ end