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