From 4c5f7c49c770b3583f10b5575f1a2ae9781eb189 Mon Sep 17 00:00:00 2001 From: Reinhold Kainhofer Date: Sat, 23 Feb 2008 18:53:49 +0100 Subject: [PATCH] MusicXML: Ignore lyrics on beamed notes (melismata) --- .../musicxml/06h-Lyrics-BeamsMelismata.xml | 303 ++++++++++++++++++ scripts/musicxml2ly.py | 40 ++- 2 files changed, 326 insertions(+), 17 deletions(-) create mode 100644 input/regression/musicxml/06h-Lyrics-BeamsMelismata.xml diff --git a/input/regression/musicxml/06h-Lyrics-BeamsMelismata.xml b/input/regression/musicxml/06h-Lyrics-BeamsMelismata.xml new file mode 100644 index 0000000000..419c60de96 --- /dev/null +++ b/input/regression/musicxml/06h-Lyrics-BeamsMelismata.xml @@ -0,0 +1,303 @@ + + + + Lyrics and melismata + + + + + + + + + + + + + 2 + + + C5 + 1 + 1 + eighth + begin + + begin + Me + + + + A4 + 1 + 1 + eighth + continue + + + C5 + 1 + 1 + eighth + end + + + A4 + 1 + 1 + eighth + + middle + lis + + + + C5 + 1 + 1 + eighth + begin + + end + ma + + + + + G4 + 1 + 1 + eighth + continue + + + B4 + 1 + 1 + eighth + end + + + + 1 + 1 + eighth + + + + + + C5 + 1 + 1 + eighth + + begin + Me + + + + A4 + 1 + 1 + eighth + + + C5 + 1 + 1 + eighth + + + A4 + 1 + 1 + eighth + + middle + lis + + + + C5 + 1 + 1 + eighth + + end + ma + + + + + G4 + 1 + 1 + eighth + + + B4 + 1 + 1 + eighth + + + + 1 + 1 + eighth + + + + + + C5 + 1 + 1 + eighth + + + + + begin + Me + + + + A4 + 1 + 1 + eighth + + + C5 + 1 + 1 + eighth + + + + + + A4 + 1 + 1 + eighth + + middle + lis + + + + C5 + 1 + 1 + eighth + + + + + end + ma + + + + + G4 + 1 + 1 + eighth + + + B4 + 1 + 1 + eighth + + + + + + + 1 + 1 + eighth + + + + + + C5 + 1 + 1 + eighth + + + + + begin + Me + + + + A4 + 1 + 1 + eighth + + + C5 + 1 + 1 + eighth + + + A4 + 1 + 1 + eighth + + middle + lis + + + + C5 + 1 + 1 + eighth + + end + ma + + + + + G4 + 1 + 1 + eighth + + + B4 + 1 + 1 + eighth + + + + + + + 1 + 1 + eighth + + + light-heavy + + + + + diff --git a/scripts/musicxml2ly.py b/scripts/musicxml2ly.py index 3c62f4600d..e594aa7d47 100644 --- a/scripts/musicxml2ly.py +++ b/scripts/musicxml2ly.py @@ -1454,6 +1454,7 @@ def musicxml_voice_to_lily_voice (voice): inside_slur = False is_tied = False is_chord = False + is_beamed = False ignore_lyrics = False current_staff = None @@ -1551,7 +1552,8 @@ def musicxml_voice_to_lily_voice (voice): main_event = musicxml_note_to_lily_main_event (n) if main_event and not first_pitch: first_pitch = main_event.pitch - ignore_lyrics = inside_slur or is_tied or is_chord + # ignore lyrics for notes inside a slur, tie, chord or beam + ignore_lyrics = inside_slur or is_tied or is_chord or is_beamed if main_event and hasattr (main_event, 'drum_type') and main_event.drum_type: modes_found['drummode'] = True @@ -1683,22 +1685,6 @@ def musicxml_voice_to_lily_voice (voice): if ev: ev_chord.append (ev) - # Extract the lyrics - if not rest and not ignore_lyrics: - note_lyrics_processed = [] - note_lyrics_elements = n.get_typed_children (musicxml.Lyric) - for l in note_lyrics_elements: - if l.get_number () < 0: - for k in lyrics.keys (): - lyrics[k].append (l.lyric_to_text ()) - note_lyrics_processed.append (k) - else: - lyrics[l.number].append(l.lyric_to_text ()) - note_lyrics_processed.append (l.number) - for lnr in lyrics.keys (): - if not lnr in note_lyrics_processed: - lyrics[lnr].append ("\skip4") - mxl_beams = [b for b in n.get_named_children ('beam') if (b.get_type () in ('begin', 'end') @@ -1707,6 +1693,10 @@ def musicxml_voice_to_lily_voice (voice): beam_ev = musicxml_spanner_to_lily_event (mxl_beams[0]) if beam_ev: ev_chord.append (beam_ev) + if beam_ev.span_direction == -1: # beam and thus melisma starts here + is_beamed = True + elif beam_ev.span_direction == 1: # beam and thus melisma ends here + is_beamed = False if tuplet_event: mod = n.get_maybe_exist_typed_child (musicxml.Time_modification) @@ -1716,6 +1706,22 @@ def musicxml_voice_to_lily_voice (voice): tuplet_events.append ((ev_chord, tuplet_event, frac)) + # Extract the lyrics + if not rest and not ignore_lyrics: + note_lyrics_processed = [] + note_lyrics_elements = n.get_typed_children (musicxml.Lyric) + for l in note_lyrics_elements: + if l.get_number () < 0: + for k in lyrics.keys (): + lyrics[k].append (l.lyric_to_text ()) + note_lyrics_processed.append (k) + else: + lyrics[l.number].append(l.lyric_to_text ()) + note_lyrics_processed.append (l.number) + for lnr in lyrics.keys (): + if not lnr in note_lyrics_processed: + lyrics[lnr].append ("\skip4") + ## force trailing mm rests to be written out. voice_builder.add_music (musicexp.ChordEvent (), Rational (0)) -- 2.39.5