From: David Kastrup Date: Wed, 10 Dec 2014 17:44:16 +0000 (+0100) Subject: Issue 4625/3: Listen to and record in-chord slurs X-Git-Tag: release/2.19.29-1~20 X-Git-Url: https://git.donarmstrong.com/lilypond.git?p=lilypond.git;a=commitdiff_plain;h=77c3a9bc4eb145bf9a8e6025edd6eea43e8e3331 Issue 4625/3: Listen to and record in-chord slurs --- diff --git a/lily/include/slur-proto-engraver.hh b/lily/include/slur-proto-engraver.hh index 4e9ab8ee88..dc7566bc8a 100644 --- a/lily/include/slur-proto-engraver.hh +++ b/lily/include/slur-proto-engraver.hh @@ -32,9 +32,15 @@ protected: grob_name_ (grob_name), object_name_ (object_name), event_name_ (event_name) {} + struct Event_info { + Stream_event *slur_, *note_; + Event_info (Stream_event *slur, Stream_event *note) + : slur_ (slur), note_ (note) + { } + }; // protected so that subclasses can see them - std::vector start_events_; - std::vector stop_events_; + std::vector start_events_; + std::vector stop_events_; std::vector slurs_; std::vector end_slurs_; std::vector objects_to_acknowledge_; @@ -53,7 +59,8 @@ protected: DECLARE_END_ACKNOWLEDGER (tie); DECLARE_ACKNOWLEDGER (tuplet_number); - void listen_slur (Stream_event *ev); + void listen_note (Stream_event *ev); + void listen_slur (Stream_event *ev, Stream_event *note = 0); void acknowledge_extra_object (Grob_info); void stop_translation_timestep (); void process_music (); diff --git a/lily/phrasing-slur-engraver.cc b/lily/phrasing-slur-engraver.cc index 0a571dc79e..479be1df22 100644 --- a/lily/phrasing-slur-engraver.cc +++ b/lily/phrasing-slur-engraver.cc @@ -35,6 +35,7 @@ class Phrasing_slur_engraver : public Slur_proto_engraver { protected: DECLARE_TRANSLATOR_LISTENER (phrasing_slur); + DECLARE_TRANSLATOR_LISTENER (note); DECLARE_ACKNOWLEDGER (slur); public: @@ -61,6 +62,13 @@ Phrasing_slur_engraver::listen_phrasing_slur (Stream_event *ev) Slur_proto_engraver::listen_slur (ev); } +IMPLEMENT_TRANSLATOR_LISTENER (Phrasing_slur_engraver, note); +void +Phrasing_slur_engraver::listen_note (Stream_event *ev) +{ + Slur_proto_engraver::listen_note (ev); +} + void Phrasing_slur_engraver::acknowledge_slur (Grob_info info) { diff --git a/lily/slur-engraver.cc b/lily/slur-engraver.cc index ed5fef7a56..581136791d 100644 --- a/lily/slur-engraver.cc +++ b/lily/slur-engraver.cc @@ -37,6 +37,7 @@ class Slur_engraver : public Slur_proto_engraver protected: DECLARE_TRANSLATOR_LISTENER (slur); + DECLARE_TRANSLATOR_LISTENER (note); public: SCM event_symbol (); @@ -62,6 +63,13 @@ Slur_engraver::listen_slur (Stream_event *ev) Slur_proto_engraver::listen_slur (ev); } +IMPLEMENT_TRANSLATOR_LISTENER (Slur_engraver, note); +void +Slur_engraver::listen_note (Stream_event *ev) +{ + Slur_proto_engraver::listen_note (ev); +} + void Slur_engraver::set_melisma (bool m) { diff --git a/lily/slur-proto-engraver.cc b/lily/slur-proto-engraver.cc index a47db20162..51160e2b3b 100644 --- a/lily/slur-proto-engraver.cc +++ b/lily/slur-proto-engraver.cc @@ -37,23 +37,41 @@ void Slur_proto_engraver::derived_mark () const { for (vsize i = start_events_.size (); i--;) - scm_gc_mark (start_events_[i]->self_scm ()); + { + scm_gc_mark (start_events_[i].slur_->self_scm ()); + scm_gc_mark (start_events_[i].note_->self_scm ()); + } for (vsize i = stop_events_.size (); i--;) - scm_gc_mark (stop_events_[i]->self_scm ()); + { + scm_gc_mark (stop_events_[i].slur_->self_scm ()); + scm_gc_mark (stop_events_[i].note_->self_scm ()); + } } void -Slur_proto_engraver::listen_slur (Stream_event *ev) +Slur_proto_engraver::listen_slur (Stream_event *ev, Stream_event *note) { Direction d = to_dir (ev->get_property ("span-direction")); if (d == START) - start_events_.push_back (ev); + start_events_.push_back (Event_info (ev, note)); else if (d == STOP) - stop_events_.push_back (ev); + stop_events_.push_back (Event_info (ev, note)); else ev->origin ()->warning (_f ("direction of %s invalid: %d", event_name_, int (d))); } +void +Slur_proto_engraver::listen_note (Stream_event *ev) +{ + for (SCM arts = ev->get_property ("articulations"); + scm_is_pair (arts); arts = scm_cdr (arts)) + { + Stream_event *art = unsmob (scm_car (arts)); + if (art->in_event_class (event_symbol ())) + listen_slur (art, ev); + } +} + void Slur_proto_engraver::acknowledge_note_column (Grob_info info) { @@ -231,25 +249,27 @@ Slur_proto_engraver::process_music () { for (vsize i = 0; i < stop_events_.size (); i++) { - string id = robust_scm2string (stop_events_[i]->get_property ("spanner-id"), ""); - bool ended = try_to_end (stop_events_[i]); + string id = robust_scm2string + (stop_events_[i].slur_->get_property ("spanner-id"), ""); + bool ended = try_to_end (stop_events_[i].slur_); if (ended) { // Ignore redundant stop events for this id for (vsize j = stop_events_.size (); --j > i;) { - if (id == robust_scm2string (stop_events_[j]->get_property ("spanner-id"), "")) + if (id == robust_scm2string + (stop_events_[j].slur_->get_property ("spanner-id"), "")) stop_events_.erase (stop_events_.begin () + j); } } else - stop_events_[i]->origin ()->warning (_f ("cannot end %s", object_name_)); + stop_events_[i].slur_->origin ()->warning (_f ("cannot end %s", object_name_)); } vsize old_slurs = slurs_.size (); for (vsize i = start_events_.size (); i--;) { - Stream_event *ev = start_events_[i]; + Stream_event *ev = start_events_[i].slur_; string id = robust_scm2string (ev->get_property ("spanner-id"), ""); Direction updown = to_dir (ev->get_property ("direction"));