class HeadMusic::Register

The register is a numeric octave identifier used in scientific pitch notation.

A pitch is a spelling plus a register. For example, C4 is middle C and C5 is the C one octave higher. The number changes between the letter names B and C regardless of sharps and flats, so as an extreme example, Cb5 is actually a semitone below B#4.

Constants

DEFAULT

Attributes

number[R]

Public Class Methods

default() click to toggle source
# File lib/head_music/register.rb, line 33
def self.default
  @registers[DEFAULT] ||= new(DEFAULT)
end
from_name(string) click to toggle source
# File lib/head_music/register.rb, line 25
def self.from_name(string)
  return unless string.to_s.match?(HeadMusic::Spelling::MATCHER)

  _letter, _sign, register_string = string.to_s.match(HeadMusic::Spelling::MATCHER).captures
  @registers ||= {}
  @registers[register_string.to_i] ||= new(register_string.to_i) if register_string
end
from_number(identifier) click to toggle source
# File lib/head_music/register.rb, line 17
def self.from_number(identifier)
  return nil unless identifier.to_s == identifier.to_i.to_s
  return nil unless (-2..12).cover?(identifier.to_i)

  @registers ||= {}
  @registers[identifier.to_i] ||= new(identifier.to_i)
end
get(identifier) click to toggle source
# File lib/head_music/register.rb, line 13
def self.get(identifier)
  from_number(identifier) || from_name(identifier) || default
end

Private Class Methods

new(number) click to toggle source
# File lib/head_music/register.rb, line 41
def initialize(number)
  @number = number
end

Public Instance Methods

+(other) click to toggle source
# File lib/head_music/register.rb, line 49
def +(other)
  self.class.get(to_i + other.to_i)
end
-(other) click to toggle source
# File lib/head_music/register.rb, line 53
def -(other)
  self.class.get(to_i - other.to_i)
end
<=>(other) click to toggle source
# File lib/head_music/register.rb, line 45
def <=>(other)
  to_i <=> other.to_i
end
helmholtz_case() click to toggle source
# File lib/head_music/register.rb, line 57
def helmholtz_case
  return :upper if number < 3

  :lower
end
helmholtz_marks() click to toggle source
# File lib/head_music/register.rb, line 63
def helmholtz_marks
  return ',' * (2 - number) if number < 2
  return "'" * (number - 3) if number > 3

  ''
end