class Music::Chord

Constants

REGEXP
RULES

Attributes

kind[R]

@return [String] @example

Chord.new("C7").kind #=> "7"
root[R]

@return [Music::Note] @example

Chord.new("C").root #=> #<Music::Note @letter="C">

Public Class Methods

new(name) click to toggle source

@param name [String] Name of the chord, in any form. @example

Chord.new("Cm") == Chord.new("Cmin") #=> true
# File lib/music/chord.rb, line 39
def initialize(name)
  unless match = name.match(/^#{REGEXP}$/)
    raise ArgumentError, "invalid chord format: #{name}"
  end

  @root = Note.new(match[:root])

  @kind = match[:kind]
  @kind << "5" if @kind !~ /\d+/
end

Public Instance Methods

==(other) click to toggle source

Compares the names.

# File lib/music/chord.rb, line 57
def ==(other)
  self.name == other.name
end
name() click to toggle source
# File lib/music/chord.rb, line 50
def name
  [root, kind].join
end
notes() click to toggle source

@return [Array<Music::Note>]

# File lib/music/chord.rb, line 64
def notes
  RULES[kind].map do |interval_name|
    quality  = interval_name[/^[a-z]+/] || "perfect"
    number   = interval_name[/\d+$/]
    interval = Interval.new(number.to_i, quality.to_sym)

    root.transpose_by(interval)
  end
end
transpose_by(interval) click to toggle source

@param interval [Music::Interval] @return [Music::Note] @example

major_third = Interval.new(3, :major)
Chord.new("C7").transpose_by(major_third) == Note.new("E7") #=> true
Note.new("E7").transpose_by(-major_third) == Note.new("C7") #=> true
# File lib/music/chord.rb, line 82
def transpose_by(interval)
  Chord.new(root.transpose_by(interval).name + kind)
end
transpose_down(interval) click to toggle source

@param (see transpose_by) @return (see transpose_by)

@see transpose_by

# File lib/music/chord.rb, line 102
def transpose_down(interval)
  transpose_by(-interval)
end
transpose_up(interval) click to toggle source

@param (see transpose_by) @return (see transpose_by)

@see transpose_by

# File lib/music/chord.rb, line 92
def transpose_up(interval)
  transpose_by(interval)
end