protected:
void stop_translation_timestep ();
void process_music ();
- DECLARE_TRANSLATOR_LISTENER (lyric);
+ void listen_lyric (Stream_event *);
public:
TRANSLATOR_DECLARATIONS (Lyric_engraver);
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)
{
SCM avc = lyrics->get_property ("associatedVoiceContext");
if (Context *c = unsmob<Context> (avc))
- return c;
+ {
+ if (!c->is_removable ())
+ return c;
+ }
SCM voice_name = lyrics->get_property ("associatedVoice");
string nm = lyrics->id_string ();
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 *
// here. Not with this mechanism.
if ((*end_mom == end_from_now)
&& dynamic_cast<Item *> (g)
- && Note_head::has_interface (g))
+ && has_interface<Note_head> (g))
{
return g;
}
event_ = 0;
}
+void
+Lyric_engraver::boot ()
+{
+ ADD_LISTENER (Lyric_engraver, lyric);
+}
+
ADD_TRANSLATOR (Lyric_engraver,
/* doc */
"Engrave text for lyrics.",