X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fdynamic-engraver.cc;h=ab242f653c0c760d1247bcd8eb30739a988fc8a9;hb=9f3572d98bb948c9689cd1f75401a029451fa001;hp=daba7713865d3c82d43b6a8f8603992fb23a852d;hpb=04265f11d1f21416ccebd2dcaa1d903dc781b36e;p=lilypond.git diff --git a/lily/dynamic-engraver.cc b/lily/dynamic-engraver.cc index daba771386..ab242f653c 100644 --- a/lily/dynamic-engraver.cc +++ b/lily/dynamic-engraver.cc @@ -21,7 +21,6 @@ #include "self-alignment-interface.hh" #include "side-position-interface.hh" #include "staff-symbol-referencer.hh" -#include "stream-event.hh" #include "warn.hh" #include "translator.icc" @@ -51,10 +50,10 @@ class Dynamic_engraver : public Engraver Spanner *finished_line_spanner_; Spanner *finished_cresc_; - Stream_event *script_ev_; - Stream_event *current_cresc_ev_; + Music *script_ev_; + Music *current_cresc_ev_; - Drul_array accepted_spanevents_drul_; + Drul_array accepted_spanevents_drul_; vector pending_columns_; vector pending_elements_; @@ -67,11 +66,10 @@ class Dynamic_engraver : public Engraver DECLARE_ACKNOWLEDGER (stem_tremolo); DECLARE_ACKNOWLEDGER (note_column); DECLARE_ACKNOWLEDGER (slur); - DECLARE_TRANSLATOR_LISTENER (absolute_dynamic); - DECLARE_TRANSLATOR_LISTENER (span_dynamic); protected: virtual void finalize (); + virtual bool try_music (Music *event); void stop_translation_timestep (); void process_music (); }; @@ -90,30 +88,28 @@ Dynamic_engraver::Dynamic_engraver () accepted_spanevents_drul_[STOP] = 0; } -IMPLEMENT_TRANSLATOR_LISTENER (Dynamic_engraver, absolute_dynamic); -void -Dynamic_engraver::listen_absolute_dynamic (Stream_event *ev) +bool +Dynamic_engraver::try_music (Music *m) { - /* - TODO: probably broken. - */ - ASSIGN_EVENT_ONCE (script_ev_, ev); -} + if (m->is_mus_type ("absolute-dynamic-event")) + { + /* + TODO: probably broken. + */ + script_ev_ = m; + return true; + } + else if (m->is_mus_type ("decrescendo-event") + || m->is_mus_type ("crescendo-event")) + { + Direction d = to_dir (m->get_property ("span-direction")); -IMPLEMENT_TRANSLATOR_LISTENER (Dynamic_engraver, span_dynamic); -void -Dynamic_engraver::listen_span_dynamic (Stream_event *ev) -{ - Direction d = to_dir (ev->get_property ("span-direction")); - - if (d == START) - ASSIGN_EVENT_ONCE (accepted_spanevents_drul_[START], ev); - - /* Cancel any ongoing crescendo, either explicitly by \! or - implicitly by a new crescendo. Also avoid warning if cresc is - cancelled both implicitly and explicitly. */ - if ((d == STOP || current_cresc_ev_) && !accepted_spanevents_drul_[STOP]) - ASSIGN_EVENT_ONCE (accepted_spanevents_drul_[STOP], ev); + accepted_spanevents_drul_[d] = m; + if (current_cresc_ev_ && d == START) + accepted_spanevents_drul_[STOP] = m; + return true; + } + return false; } void @@ -123,7 +119,7 @@ Dynamic_engraver::process_music () { if (!line_spanner_) { - Stream_event *rq = accepted_spanevents_drul_[START]; + Music *rq = accepted_spanevents_drul_[START]; line_spanner_ = make_spanner ("DynamicLineSpanner", rq ? rq->self_scm () : SCM_EOL); if (script_ev_) rq = script_ev_; @@ -157,7 +153,7 @@ Dynamic_engraver::process_music () Axis_group_interface::add_element (line_spanner_, script_); } - Stream_event *stop_ev = accepted_spanevents_drul_ [STOP] + Music *stop_ev = accepted_spanevents_drul_ [STOP] ? accepted_spanevents_drul_[STOP] : script_ev_; if (accepted_spanevents_drul_[STOP] || script_ev_) @@ -193,7 +189,7 @@ Dynamic_engraver::process_music () if (current_cresc_ev_) { string msg = _ ("already have a decrescendo"); - if (current_cresc_ev_->in_event_class ("crescendo-event")) + if (current_cresc_ev_->is_mus_type ("decrescendo-event")) msg = _ ("already have a crescendo"); accepted_spanevents_drul_[START]->origin ()->warning (msg); @@ -209,19 +205,16 @@ Dynamic_engraver::process_music () /* TODO: Use symbols. */ + + string start_type + = ly_symbol2string (current_cresc_ev_->get_property ("name")); - SCM start_sym = current_cresc_ev_->get_property ("class"); - string start_type; - - if (start_sym == ly_symbol2scm ("decrescendo-event")) + if (start_type == "DecrescendoEvent") start_type = "decrescendo"; - else if (start_sym == ly_symbol2scm ("crescendo-event")) + else if (start_type == "CrescendoEvent") start_type = "crescendo"; - else - { - programming_error ("unknown dynamic spanner type"); - return; - } + + /* UGH. TODO: should read from original event, so appearance @@ -241,6 +234,9 @@ Dynamic_engraver::process_music () ly_symbol2scm ("adjacent-hairpins"), finished_cresc_); } + cresc_->set_property ("grow-direction", + scm_from_int ((start_type == "crescendo") + ? BIGGER : SMALLER)); } /*