- for (vsize i = 0; i < stop_events_.size (); i++)
- {
- Stream_event *ev = stop_events_[i];
- string id = robust_scm2string (ev->get_property ("spanner-id"), "");
-
- // Find the slur that is ended with this event (by checking the spanner-id)
- bool ended = false;
- 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);
- }
- }
- if (!ended)
- ev->origin ()->warning (_ ("cannot end slur"));
- }
-
- for (vsize i = start_events_.size (); i--;)
- {
- Stream_event *ev = start_events_[i];
- string id = robust_scm2string (ev->get_property ("spanner-id"), "");
- bool have_slur = false;
- // 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"), ""));
-
- if (have_slur)
- {
- // We already have a slur, so give a warning and completely ignore
- // the new slur.
- ev->origin ()->warning (_ ("already have slur"));
- start_events_.erase (start_events_.begin () + i);
- }
- else
- {
- Grob *slur = make_spanner ("Slur", ev->self_scm ());
- Direction updown = to_dir (ev->get_property ("direction"));
- slur->set_property ("spanner-id", ly_string2scm (id));
- if (updown)
- set_grob_direction (slur, updown);
- slurs_.push_back (slur);
-
- if (to_boolean (get_property ("doubleSlurs")))
- {
- set_grob_direction (slur, DOWN);
- slur = make_spanner ("Slur", ev->self_scm ());
- slur->set_property ("spanner-id", ly_string2scm (id));
- set_grob_direction (slur, UP);
- slurs_.push_back (slur);
- }
- }
- }
- set_melisma (slurs_.size ());