From f7d51406349037d0cab4a2b9181c9821144e6f21 Mon Sep 17 00:00:00 2001 From: Erlend Aasland Date: Thu, 31 Jan 2008 15:49:54 +0100 Subject: [PATCH] MusicXML: Add support for unpitched elements. --- python/musicxml.py | 18 ++++++++++++- scripts/musicxml2ly.py | 61 ++++++++++++++++++++++++++++-------------- 2 files changed, 58 insertions(+), 21 deletions(-) diff --git a/python/musicxml.py b/python/musicxml.py index 63296f193e..89ed5f2b1a 100644 --- a/python/musicxml.py +++ b/python/musicxml.py @@ -202,6 +202,21 @@ class Pitch (Music_xml_node): alter = int (ch.get_text ().strip ()) return alter +class Unpitched (Music_xml_node): + def get_step (self): + ch = self.get_unique_typed_child (get_class (u'display-step')) + step = ch.get_text ().strip () + return step + + def get_octave (self): + ch = self.get_unique_typed_child (get_class (u'display-octave')) + + if ch: + octave = ch.get_text ().strip () + return int (octave) + else: + return None + class Measure_element (Music_xml_node): def get_voice_id (self): voice_id = self.get_maybe_exist_named_child ('voice') @@ -310,7 +325,7 @@ class Note (Measure_element): 'breve': -1, 'long': -2}.get (log, 0) else: - self.message ("Encountered note at %s without %s duration (no element):" % (self.start, self.duration) ) + self.message ("Encountered note at %s with %s duration (no element):" % (self.start, self.duration) ) return 0 def get_factor (self): @@ -879,6 +894,7 @@ class_dict = { 'time-modification': Time_modification, 'tuplet': Tuplet, 'type': Type, + 'unpitched': Unpitched, 'wavy-line': Wavy_line, 'wedge': Wedge, 'words': Words, diff --git a/scripts/musicxml2ly.py b/scripts/musicxml2ly.py index c1b7b43d14..b55fed64a5 100644 --- a/scripts/musicxml2ly.py +++ b/scripts/musicxml2ly.py @@ -196,7 +196,6 @@ class PartGroupInfo: error_message ("Unprocessed PartGroupInfo %s encountered" % self) return '' - def staff_attributes_to_string_tunings (mxl_attr): details = mxl_attr.get_maybe_exist_named_child ('staff-details') if not details: @@ -219,7 +218,7 @@ def staff_attributes_to_string_tunings (mxl_attr): step = i.get_named_child (u'tuning-step') step = step.get_text ().strip () - p.step = (ord (step) - ord ('A') + 7 - 2) % 7 + p.step = musicxml_step_to_lily (step) octave = i.get_named_child (u'tuning-octave') octave = octave.get_text ().strip () @@ -1071,26 +1070,34 @@ instrument_drumtype_dict = { def musicxml_note_to_lily_main_event (n): pitch = None duration = None - - mxl_pitch = n.get_maybe_exist_typed_child (musicxml.Pitch) event = None + + mxl_pitch = n.get_maybe_exist_typed_child (musicxml.Pitch) if mxl_pitch: pitch = musicxml_pitch_to_lily (mxl_pitch) - event = musicexp.NoteEvent() + event = musicexp.NoteEvent () event.pitch = pitch acc = n.get_maybe_exist_named_child ('accidental') if acc: # let's not force accs everywhere. event.cautionary = acc.editorial + + elif n.get_maybe_exist_typed_child (musicxml.Unpitched): + # Unpitched elements have display-step and can also have + # display-octave. + unpitched = n.get_maybe_exist_typed_child (musicxml.Unpitched) + event = musicexp.NoteEvent () + event.pitch = musicxml_unpitched_to_lily (unpitched) elif n.get_maybe_exist_typed_child (musicxml.Rest): # rests can have display-octave and display-step, which are # treated like an ordinary note pitch rest = n.get_maybe_exist_typed_child (musicxml.Rest) - event = musicexp.RestEvent() + event = musicexp.RestEvent () pitch = musicxml_restdisplay_to_lily (rest) event.pitch = pitch + elif n.instrument_name: event = musicexp.NoteEvent () drum_type = instrument_drumtype_dict.get (n.instrument_name) @@ -1099,11 +1106,13 @@ def musicxml_note_to_lily_main_event (n): else: n.message ("drum %s type unknown, please add to instrument_drumtype_dict" % n.instrument_name) event.drum_type = 'acousticsnare' - - if not event: + + else: n.message ("cannot find suitable event") - event.duration = musicxml_duration_to_lily (n) + if event: + event.duration = musicxml_duration_to_lily (n) + return event @@ -1245,6 +1254,12 @@ class VoiceData: self.lyrics_dict = {} self.lyrics_order = [] +def musicxml_step_to_lily (step): + if step: + return (ord (step) - ord ('A') + 7 - 2) % 7 + else: + return None + def musicxml_voice_to_lily_voice (voice): tuplet_events = [] modes_found = {} @@ -1358,10 +1373,9 @@ def musicxml_voice_to_lily_voice (voice): first_pitch = main_event.pitch ignore_lyrics = inside_slur or is_tied or is_chord - if hasattr (main_event, 'drum_type') and main_event.drum_type: + if main_event and hasattr (main_event, 'drum_type') and main_event.drum_type: modes_found['drummode'] = True - ev_chord = voice_builder.last_event_chord (n._when) if not ev_chord: ev_chord = musicexp.ChordEvent() @@ -1378,9 +1392,7 @@ def musicxml_voice_to_lily_voice (voice): if hasattr (grace, 'slash'): # TODO: use grace_type = "appoggiatura" for slurred grace notes if grace.slash == "yes": - ev_chord.grace_type = "acciaccatura" - elif grace.slash == "no": - ev_chord.grace_type = "grace" + grace_chord.grace_type = "acciaccatura" # now that we have inserted the chord into the grace music, insert # everything into that chord instead of the ev_chord ev_chord = grace_chord @@ -1560,7 +1572,6 @@ def musicxml_voice_to_lily_voice (voice): return return_value - def musicxml_id_to_lily (id): digits = ['Zero', 'One', 'Two', 'Three', 'Four', 'Five', 'Six', 'Seven', 'Eight', 'Nine', 'Ten'] @@ -1572,20 +1583,30 @@ def musicxml_id_to_lily (id): id = re.sub ('[^a-zA-Z]', 'X', id) return id - def musicxml_pitch_to_lily (mxl_pitch): - p = musicexp.Pitch() + p = musicexp.Pitch () p.alteration = mxl_pitch.get_alteration () - p.step = (ord (mxl_pitch.get_step ()) - ord ('A') + 7 - 2) % 7 + p.step = musicxml_step_to_lily (mxl_pitch.get_step ()) p.octave = mxl_pitch.get_octave () - 4 return p +def musicxml_unpitched_to_lily (mxl_unpitched): + p = None + step = mxl_unpitched.get_step () + if step: + p = musicexp.Pitch () + p.step = musicxml_step_to_lily (step) + octave = mxl_unpitched.get_octave () + if octave and p: + p.octave = octave - 4 + return p + def musicxml_restdisplay_to_lily (mxl_rest): p = None step = mxl_rest.get_step () if step: - p = musicexp.Pitch() - p.step = (ord (step) - ord ('A') + 7 - 2) % 7 + p = musicexp.Pitch () + p.step = musicxml_step_to_lily (step) octave = mxl_rest.get_octave () if octave and p: p.octave = octave - 4 -- 2.39.5