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