X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fnew-dynamic-engraver.cc;fp=lily%2Fnew-dynamic-engraver.cc;h=ac652216f7b21880b713c526c999d59b98bab93d;hb=2459c66ea8366f6541be25728973975ee0bc4d62;hp=8c8fce980044c14834050ff7b3d9fb4fce1838e8;hpb=bbaf60edda2d5dd759050c1046cbd9865f3affbd;p=lilypond.git diff --git a/lily/new-dynamic-engraver.cc b/lily/new-dynamic-engraver.cc index 8c8fce9800..ac652216f7 100644 --- a/lily/new-dynamic-engraver.cc +++ b/lily/new-dynamic-engraver.cc @@ -32,7 +32,11 @@ class New_dynamic_engraver : public Engraver protected: virtual void process_music (); virtual void stop_translation_timestep (); + virtual void finalize (); + private: + string get_spanner_type (Stream_event *ev); + Drul_array accepted_spanevents_drul_; Spanner *current_spanner_; Spanner *finished_spanner_; @@ -75,7 +79,7 @@ New_dynamic_engraver::process_music () if (current_spanner_ && (accepted_spanevents_drul_[STOP] || script_event_ || accepted_spanevents_drul_[START])) { - Stream_event* ender = accepted_spanevents_drul_[STOP]; + Stream_event *ender = accepted_spanevents_drul_[STOP]; if (!ender) ender = script_event_; @@ -91,20 +95,8 @@ New_dynamic_engraver::process_music () if (accepted_spanevents_drul_[START]) { current_span_event_ = accepted_spanevents_drul_[START]; - - SCM start_sym = current_span_event_->get_property ("class"); - string start_type; - - if (start_sym == ly_symbol2scm ("decrescendo-event")) - start_type = "decrescendo"; - else if (start_sym == ly_symbol2scm ("crescendo-event")) - start_type = "crescendo"; - else - { - programming_error ("unknown dynamic spanner type"); - return; - } - + + string start_type = get_spanner_type (current_span_event_); SCM cresc_type = get_property ((start_type + "Spanner").c_str ()); if (cresc_type == ly_symbol2scm ("text")) @@ -123,7 +115,6 @@ New_dynamic_engraver::process_music () { if (cresc_type != ly_symbol2scm ("hairpin")) { - // Fixme: should put value in error message. 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())); @@ -185,6 +176,38 @@ New_dynamic_engraver::stop_translation_timestep () finished_spanner_ = 0; } +void +New_dynamic_engraver::finalize () +{ + if (current_spanner_ + && !current_spanner_->is_live ()) + current_spanner_ = 0; + if (current_spanner_) + { + current_span_event_ + ->origin ()->warning (_f ("unterminated %s", + get_spanner_type (current_span_event_) + .c_str ())); + current_spanner_->suicide (); + current_spanner_ = 0; + } +} + +string +New_dynamic_engraver::get_spanner_type (Stream_event *ev) +{ + string type; + SCM start_sym = ev->get_property ("class"); + + if (start_sym == ly_symbol2scm ("decrescendo-event")) + type = "decrescendo"; + else if (start_sym == ly_symbol2scm ("crescendo-event")) + type = "crescendo"; + else + programming_error ("unknown dynamic spanner type"); + return type; +} + void New_dynamic_engraver::acknowledge_note_column (Grob_info info) {