X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Flaissez-vibrer-engraver.cc;h=f707964eb77970613deddc46a4014c2b36387e6d;hb=9e781b7dc83b60a543ce218aa1a5f139f74c760f;hp=693cba6d6c3dfb2e443259c4bc6b546481bda9dd;hpb=a6bd229f7fe1dc4a03478e14ccc0c0c66b225061;p=lilypond.git diff --git a/lily/laissez-vibrer-engraver.cc b/lily/laissez-vibrer-engraver.cc index 693cba6d6c..f707964eb7 100644 --- a/lily/laissez-vibrer-engraver.cc +++ b/lily/laissez-vibrer-engraver.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2005--2010 Han-Wen Nienhuys + Copyright (C) 2005--2014 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify @@ -29,7 +29,7 @@ class Laissez_vibrer_engraver : public Engraver { Stream_event *event_; Grob *lv_column_; - vector lv_ties_; + vector lv_ties_; void stop_translation_timestep (); DECLARE_ACKNOWLEDGER (note_head); @@ -63,19 +63,35 @@ 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"))) { @@ -90,16 +106,16 @@ Laissez_vibrer_engraver::acknowledge_note_head (Grob_info inf) 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 */ + "" + );