class MusicalScore::Attribute::Key

Attributes

fifths[R]
mode[R]

Public Class Methods

create_by_hash(doc) click to toggle source
# File lib/musical_score/attribute/key.rb, line 63
def self.create_by_hash(doc)
    fifths = doc["fifths"][0].to_i
    mode   = doc["mode"][0].to_sym
    return MusicalScore::Attribute::Key.new(fifths, mode)
end
create_by_xml(xml_doc) click to toggle source
# File lib/musical_score/attribute/key.rb, line 56
def self.create_by_xml(xml_doc)
    fifths = xml_doc.elements["fifths"].text.to_i
    mode   = xml_doc.elements["mode"].text.to_sym
    return MusicalScore::Attribute::Key.new(fifths, mode)
end
new(fifths, mode) click to toggle source
# File lib/musical_score/attribute/key.rb, line 15
def initialize(fifths, mode)
    @fifths = fifths
    @mode   = mode.to_sym
end

Public Instance Methods

export_xml() click to toggle source
# File lib/musical_score/attribute/key.rb, line 69
def export_xml
    key_element    = REXML::Element.new('key')
    fifths_element = REXML::Element.new('fifths').add_text(@fifths.to_s)
    mode_element   = REXML::Element.new('mode').add_text(@mode.to_s)

    key_element.add_element(fifths_element)
    key_element.add_element(mode_element)

    return key_element
end
tonic_key_and_altered_pitches() click to toggle source
# File lib/musical_score/attribute/key.rb, line 23
def tonic_key_and_altered_pitches
    if @fifths >= 0
        pitch_number = @@circle_of_fifths[@fifths]
        major_pitch = MusicalScore::Note::Pitch.new_note_sharp(pitch_number)

        minor_number = (pitch_number + RELATED_KEY_SLIDE_NUMBER) % NUMBER_OF_NOTES
        minor_pitch  = MusicalScore::Note::Pitch.new_note_sharp(minor_number)

        altered_pitches  = Array.new
        @fifths.times do |i|
            count = (i + SHARP_START_INDEX) % NUMBER_OF_NOTES
            altered_pitches.push(MusicalScore::Note::Pitch.new_note_sharp(@@circle_of_fifths[count]))
        end
        return { :major_pitch => major_pitch, :minor_pitch => minor_pitch, :altered_pitches => altered_pitches }
    else
        reversed = @@circle_of_fifths.reverse
        fif      = @fifths.abs
        pitch_number = reversed[fif-1]
        major_pitch = MusicalScore::Note::Pitch.new_note_flat(pitch_number)

        minor_number = (pitch_number + RELATED_KEY_SLIDE_NUMBER) % NUMBER_OF_NOTES
        minor_pitch  = MusicalScore::Note::Pitch.new_note_flat(minor_number)

        altered_pitches  = Array.new
        fif.times do |i|
            count = (i + FLAT_START_INDEX) % NUMBER_OF_NOTES
            altered_pitches.push(MusicalScore::Note::Pitch.new_note_flat(reversed[count]))
        end
        return { :major_pitch => major_pitch, :minor_pitch => minor_pitch, :altered_pitches => altered_pitches }
    end
end