]> git.donarmstrong.com Git - lilypond.git/commitdiff
Fix #241.
authorHan-Wen Nienhuys <hanwen@xs4all.nl>
Tue, 16 Jan 2007 13:54:10 +0000 (14:54 +0100)
committerHan-Wen Nienhuys <hanwen@xs4all.nl>
Tue, 16 Jan 2007 13:54:10 +0000 (14:54 +0100)
Also check for context switch after processing lyric event.
Don't set associatedVoice in set_music_context, but rather
just before processing lyrics.

input/regression/lyric-combine-switch-voice-2.ly [new file with mode: 0644]
lily/lyric-combine-music-iterator.cc

diff --git a/input/regression/lyric-combine-switch-voice-2.ly b/input/regression/lyric-combine-switch-voice-2.ly
new file mode 100644 (file)
index 0000000..27f6d4f
--- /dev/null
@@ -0,0 +1,29 @@
+\header
+{
+texidoc = "switching voices halfway a lyricsto is possible."
+  }
+\version "2.10.12"
+
+<<
+  \relative \new Voice = "lahlah" {
+    c4
+    <<
+      \new Voice = "alternative" {
+        \voiceOne
+       \override NoteColumn #'force-hshift = #-3
+       a'4 
+      } 
+      { \voiceTwo
+        c,4
+       \oneVoice
+      } >>
+    c4 c 
+    
+  }
+  \new Lyrics \lyricsto "lahlah" {
+    \set associatedVoice = alternative
+    two  
+    \set associatedVoice = lahlah
+    two this
+  } 
+>>
index 4235289486e89262bcd0eb621be698c44cf000c8..e6fcf4ea0a4a42d9cbb640b36e145cb9f360842d 100644 (file)
@@ -57,7 +57,8 @@ private:
   Context *music_context_;
   SCM lyricsto_voice_name_;
 
-  bool busy_;
+  Moment busy_moment_;
+  
   Music_iterator *lyric_iter_;
 };
 
@@ -68,17 +69,26 @@ Lyric_combine_music_iterator::Lyric_combine_music_iterator ()
   lyric_iter_ = 0;
   music_context_ = 0;
   lyrics_context_ = 0;
-  busy_ = false;
+  busy_moment_.set_infinite (-1);
 }
 
+
+/*
+  It's dubious whether we can ever make this fully work.  Due to
+  associatedVoice switching, this routine may be triggered for 
+  the wrong music_context_ 
+ */
 IMPLEMENT_LISTENER (Lyric_combine_music_iterator, set_busy)
 void
 Lyric_combine_music_iterator::set_busy (SCM se)
 {
   Stream_event *e = unsmob_stream_event (se);
 
-  if (e->in_event_class ("note-event") || e->in_event_class ("cluster-note-event"))
-    busy_ = true;
+  if ((e->in_event_class ("note-event") || e->in_event_class ("cluster-note-event"))
+      && music_context_)
+    busy_moment_ = max (music_context_->now_mom (),
+                       busy_moment_);
+  
 }
 
 void
@@ -87,22 +97,19 @@ Lyric_combine_music_iterator::set_music_context (Context *to)
   if (music_context_)
     {
       music_context_->event_source()->remove_listener (GET_LISTENER (set_busy), ly_symbol2scm ("music-event"));
-      lyrics_context_->unset_property (ly_symbol2scm ("associatedVoiceContext"));
     }
 
   music_context_ = to;
   if (to)
     {
       to->event_source()->add_listener (GET_LISTENER (set_busy), ly_symbol2scm ("music-event"));
-      if (lyrics_context_)
-       lyrics_context_->set_property ("associatedVoiceContext", to->self_scm ());
     }
 }
 
 bool
 Lyric_combine_music_iterator::start_new_syllable () const
 {
-  if (!busy_)
+  if (busy_moment_ < music_context_->now_mom ())
     return false;
 
   if (!lyrics_context_)
@@ -283,12 +290,16 @@ Lyric_combine_music_iterator::process (Moment)
        pending_grace_lyric_ = false;
       
       Moment m = lyric_iter_->pending_moment ();
+      lyrics_context_->set_property (ly_symbol2scm ("associatedVoiceContext"),
+                                    music_context_->self_scm ());
       lyric_iter_->process (m);
 
       music_found_ = true;
     }
 
-  busy_ = false;
+  new_voice = find_voice ();
+  if (new_voice)
+    set_music_context (new_voice);
 }
 
 void