Rietveld Code Review Tool
Help | Bug tracker | Discussion group | Source code | Sign in
(799)

Unified Diff: lily/phrasing-slur-engraver.cc

Issue 7424049: Allows slurs to break at barlines.
Patch Set: Breaks slurs at repeats by default. Created 12 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Please Sign in to add in-line comments.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: lily/phrasing-slur-engraver.cc
diff --git a/lily/phrasing-slur-engraver.cc b/lily/phrasing-slur-engraver.cc
index 7e6c3c63fe3d8b0e026022e2ad555d767ca4dfda..2830f4a3dc29a4b488b2fb47e6dc26958bbe54e6 100644
--- a/lily/phrasing-slur-engraver.cc
+++ b/lily/phrasing-slur-engraver.cc
@@ -52,9 +52,11 @@ class Phrasing_slur_engraver : public Engraver
vector<Grob *> slurs_;
vector<Grob *> end_slurs_;
vector<Grob_info> objects_to_acknowledge_;
+ Stream_event *break_slur_;
protected:
DECLARE_TRANSLATOR_LISTENER (phrasing_slur);
+ DECLARE_TRANSLATOR_LISTENER (break_phrasing_slur);
DECLARE_ACKNOWLEDGER (inline_accidental);
DECLARE_ACKNOWLEDGER (fingering);
DECLARE_ACKNOWLEDGER (note_column);
@@ -102,6 +104,13 @@ Phrasing_slur_engraver::listen_phrasing_slur (Stream_event *ev)
"phrasing-slur-event", int (d)));
}
+IMPLEMENT_TRANSLATOR_LISTENER (Phrasing_slur_engraver, break_phrasing_slur);
+void
+Phrasing_slur_engraver::listen_break_phrasing_slur (Stream_event *ev)
+{
+ ASSIGN_EVENT_ONCE (break_slur_, ev);
+}
+
void
Phrasing_slur_engraver::acknowledge_note_column (Grob_info info)
{
@@ -181,6 +190,34 @@ Phrasing_slur_engraver::finalize ()
void
Phrasing_slur_engraver::process_music ()
{
+ if (break_slur_
+ && unsmob_grob (get_property ("currentCommandColumn")))
+ {
+ for (vsize i = slurs_.size (); i--;)
+ {
+ Grob *ccc = unsmob_grob (get_property ("currentCommandColumn"));
+ Spanner *s = dynamic_cast<Spanner *> (slurs_[i]);
+ s->set_bound (RIGHT, ccc);
+ announce_end_grob (s, SCM_EOL);
+ slurs_.erase (slurs_.begin () + i);
+ if (robust_scm2dir (break_slur_->get_property ("side-to-junk"), CENTER) == LEFT)
+ s->suicide ();
+
+ if (robust_scm2dir (break_slur_->get_property ("side-to-junk"), CENTER) != RIGHT)
+ {
+ SCM spanner_id = s->get_property ("spanner-id");
+ Spanner *slur = make_spanner ("Slur", s->self_scm ());
+ slur->set_property ("spanner-id", spanner_id);
+ if (scm_is_number (s->get_property_data ("direction")))
+ set_grob_direction (slur, robust_scm2dir (s->get_property ("direction"), UP));
+ slur->set_bound (LEFT, ccc);
+ slurs_.push_back (slur);
+ }
+ }
+ }
+ else if (to_boolean (get_property ("breakSlurHere")))
+ warning ("no current command column to break slur");
+
for (vsize i = 0; i < stop_events_.size (); i++)
{
Stream_event *ev = stop_events_[i];
@@ -305,6 +342,7 @@ Phrasing_slur_engraver::stop_translation_timestep ()
end_slurs_.clear ();
start_events_.clear ();
stop_events_.clear ();
+ break_slur_ = 0;
}
ADD_ACKNOWLEDGER (Phrasing_slur_engraver, inline_accidental);

Powered by Google App Engine
RSS Feeds Recent Issues | This issue
This is Rietveld f62528b