Sha256: 99f5ca892de9a69cec478da7b77f325013903ef15cbb486ab32168f078aadbc4
Contents?: true
Size: 1.54 KB
Versions: 3
Compression:
Stored size: 1.54 KB
Contents
module Coltrane # It describe a chord class Chord < NoteSet attr_reader :root_note, :quality, :notes def initialize(notes: nil, root_note: nil, quality: nil, name: nil) if !notes.nil? notes = NoteSet[*notes] if notes.is_a?(Array) @notes = notes @root_note = notes.first @quality = ChordQuality.new(notes: notes) elsif !root_note.nil? && !quality.nil? @notes = quality.notes_for(root_note) @root_note = root_note @quality = quality elsif !name.nil? @root_note, @quality, @notes = parse_from_name(name) else raise WrongKeywords.new('[notes:] || [root_note:, quality:] || [name:]') end end def name return @notes.names.join('/') if !named? "#{root_note.name}#{quality.name}" end def named? notes.size >= 3 && !root_note.nil? && !quality&.name.nil? end def intervals IntervalSequence.new(NoteSet.new(notes)) end def size notes.size end def scales Scale.having_chord(self.name) end def next_inversion Chord.new(notes.rotate(1)) end def invert(n=1) Chord.new(notes.rotate(n)) end def previous_inversion Chord.new(notes.rotate(-1)) end protected def parse_from_name(name) _, name, quality_name = name.match(/([A-Z]#?)(.*)/).to_a root = Note[name] quality = ChordQuality.new(name: quality_name) notes = quality.notes_for(root) [root, quality, notes] end end end
Version data entries
3 entries across 3 versions & 1 rubygems
Version | Path |
---|---|
coltrane-1.0.11 | lib/coltrane/chord.rb |
coltrane-1.0.1 | lib/coltrane/chord.rb |
coltrane-1.0.0 | lib/coltrane/chord.rb |