class HeadMusic::Spelling

Represents the spelling of a pitch, such as C# or Db. Composite of a LetterName and an optional Sign. Does not include the octave. See Pitch for that.

Constants

MATCHER

Attributes

letter_name[R]
pitch_class[R]
sign[R]

Public Class Methods

fetch_or_create(letter_name, sign) click to toggle source
# File lib/head_music/spelling.rb, line 56
def self.fetch_or_create(letter_name, sign)
  @spellings ||= {}
  hash_key = [letter_name, sign].join
  @spellings[hash_key] ||= new(letter_name, sign)
end
from_name(name) click to toggle source
# File lib/head_music/spelling.rb, line 29
def self.from_name(name)
  return nil unless matching_string(name)

  letter_name, sign_string, _octave = matching_string(name).captures
  letter_name = HeadMusic::LetterName.get(letter_name)
  return nil unless letter_name

  sign = HeadMusic::Sign.get(sign_string)
  fetch_or_create(letter_name, sign)
end
from_number(number) click to toggle source
# File lib/head_music/spelling.rb, line 40
def self.from_number(number)
  return nil unless number == number.to_i

  pitch_class_number = number.to_i % 12
  letter_name = HeadMusic::LetterName.from_pitch_class(pitch_class_number)
  from_number_and_letter(number, letter_name)
end
from_number_and_letter(number, letter_name) click to toggle source
# File lib/head_music/spelling.rb, line 48
def self.from_number_and_letter(number, letter_name)
  letter_name = HeadMusic::LetterName.get(letter_name)
  natural_letter_pitch_class = letter_name.pitch_class
  sign_interval = natural_letter_pitch_class.smallest_interval_to(HeadMusic::PitchClass.get(number))
  sign = HeadMusic::Sign.by(:semitones, sign_interval) if sign_interval != 0
  fetch_or_create(letter_name, sign)
end
get(identifier) click to toggle source
# File lib/head_music/spelling.rb, line 19
def self.get(identifier)
  return identifier if identifier.is_a?(HeadMusic::Spelling)

  from_name(identifier) || from_number(identifier)
end
matching_string(string) click to toggle source
# File lib/head_music/spelling.rb, line 25
def self.matching_string(string)
  string.to_s.match(MATCHER)
end

Private Class Methods

new(letter_name, sign = nil) click to toggle source
# File lib/head_music/spelling.rb, line 62
def initialize(letter_name, sign = nil)
  @letter_name = HeadMusic::LetterName.get(letter_name.to_s)
  @sign = HeadMusic::Sign.get(sign)
  sign_semitones = @sign ? @sign.semitones : 0
  @pitch_class = HeadMusic::PitchClass.get(letter_name.pitch_class + sign_semitones)
end

Public Instance Methods

==(other) click to toggle source
# File lib/head_music/spelling.rb, line 77
def ==(other)
  other = HeadMusic::Spelling.get(other)
  to_s == other.to_s
end
name() click to toggle source
# File lib/head_music/spelling.rb, line 69
def name
  [letter_name, sign].join
end
natural?() click to toggle source
# File lib/head_music/spelling.rb, line 86
def natural?
  !sign || sign.natural?
end
scale(scale_type_name = nil) click to toggle source
# File lib/head_music/spelling.rb, line 82
def scale(scale_type_name = nil)
  HeadMusic::Scale.get(self, scale_type_name)
end
to_s() click to toggle source
# File lib/head_music/spelling.rb, line 73
def to_s
  name
end

Private Instance Methods

enharmonic_equivalence() click to toggle source
# File lib/head_music/spelling.rb, line 94
def enharmonic_equivalence
  @enharmonic_equivalence ||= EnharmonicEquivalence.get(self)
end