]> git.donarmstrong.com Git - lilypond.git/commitdiff
Issue 4030: Lyrics associated to a Staff are placed on top of each other
authorDavid Kastrup <dak@gnu.org>
Thu, 4 Sep 2014 13:07:20 +0000 (15:07 +0200)
committerDavid Kastrup <dak@gnu.org>
Mon, 8 Sep 2014 16:27:04 +0000 (18:27 +0200)
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
lily/include/context.hh
lily/lyric-engraver.cc

index 9ffdd234058dd9c6a91662a6ce759774210fa6ee..f951c3a3c7263ab5189128be0259d3c5e28f7f98 100644 (file)
@@ -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 */
                 ""
index ab406c9041623d48e88b9aa8a9b9d24aac1a3122..ae21895590144800486d8f0ae27e28457ac7e5f3 100644 (file)
@@ -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);
index afcfdf90153be10d9ab954ca2263c1306320115e..100984062bcb28486e93fbc1cb3b8df90409dd4c 100644 (file)
@@ -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<Item *> (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",