X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fnew-lyric-combine-music-iterator.cc;h=105d78ef75e5ca69fbaaa83ec7444e89219afde1;hb=015bb3813eb4ac879df0561e5c6e28e9d1146792;hp=4977c0019f26d6fc0f29f2924b490b864679dd5a;hpb=304b5f3aa7eee7b0ff8d4ba7526a1410735f6e74;p=lilypond.git diff --git a/lily/new-lyric-combine-music-iterator.cc b/lily/new-lyric-combine-music-iterator.cc index 4977c0019f..105d78ef75 100644 --- a/lily/new-lyric-combine-music-iterator.cc +++ b/lily/new-lyric-combine-music-iterator.cc @@ -1,19 +1,16 @@ -/* -new-lyric-combine-iterator.cc -- implement New_lyric_combine_music_iterator - -source file of the GNU LilyPond music typesetter - -(c) 2004 Han-Wen Nienhuys - - */ +/* + new-lyric-combine-iterator.cc -- implement New_lyric_combine_music_iterator + + source file of the GNU LilyPond music typesetter + + (c) 2004--2005 Han-Wen Nienhuys +*/ #include "context.hh" -#include "lyric-combine-music.hh" #include "event.hh" #include "grob.hh" #include "music-iterator.hh" - class New_lyric_combine_music_iterator : public Music_iterator { public: @@ -29,14 +26,17 @@ protected: virtual bool run_always ()const; virtual bool ok () const; virtual void derived_mark () const; - virtual void derived_substitute (Context *,Context *); + virtual void derived_substitute (Context *, Context *); private: bool start_new_syllable () ; void find_voice (); + bool music_found_; bool made_association_; - Context * lyrics_context_; - Context * music_context_; + Context *lyrics_context_; + Context *music_context_; + SCM lyricsto_voice_name_; + Music_iterator * lyric_iter_; }; @@ -49,9 +49,10 @@ static Music *melisma_playing_ev; New_lyric_combine_music_iterator::New_lyric_combine_music_iterator () { + music_found_ = false; made_association_ = false; - lyric_iter_ =0; - music_context_ =0; + lyric_iter_ = 0; + music_context_ = 0; lyrics_context_ = 0; /* @@ -126,8 +127,8 @@ void New_lyric_combine_music_iterator::derived_substitute (Context *f, Context *t) { if (lyric_iter_) - lyric_iter_->substitute_outlet (f,t); - if (lyrics_context_ && lyrics_context_==f) + lyric_iter_->substitute_outlet (f, t); + if (lyrics_context_ && lyrics_context_ == f) lyrics_context_ = t; if (music_context_ && music_context_ == f) music_context_ = t; @@ -140,11 +141,14 @@ New_lyric_combine_music_iterator::construct_children () Music *m = unsmob_music (get_music ()->get_property ("element")); lyric_iter_ = unsmob_iterator (get_iterator (m)); + lyricsto_voice_name_ = get_music ()->get_property ("associated-context"); + + find_voice (); if (lyric_iter_) lyrics_context_ = find_context_below (lyric_iter_->get_outlet (), - "Lyrics", ""); + ly_symbol2scm ("Lyrics"), ""); /* We do not create a Lyrics context, because the user might @@ -156,25 +160,33 @@ New_lyric_combine_music_iterator::construct_children () void New_lyric_combine_music_iterator::find_voice () { - if (!music_context_) + SCM voice_name = lyricsto_voice_name_; + SCM running = lyrics_context_ ? lyrics_context_->get_property ("associatedVoice") : SCM_EOL; + + if (scm_is_string (running)) + voice_name = running; + + if (scm_is_string (voice_name) + && (!music_context_ || ly_scm2string (voice_name) != music_context_->id_string ())) { - SCM voice_name = get_music ()->get_property ("associated-context"); - - if (gh_string_p (voice_name)) - { - Context *t = get_outlet (); - while (t && t->daddy_context_) - t = t->daddy_context_; - - String name = ly_scm2string (voice_name); - Context *voice = find_context_below (t, "Voice", name); - if (!voice) - get_music ()->origin ()->warning (_f ("cannot find Voice: %s\n", - name.to_str0 ())); - else - music_context_ = voice; - - } + /* + (spaghettini). + + Need to set associatedVoiceContext again + */ + if (music_context_) + made_association_ = false; + + Context *t = get_outlet (); + while (t && t->get_parent_context ()) + t = t->get_parent_context (); + + String name = ly_scm2string (voice_name); + Context *voice = find_context_below (t, ly_symbol2scm ("Voice"), name); + + + if (voice) + music_context_ = voice; } if (lyrics_context_ && music_context_) @@ -195,7 +207,7 @@ New_lyric_combine_music_iterator::process (Moment ) if (!music_context_) return ; - if (!music_context_->daddy_context_) + if (!music_context_->get_parent_context ()) { /* The melody has died. @@ -210,14 +222,28 @@ New_lyric_combine_music_iterator::process (Moment ) if (music_context_ && start_new_syllable () && lyric_iter_->ok ()) { - Moment m= lyric_iter_->pending_moment (); + Moment m = lyric_iter_->pending_moment (); lyric_iter_->process (m); + + music_found_ = true; } } void New_lyric_combine_music_iterator::do_quit () { + if (!music_found_) + { + SCM voice_name = get_music ()->get_property ("associated-context"); + + String name; + if (scm_is_string (voice_name)) + name = ly_scm2string (voice_name); + + get_music ()->origin ()->warning (_f ("cannot find Voice `%s'", + name.to_str0 ()) + "\n"); + } + if (lyric_iter_) lyric_iter_->quit (); }