/*
This file is part of LilyPond, the GNU music typesetter.
- Copyright (C) 2005--2011 Han-Wen Nienhuys <hanwen@xs4all.nl>
+ Copyright (C) 2005--2015 Han-Wen Nienhuys <hanwen@xs4all.nl>
LilyPond is free software: you can redistribute it and/or modify
{
Stream_event *event_;
Grob *lv_column_;
- vector<Grob*> lv_ties_;
+ vector<Grob *> lv_ties_;
void stop_translation_timestep ();
- DECLARE_ACKNOWLEDGER (note_head);
+ void acknowledge_note_head (Grob_info);
protected:
- DECLARE_TRANSLATOR_LISTENER (laissez_vibrer);
+ void listen_laissez_vibrer (Stream_event *);
public:
TRANSLATOR_DECLARATIONS (Laissez_vibrer_engraver);
};
-Laissez_vibrer_engraver::Laissez_vibrer_engraver ()
+Laissez_vibrer_engraver::Laissez_vibrer_engraver (Context *c)
+ : Engraver (c)
{
event_ = 0;
lv_column_ = 0;
lv_ties_.clear ();
}
-IMPLEMENT_TRANSLATOR_LISTENER (Laissez_vibrer_engraver, laissez_vibrer);
void
Laissez_vibrer_engraver::listen_laissez_vibrer (Stream_event *ev)
{
void
Laissez_vibrer_engraver::acknowledge_note_head (Grob_info inf)
{
- if (!event_)
+ /* use the heard event_ for all note heads, or an individual event for just
+ * a single note head (attached as an articulation inside a chord) */
+ Stream_event *tie_ev = event_;
+ Grob *head = inf.grob ();
+ Stream_event *note_ev = unsmob<Stream_event> (head->get_property ("cause"));
+ if (!tie_ev && note_ev && note_ev->in_event_class ("note-event"))
+ {
+ SCM articulations = note_ev->get_property ("articulations");
+ for (SCM s = articulations; !tie_ev && scm_is_pair (s); s = scm_cdr (s))
+ {
+ Stream_event *ev = unsmob<Stream_event> (scm_car (s));
+ if (ev && ev->in_event_class ("laissez-vibrer-event"))
+ tie_ev = ev;
+ }
+ }
+
+ if (!tie_ev)
return;
- SCM cause = event_->self_scm ();
+ SCM cause = tie_ev->self_scm ();
if (!lv_column_)
lv_column_ = make_item ("LaissezVibrerTieColumn", cause);
Grob *lv_tie = make_item ("LaissezVibrerTie", cause);
- lv_tie->set_object ("note-head", inf.grob ()->self_scm ());
+ lv_tie->set_object ("note-head", head->self_scm ());
Pointer_group_interface::add_grob (lv_column_, ly_symbol2scm ("ties"),
- lv_tie);
+ lv_tie);
- if (is_direction (unsmob_stream_event (cause)->get_property ("direction")))
+ if (is_direction (unsmob<Stream_event> (cause)->get_property ("direction")))
{
- Direction d = to_dir (unsmob_stream_event (cause)->get_property ("direction"));
+ Direction d = to_dir (unsmob<Stream_event> (cause)->get_property ("direction"));
lv_tie->set_property ("direction", scm_from_int (d));
}
lv_ties_.push_back (lv_tie);
}
-ADD_ACKNOWLEDGER (Laissez_vibrer_engraver, note_head);
+void
+Laissez_vibrer_engraver::boot ()
+{
+ ADD_LISTENER (Laissez_vibrer_engraver, laissez_vibrer);
+ ADD_ACKNOWLEDGER (Laissez_vibrer_engraver, note_head);
+}
+
ADD_TRANSLATOR (Laissez_vibrer_engraver,
- /* doc */
- "Create laissez vibrer items.",
+ /* doc */
+ "Create laissez vibrer items.",
- /* create */
- "LaissezVibrerTie "
- "LaissezVibrerTieColumn ",
+ /* create */
+ "LaissezVibrerTie "
+ "LaissezVibrerTieColumn ",
- /* read */
- "",
+ /* read */
+ "",
- /* write */
- ""
- );
+ /* write */
+ ""
+ );