From 1729476becdb152bed917f6c370ace5745f97aa9 Mon Sep 17 00:00:00 2001 From: David Kastrup Date: Thu, 4 Sep 2014 15:07:20 +0200 Subject: [PATCH] Issue 4030: Lyrics associated to a Staff are placed on top of each other The approach here is simply to avoid attaching to noteheads that have actually started _before_ the current moment of time. It is somewhat irritating that includeGraceNotes cannot possibly be supported in associated voices with its own timing (rather than the fully synchronized \addlyrics or \lyricsto): Instead you need to use the same durations, including \grace constructs, in order to match the note you are aiming for. --- lily/extender-engraver.cc | 5 ++--- lily/include/context.hh | 2 +- lily/lyric-engraver.cc | 24 ++++++++++++++++++------ 3 files changed, 21 insertions(+), 10 deletions(-) diff --git a/lily/extender-engraver.cc b/lily/extender-engraver.cc index 9ffdd23405..f951c3a3c7 100644 --- a/lily/extender-engraver.cc +++ b/lily/extender-engraver.cc @@ -112,7 +112,7 @@ Extender_engraver::stop_translation_timestep () if (extender_ || pending_extender_) { Context *voice = get_voice_to_lyrics (context ()); - Grob *h = voice ? get_current_note_head (voice, to_boolean (get_property ("includeGraceNotes"))) : 0; + Grob *h = voice ? get_current_note_head (voice) : 0; if (h) { @@ -189,8 +189,7 @@ ADD_TRANSLATOR (Extender_engraver, "LyricExtender ", /* read */ - "extendersOverRests " - "includeGraceNotes ", + "extendersOverRests ", /* write */ "" diff --git a/lily/include/context.hh b/lily/include/context.hh index ab406c9041..ae21895590 100644 --- a/lily/include/context.hh +++ b/lily/include/context.hh @@ -149,7 +149,7 @@ Context *find_context_below (Context *where, bool melisma_busy (Context *); Context *get_voice_to_lyrics (Context *lyrics); -Grob *get_current_note_head (Context *voice, bool include_grace_notes); +Grob *get_current_note_head (Context *voice); Grob *get_current_rest (Context *voice); Moment measure_position (Context const *context); diff --git a/lily/lyric-engraver.cc b/lily/lyric-engraver.cc index afcfdf9015..100984062b 100644 --- a/lily/lyric-engraver.cc +++ b/lily/lyric-engraver.cc @@ -135,7 +135,7 @@ get_voice_to_lyrics (Context *lyrics) } Grob * -get_current_note_head (Context *voice, bool include_grace_notes) +get_current_note_head (Context *voice) { Moment now = voice->now_mom (); for (SCM s = voice->get_property ("busyGrobs"); @@ -149,8 +149,22 @@ get_current_note_head (Context *voice, bool include_grace_notes) continue; } - if (((end_mom->main_part_ > now.main_part_) - || (include_grace_notes && end_mom->grace_part_ > now.grace_part_)) + // It's a bit irritating that we just have the length and + // duration of the Grob. + Moment end_from_now = + get_event_length (Stream_event::unsmob (g->get_property ("cause")), now) + + now; + // We cannot actually include more than a single grace note + // using busyGrobs on ungraced lyrics since a grob ending on + // grace time will just have disappeared from busyGrobs by the + // time our ungraced lyrics appear. At best we may catch a + // single grace note. + // + // However, a single grace note ending on a non-grace time is + // indistinguishable from a proper note ending on a non-grace + // time. So we really have no way to obey includeGraceNotes + // here. Not with this mechanism. + if ((*end_mom == end_from_now) && dynamic_cast (g) && Note_head::has_interface (g)) { @@ -170,8 +184,7 @@ Lyric_engraver::stop_translation_timestep () if (voice) { - bool include_grace_notes = to_boolean (get_property ("includeGraceNotes")); - Grob *head = get_current_note_head (voice, include_grace_notes); + Grob *head = get_current_note_head (voice); if (head) { @@ -198,7 +211,6 @@ ADD_TRANSLATOR (Lyric_engraver, /* read */ "ignoreMelismata " - "includeGraceNotes " "lyricMelismaAlignment " "searchForVoice", -- 2.39.2