X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Flyric-engraver.cc;h=bad1203266f75b43842e6bdea358b6a734dc339f;hb=77267b700c377fd170abcbf4863728937038eb5e;hp=0d3ea00dee27448243201e2cb2fa6686e2ebc2ab;hpb=55ff9f5a64a00b6c369be47eb8ca3949250f120b;p=lilypond.git diff --git a/lily/lyric-engraver.cc b/lily/lyric-engraver.cc index 0d3ea00dee..bad1203266 100644 --- a/lily/lyric-engraver.cc +++ b/lily/lyric-engraver.cc @@ -36,7 +36,7 @@ class Lyric_engraver : public Engraver protected: void stop_translation_timestep (); void process_music (); - DECLARE_TRANSLATOR_LISTENER (lyric); + void listen_lyric (Stream_event *); public: TRANSLATOR_DECLARATIONS (Lyric_engraver); @@ -49,14 +49,14 @@ private: Context *get_voice_context (); }; -Lyric_engraver::Lyric_engraver () +Lyric_engraver::Lyric_engraver (Context *c) + : Engraver (c) { text_ = 0; last_text_ = 0; event_ = 0; } -IMPLEMENT_TRANSLATOR_LISTENER (Lyric_engraver, lyric); void Lyric_engraver::listen_lyric (Stream_event *ev) { @@ -95,8 +95,11 @@ get_voice_to_lyrics (Context *lyrics) bool searchForVoice = to_boolean (lyrics->get_property ("searchForVoice")); SCM avc = lyrics->get_property ("associatedVoiceContext"); - if (Context *c = Context::unsmob (avc)) - return c; + if (Context *c = unsmob (avc)) + { + if (!c->is_removable ()) + return c; + } SCM voice_name = lyrics->get_property ("associatedVoice"); string nm = lyrics->id_string (); @@ -116,26 +119,11 @@ get_voice_to_lyrics (Context *lyrics) if (!scm_is_symbol (voice_type)) return 0; - Context *parent = lyrics; - Context *voice = 0; - while (parent && !voice) - { - voice = find_context_below (parent, voice_type, nm); - parent = parent->get_parent_context (); - } - + Context *voice = find_context_near (lyrics, voice_type, nm); if (voice) return voice; - parent = lyrics; - voice = 0; - while (parent && !voice) - { - voice = find_context_below (parent, voice_type, ""); - parent = parent->get_parent_context (); - } - - return voice; + return find_context_near (lyrics, voice_type, ""); } Grob * @@ -145,8 +133,8 @@ get_current_note_head (Context *voice) for (SCM s = voice->get_property ("busyGrobs"); scm_is_pair (s); s = scm_cdr (s)) { - Grob *g = Grob::unsmob (scm_cdar (s));; - Moment *end_mom = Moment::unsmob (scm_caar (s)); + Grob *g = unsmob (scm_cdar (s));; + Moment *end_mom = unsmob (scm_caar (s)); if (!end_mom || !g) { programming_error ("busyGrobs invalid"); @@ -156,7 +144,7 @@ get_current_note_head (Context *voice) // 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) + get_event_length (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 @@ -170,7 +158,7 @@ get_current_note_head (Context *voice) // here. Not with this mechanism. if ((*end_mom == end_from_now) && dynamic_cast (g) - && Note_head::has_interface (g)) + && has_interface (g)) { return g; } @@ -206,6 +194,12 @@ Lyric_engraver::stop_translation_timestep () event_ = 0; } +void +Lyric_engraver::boot () +{ + ADD_LISTENER (Lyric_engraver, lyric); +} + ADD_TRANSLATOR (Lyric_engraver, /* doc */ "Engrave text for lyrics.",