- {
- current_cresc_ev_ = accepted_spanevents_drul_[START];
-
- if (Direction d = to_dir (current_cresc_ev_->get_property ("direction")))
- set_grob_direction (line_spanner_, d);
-
- /*
- TODO: Use symbols.
- */
-
- String start_type
- = ly_symbol2string (current_cresc_ev_->get_property ("name"));
-
- /*
- ugh. Use push/pop?
- */
- if (start_type == "DecrescendoEvent")
- start_type = "decrescendo";
- else if (start_type == "CrescendoEvent")
- start_type = "crescendo";
-
- SCM s = get_property ((start_type + "Spanner").to_str0 ());
- if (!scm_is_symbol (s) || s == ly_symbol2scm ("hairpin"))
- {
- cresc_ = make_spanner ("Hairpin", accepted_spanevents_drul_[START]->self_scm ());
- if (finished_cresc_)
- {
- Pointer_group_interface::add_grob (finished_cresc_,
- ly_symbol2scm ("adjacent-hairpins"),
- cresc_);
-
- Pointer_group_interface::add_grob (cresc_,
- ly_symbol2scm ("adjacent-hairpins"),
- finished_cresc_);
- }
- cresc_->set_property ("grow-direction",
- scm_from_int ((start_type == "crescendo")
- ? BIGGER : SMALLER));
- }
-
- /*
- This is a convenient (and legacy) interface to TextSpanners
- for use in (de)crescendi.
- Hmm.
- */
- else
- {
- cresc_ = make_spanner ("DynamicTextSpanner", accepted_spanevents_drul_[START]->self_scm ());
- cresc_->set_property ("style", s);
- context ()->set_property ((start_type
- + "Spanner").to_str0 (), SCM_EOL);
- s = get_property ((start_type + "Text").to_str0 ());
- /*
- FIXME: use get_markup () to check type.
- */
- if (scm_is_string (s) || scm_is_pair (s))
- {
- cresc_->set_property ("edge-text",
- scm_cons (s, scm_makfrom0str ("")));
- context ()->set_property ((start_type + "Text").to_str0 (),
- SCM_EOL);
- }
- }
-
- if (script_)
- {
- cresc_->set_bound (LEFT, script_);
- add_bound_item (line_spanner_, cresc_->get_bound (LEFT));
- }
-
- Axis_group_interface::add_element (line_spanner_, cresc_);
- }
+ {
+ if (!scm_is_eq (cresc_type, ly_symbol2scm ("hairpin")))
+ {
+ string as_string = ly_scm_write_string (cresc_type);
+ current_span_event_
+ ->origin ()->warning (_f ("unknown crescendo style: %s\ndefaulting to hairpin.", as_string.c_str ()));
+ }
+ current_spanner_ = make_spanner ("Hairpin",
+ current_span_event_->self_scm ());
+ }
+ // if we have a break-dynamic-span event right after the start dynamic, break the new spanner immediately
+ if (end_new_spanner_)
+ {
+ current_spanner_->set_property ("spanner-broken", SCM_BOOL_T);
+ end_new_spanner_ = false;
+ }
+ if (finished_spanner_)
+ {
+ if (has_interface<Hairpin> (finished_spanner_))
+ Pointer_group_interface::add_grob (finished_spanner_,
+ ly_symbol2scm ("adjacent-spanners"),
+ current_spanner_);
+ if (has_interface<Hairpin> (current_spanner_))
+ Pointer_group_interface::add_grob (current_spanner_,
+ ly_symbol2scm ("adjacent-spanners"),
+ finished_spanner_);
+ }