jazz_model 0.1.0

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