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