class Coltrane::Theory::ChordQuality
It describe the quality of a chord, like maj7 or dim.
Constants
- NAMES
Attributes
name[R]
to_s[R]
Public Class Methods
new(name: nil, notes: nil, bass: nil)
click to toggle source
Calls superclass method
# File lib/coltrane/theory/chord_quality.rb, line 92 def initialize(name: nil, notes: nil, bass: nil) if name @name = bass.nil? ? name : [name, bass].join('/') super(*intervals_from_name(name)) elsif notes super(notes: notes) @name = get_name else raise WrongKeywordsError, '[name:] || [notes:]' end end
Private Class Methods
chord_trie()
click to toggle source
QUALITIES_FILE = File.expand_path(“#{'../' * 3}data/qualities.json”, __FILE__)
# File lib/coltrane/theory/chord_quality.rb, line 13 def self.chord_trie File.expand_path("#{'../' * 3}data/qualities.json", __FILE__) trie = QUALITIES trie.clone_values from_keys: ['Perfect Unison', 'Major Third'], to_keys: ['Perfect Unison', 'Major Second'], suffix: 'sus2' trie.clone_values from_keys: ['Perfect Unison', 'Major Third'], to_keys: ['Perfect Unison', 'Perfect Fourth'], suffix: 'sus4' trie.deep_dup end
intervals_per_name(quality_names: {}, intervals: [], hash: nil)
click to toggle source
# File lib/coltrane/theory/chord_quality.rb, line 27 def self.intervals_per_name(quality_names: {}, intervals: [], hash: nil) hash ||= chord_trie return quality_names if hash.empty? if hash['name'] quality_names[hash.delete('name')] = intervals.map { |n| Interval.public_send(n.underscore) } end hash.reduce(quality_names) do |memo, (interval, values)| memo.merge intervals_per_name(hash: values, quality_names: quality_names, intervals: intervals + [interval]) end end
Public Instance Methods
get_name()
click to toggle source
# File lib/coltrane/theory/chord_quality.rb, line 77 def get_name find_chord(retrieve_chord_intervals.compact) || find_chord(retrieve_chord_intervals(sus2_sequence).compact) || find_chord(retrieve_chord_intervals(sus4_sequence).compact) || raise(ChordNotFoundError) end
suspension_type()
click to toggle source
# File lib/coltrane/theory/chord_quality.rb, line 84 def suspension_type if has_major_second? 'sus2' elsif has_fourth? 'sus4' end end
Private Instance Methods
find_chord(given_interval_names, trie: self.class.chord_trie, last_name: nil)
click to toggle source
# File lib/coltrane/theory/chord_quality.rb, line 42 def find_chord(given_interval_names, trie: self.class.chord_trie, last_name: nil) return if trie.nil? if given_interval_names.empty? @found = true return trie['name'] end interval = given_interval_names.shift new_trie = trie[interval.full_name] find_chord given_interval_names, last_name: (trie['name'] || last_name), trie: new_trie end
intervals_from_name(name)
click to toggle source
# File lib/coltrane/theory/chord_quality.rb, line 108 def intervals_from_name(name) NAMES[name] || NAMES["M#{name}"] || raise(ChordNotFoundError) end
normal_sequence()
click to toggle source
# File lib/coltrane/theory/chord_quality.rb, line 54 def normal_sequence %i[unison third! fifth sixth! seventh ninth eleventh! thirteenth] end
retrieve_chord_intervals(chord_sequence = normal_sequence)
click to toggle source
# File lib/coltrane/theory/chord_quality.rb, line 66 def retrieve_chord_intervals(chord_sequence = normal_sequence) ints = IntervalSequence.new(*self) chord_sequence.map do |int_sym| next unless interval_name = ints.public_send(int_sym) ints.delete_if { |i| i.cents == IntervalClass.new(interval_name).cents } interval_name end end
sus2_sequence()
click to toggle source
# File lib/coltrane/theory/chord_quality.rb, line 58 def sus2_sequence %i[unison second! fifth sixth! seventh ninth eleventh! thirteenth] end
sus4_sequence()
click to toggle source
# File lib/coltrane/theory/chord_quality.rb, line 62 def sus4_sequence %i[unison fourth! fifth sixth! seventh ninth eleventh! thirteenth] end