X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;ds=sidebyside;f=lily%2Fslur-engraver.cc;h=79f04d6203cf6b0f7bc41897a2c401a0b0b38064;hb=743f0d4b067e76d591487f085240a7ff9ace85a7;hp=45aa121a71eebd00cf0580fbf6d33ed42febd13d;hpb=54b02666750062788185bd3f99e644d621e348c2;p=lilypond.git diff --git a/lily/slur-engraver.cc b/lily/slur-engraver.cc index 45aa121a71..79f04d6203 100644 --- a/lily/slur-engraver.cc +++ b/lily/slur-engraver.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1997--2011 Han-Wen Nienhuys + Copyright (C) 1997--2012 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -30,7 +30,6 @@ #include "translator.icc" - /* NOTE NOTE NOTE @@ -38,7 +37,7 @@ apply there too. (on principle, engravers don't use inheritance for code sharing) - + */ /* @@ -50,17 +49,19 @@ class Slur_engraver : public Engraver { vector start_events_; vector stop_events_; - vector slurs_; - vector end_slurs_; + vector slurs_; + vector end_slurs_; + vector objects_to_acknowledge_; void set_melisma (bool); protected: DECLARE_TRANSLATOR_LISTENER (slur); - DECLARE_ACKNOWLEDGER (accidental); + DECLARE_ACKNOWLEDGER (inline_accidental); DECLARE_ACKNOWLEDGER (fingering); DECLARE_ACKNOWLEDGER (note_column); DECLARE_ACKNOWLEDGER (script); + DECLARE_ACKNOWLEDGER (dots); DECLARE_ACKNOWLEDGER (text_script); DECLARE_ACKNOWLEDGER (tie); DECLARE_ACKNOWLEDGER (tuplet_number); @@ -71,7 +72,6 @@ protected: virtual void finalize (); - public: TRANSLATOR_DECLARATIONS (Slur_engraver); }; @@ -86,11 +86,11 @@ Slur_engraver::listen_slur (Stream_event *ev) { Direction d = to_dir (ev->get_property ("span-direction")); if (d == START) - start_events_.push_back(ev); + start_events_.push_back (ev); else if (d == STOP) - stop_events_.push_back(ev); + stop_events_.push_back (ev); else ev->origin ()->warning (_f ("direction of %s invalid: %d", - "slur-event", int (d))); + "slur-event", int (d))); } void @@ -112,11 +112,17 @@ Slur_engraver::acknowledge_note_column (Grob_info info) void Slur_engraver::acknowledge_extra_object (Grob_info info) { - Slur::auxiliary_acknowledge_extra_object (info, slurs_, end_slurs_); + objects_to_acknowledge_.push_back (info); +} + +void +Slur_engraver::acknowledge_inline_accidental (Grob_info info) +{ + acknowledge_extra_object (info); } void -Slur_engraver::acknowledge_accidental (Grob_info info) +Slur_engraver::acknowledge_dots (Grob_info info) { acknowledge_extra_object (info); } @@ -172,13 +178,21 @@ Slur_engraver::process_music () // Find the slur that is ended with this event (by checking the spanner-id) bool ended = false; + SCM starter = SCM_BOOL_F; for (vsize j = slurs_.size (); j--;) { if (id == robust_scm2string (slurs_[j]->get_property ("spanner-id"), "")) { - ended = true; - end_slurs_.push_back (slurs_[j]); - slurs_.erase (slurs_.begin () + j); + // We end only one slur unless several ones have been + // caused by the same event, like with double slurs. + if (!ended || scm_is_eq (starter, + slurs_[j]->get_property ("cause"))) + { + ended = true; + starter = slurs_[j]->get_property ("cause"); + end_slurs_.push_back (slurs_[j]); + slurs_.erase (slurs_.begin () + j); + } } } if (!ended) @@ -193,17 +207,21 @@ Slur_engraver::process_music () // Check if we already have a slur with the same spanner-id. // In that case, don't create a new slur, but print a warning for (vsize j = 0; j < slurs_.size (); j++) - have_slur = have_slur || (id == robust_scm2string (slurs_[j]->get_property ("spanner-id"), "")); - + have_slur = have_slur || (id == robust_scm2string (slurs_[j]->get_property ("spanner-id"), "")); + if (have_slur) { // We already have a slur, so give a warning and completely ignore // the new slur. - ev->origin ()->warning(_ ("already have slur")); + ev->origin ()->warning (_ ("already have slur")); start_events_.erase (start_events_.begin () + i); } - else - { + } + for (vsize i = start_events_.size (); i--;) + { + Stream_event *ev = start_events_[i]; + string id = robust_scm2string (ev->get_property ("spanner-id"), ""); + Grob *slur = make_spanner ("Slur", ev->self_scm ()); Direction updown = to_dir (ev->get_property ("direction")); slur->set_property ("spanner-id", ly_string2scm (id)); @@ -219,7 +237,6 @@ Slur_engraver::process_music () set_grob_direction (slur, UP); slurs_.push_back (slur); } - } } set_melisma (slurs_.size ()); } @@ -230,44 +247,49 @@ Slur_engraver::stop_translation_timestep () if (Grob *g = unsmob_grob (get_property ("currentCommandColumn"))) { for (vsize i = 0; i < end_slurs_.size (); i++) - Slur::add_extra_encompass (end_slurs_[i], g); + Slur::add_extra_encompass (end_slurs_[i], g); if (!start_events_.size ()) - for (vsize i = 0; i < slurs_.size (); i++) - Slur::add_extra_encompass (slurs_[i], g); + for (vsize i = 0; i < slurs_.size (); i++) + Slur::add_extra_encompass (slurs_[i], g); } - - + for (vsize i = 0; i < end_slurs_.size (); i++) { - Spanner * s = dynamic_cast (end_slurs_[i]); + Spanner *s = dynamic_cast (end_slurs_[i]); if (!s->get_bound (RIGHT)) - s->set_bound (RIGHT, unsmob_grob (get_property ("currentMusicalColumn"))); + s->set_bound (RIGHT, unsmob_grob (get_property ("currentMusicalColumn"))); announce_end_grob (s, SCM_EOL); } + + for (vsize i = 0; i < objects_to_acknowledge_.size (); i++) + Slur::auxiliary_acknowledge_extra_object (objects_to_acknowledge_[i], slurs_, end_slurs_); + + objects_to_acknowledge_.clear (); end_slurs_.clear (); start_events_.clear (); stop_events_.clear (); } -ADD_ACKNOWLEDGER (Slur_engraver, accidental); +ADD_ACKNOWLEDGER (Slur_engraver, inline_accidental); ADD_ACKNOWLEDGER (Slur_engraver, fingering); ADD_ACKNOWLEDGER (Slur_engraver, note_column); ADD_ACKNOWLEDGER (Slur_engraver, script); ADD_ACKNOWLEDGER (Slur_engraver, text_script); +ADD_ACKNOWLEDGER (Slur_engraver, dots); ADD_ACKNOWLEDGER (Slur_engraver, tie); ADD_ACKNOWLEDGER (Slur_engraver, tuplet_number); ADD_TRANSLATOR (Slur_engraver, - /* doc */ - "Build slur grobs from slur events.", + /* doc */ + "Build slur grobs from slur events.", - /* create */ - "Slur ", + /* create */ + "Slur ", - /* read */ - "slurMelismaBusy " - "doubleSlurs ", + /* read */ + "slurMelismaBusy " + "doubleSlurs ", - /* write */ - "" - ); + /* write */ + "" + );