Sha256: 3ab9664bcb3a4b24b8dfe66e277c928e97cf79045abac4eecbe2067a03d2b9d9

Contents?: true

Size: 1.88 KB

Versions: 1

Compression:

Stored size: 1.88 KB

Contents

module Coltrane
  # It describes a musical note, independent of octave
  class Note
    attr_reader :name

    NOTES = {
      'C'  => 0,
      'C#' => 1,
      'Db' => 1,
      'D'  => 2,
      'D#' => 3,
      'Eb' => 3,
      'E'  => 4,
      'F'  => 5,
      'F#' => 6,
      'Gb' => 6,
      'G'  => 7,
      'G#' => 8,
      'Ab' => 8,
      'A'  => 9,
      'A#' => 10,
      'Bb' => 10,
      'B'  => 11
    }.freeze

    def self.all
      NOTES.keys.map {|n| Note.new(n)}
    end

    def accident?
      [1,3,6,8,10].include?(number)
    end

    def initialize(arg)
      case arg
      when String
        raise "invalid note: #{arg}" unless valid_note?(arg)
        @name = arg
      when Numeric then @name = name_from_number(arg)
      end
    end

    def +(n)
      case n
        when Numeric then Note.new(number + n)
        when Note then Chord.new(number + n.number)
      end
    end

    def -(n)
      case n
        when Numeric then Note.new(number + n)
        when Note then Interval.new((number - n.number) % 12)
      end
    end

    def valid_note?(note_name)
      NOTES.key?(note_name)
    end

    def number
      NOTES[name]
    end

    def interval_to(note_name)
      Interval.new(Note.new(note_name).number - number)
    end

    def transpose_by(interval_number)
      @name = name_from_number(number + interval_number)
      self
    end

    def guitar_notes
      Guitar.strings.reduce([]) do |memo, guitar_string|
        memo + in_guitar_string(guitar_string)
      end
    end

    def on_guitar
      GuitarNoteSet.new(guitar_notes).render
    end

    def in_guitar_string(guitar_string)
      guitar_string.guitar_notes_for_note(self)
    end

    def in_guitar_string_region(guitar_string, region)
      guitar_string.guitar_notes_for_note_in_region(self, region)
    end

    protected

    def name_from_number(number)
      NOTES.key(number % 12)
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

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