Sha256: 4e5263dce358765bf33799f4ae162d5104c42550a381d2e07f1ff219a9e602a2

Contents?: true

Size: 1.52 KB

Versions: 3

Compression:

Stored size: 1.52 KB

Contents

# frozen_string_literal: true

module Coltrane
  # It describe a chord
  class Chord
    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 WrongKeywordsError,
              '[notes:] || [root_note:, quality:] || [name:]'
      end
    end

    def name
      "#{root_note}#{quality}"
    end

    alias to_s name

    def pretty_name
      "#{root_note.pretty_name}#{quality.name}"
    end

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

    def size
      notes.size
    end

    def scales
      Scale.having_chord(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](?:#|b)?)(.*)/).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.1.2 lib/coltrane/chord.rb
coltrane-1.1.1 lib/coltrane/chord.rb
coltrane-1.1.0 lib/coltrane/chord.rb