Sha256: b11aeaa88d86cc8e591c2a818847032b8a6905f8968244502400a3db0ddd331d

Contents?: true

Size: 1.75 KB

Versions: 1

Compression:

Stored size: 1.75 KB

Contents

module Coltrane
  # It describe a chord
  class Chord
    attr_reader :root_note, :quality

    def initialize(arg)
      @root_note, @quality = case arg
        when String then note_and_quality_from_name(arg)
        when GuitarNoteSet then [arg.root_note, arg.chord_quality]
        when Array
          case arg[0]
            when String then note_and_quality_from_notes(*arg.map{|a| Note.new(a)})
            when Note then note_and_quality_from_notes(*arg)
          end
      end
    end

    def guitar_chords
      GuitarChordFinder.by_chord(self)
    end

    def guitar_notes_for_root
      root_note.guitar_notes
    end

    def name
      return '—' if root_note.nil? || quality.nil?
      "#{root_note.name}#{quality.name}"
    end

    def notes
      quality.intervals.each_with_object([]) do |interval, notes|
        notes << Note.new(root_note.number + interval)
      end
    end

    def intervals
      IntervalSequence.new(NoteSet.new(notes))
    end

    def on_guitar
      name + "\n" +
      NoteSet.new(notes).guitar_notes.render(root_note) + "\n\n"
    end

    def on_piano
      PianoRepresentation.render_intervals(notes, root_note)
    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 note_and_quality_from_name(chord_name)
      _, name, quality = chord_name.match(/([A-Z]#?)(.*)/).to_a
      [Note.new(name), ChordQuality.new_from_string(quality)]
    end

    def note_and_quality_from_notes(*notes)
      [notes.first, ChordQuality.new_from_notes(notes)]
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
coltrane-0.0.2 lib/coltrane/chord.rb