class MusicalScore::Note::Pitch

Attributes

alter[RW]
octave[RW]
step[RW]

Public Class Methods

create_by_hash(doc) click to toggle source
# File lib/musical_score/note/pitch.rb, line 104
def self.create_by_hash(doc)
    step   = doc["step"][0].to_sym
    octave = doc["octave"][0].to_i
    alter  = doc.has_key?("alter") ? doc["alter"][0].to_i : 0
    return MusicalScore::Note::Pitch.new(step, alter, octave)
end
create_by_xml(xml_doc) click to toggle source
# File lib/musical_score/note/pitch.rb, line 96
def self.create_by_xml(xml_doc)
    step   = xml_doc.elements["step"].text.to_sym
    octave = xml_doc.elements["octave"].text.to_i
    alter  = xml_doc.elements["alter"] ? xml_doc.elements["alter"].text.to_i : 0
    return MusicalScore::Note::Pitch.new(step, alter, octave)
end
new(step, alter = 0, octave = 0) click to toggle source
# File lib/musical_score/note/pitch.rb, line 29
def initialize(step, alter = 0, octave = 0)
    @step   = step.to_sym
    @alter  = alter
    @octave = octave
end
new_note_flat(note_number) click to toggle source
# File lib/musical_score/note/pitch.rb, line 68
def self.new_note_flat(note_number)
    step_key_num   = note_number % NUMBER_OF_NOTES
    octave         = note_number / NUMBER_OF_NOTES
    # calculate step and alter
    candidate_keys = @@key.keys.select{ |item| step_key_num <= @@key[item] }
    key            = candidate_keys.min_by{ |item| @@key[item] }

    return MusicalScore::Note::Pitch.new(key, step_key_num-@@key[key], octave)
end
new_note_sharp(note_number) click to toggle source
# File lib/musical_score/note/pitch.rb, line 51
def self.new_note_sharp(note_number)
    step_key_num   = note_number % NUMBER_OF_NOTES
    octave         = note_number / NUMBER_OF_NOTES
    # calculate step and alter
    candidate_keys = @@key.keys.select{ |item| step_key_num >= @@key[item] }
    key            = candidate_keys.max_by{ |item| @@key[item] }

    return MusicalScore::Note::Pitch.new(key, step_key_num-@@key[key], octave)
end

Public Instance Methods

<=>(other) click to toggle source

Pitch is comparable

@example

a = MusicalScore::Note::Pitch.new(:C, 0, 3)
b = MusicalScore::Note::Pitch.new(:D, 0 ,3)
a < b # => true
# File lib/musical_score/note/pitch.rb, line 41
def <=> (other)
    self.note_number <=> other.note_number
end
export_xml() click to toggle source
# File lib/musical_score/note/pitch.rb, line 111
def export_xml
    pitch_element  = REXML::Element.new('pitch')
    step_element   = REXML::Element.new('step').add_text(@step.to_s)
    octave_element = REXML::Element.new('octave').add_text(@octave.to_s)

    pitch_element.add_element(step_element)
    if (@alter != 0)
        alter_element = REXML::Element.new('alter').add_text(@alter.to_s)
        pitch_element.add_element(alter_element)
    end
    pitch_element.add_element(octave_element)

    return pitch_element
end
note_number() click to toggle source
# File lib/musical_score/note/pitch.rb, line 78
def note_number
    result = (NUMBER_OF_NOTES * octave) + @@key[step] + alter
    return result
end
to_s(is_note_str = false) click to toggle source
# File lib/musical_score/note/pitch.rb, line 86
def to_s(is_note_str = false)
    if is_note_str
        result = "%s%s%d" % [@step.to_s, alter_to_s, @octave]
        return result
    else
        return self.to_s
    end
end

Private Instance Methods

alter_to_s() click to toggle source
# File lib/musical_score/note/pitch.rb, line 128
def alter_to_s
    num = @alter.abs
    if (num == 0)
        return ""
    elsif (@alter < 0)
        result = ''
        num.times do |i|
            result += 'b'
        end
        return result
    else
        result = ''
        num.times do |i|
            result += '#'
        end
        return result
    end
end