X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fnew-dynamic-engraver.cc;h=ac652216f7b21880b713c526c999d59b98bab93d;hb=a8c9e8a7ca320ab0df5fd32e717fd62cd7635ce6;hp=99d015067d7c039c3794bc9069246ca23b1388e4;hpb=7b9d994707d25a7cd10b53519cae1125ef4a64cc;p=lilypond.git diff --git a/lily/new-dynamic-engraver.cc b/lily/new-dynamic-engraver.cc index 99d015067d..ac652216f7 100644 --- a/lily/new-dynamic-engraver.cc +++ b/lily/new-dynamic-engraver.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2008 Han-Wen Nienhuys + (c) 2008--2009 Han-Wen Nienhuys */ @@ -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) { @@ -216,11 +239,14 @@ ADD_TRANSLATOR (New_dynamic_engraver, /* create */ "DynamicTextSpanner " "DynamicText " - "Hairpin " - "TextSpanner ", + "Hairpin ", /* read */ - "currentMusicalColumn ", + "crescendoSpanner " + "crescendoText " + "currentMusicalColumn " + "decrescendoSpanner " + "decrescendoText ", /* write */ ""