X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fdynamic-engraver.cc;h=121d55fdfb6d5271343f99b782f178668dc57073;hb=abc2e31b608746a1ac924085a87244cc32ee7178;hp=1b7107f80d3ddbbf6bbfdb3392939302c7cbac2d;hpb=e99a6533b0a5cfdf1d8ec5b00ed4010459285deb;p=lilypond.git diff --git a/lily/dynamic-engraver.cc b/lily/dynamic-engraver.cc index 1b7107f80d..121d55fdfb 100644 --- a/lily/dynamic-engraver.cc +++ b/lily/dynamic-engraver.cc @@ -3,25 +3,61 @@ source file of the GNU LilyPond music typesetter - (c) 1997--1998 Han-Wen Nienhuys + (c) 1997--1999 Han-Wen Nienhuys */ #include "debug.hh" #include "crescendo.hh" #include "dynamic-engraver.hh" #include "musical-request.hh" -#include "text-item.hh" #include "lookup.hh" #include "paper-def.hh" #include "score-column.hh" -#include "staff-sym.hh" +#include "staff-symbol.hh" #include "note-column.hh" +#include "text-item.hh" +#include "staff-side.hh" +#include "engraver.hh" +#include "stem.hh" +#include "note-head.hh" + +/** + print text & hairpin dynamics. + */ +class Dynamic_engraver : public Engraver +{ + Text_item * text_p_; + Staff_side_item * staff_side_p_; + Staff_side_spanner * ss_span_p_; + Staff_side_spanner * to_end_ss_span_p_; + + + Crescendo * to_end_cresc_p_; + Crescendo * cresc_p_; + Span_req * cresc_req_l_; + Array dynamic_req_l_arr_; + void typeset_all (); +public: + VIRTUAL_COPY_CONS(Translator); + Dynamic_engraver(); + +protected: + virtual void do_removal_processing (); + virtual void acknowledge_element (Score_element_info); + virtual bool do_try_music (Music *req_l); + virtual void do_process_requests(); + virtual void do_pre_move_processing(); + virtual void do_post_move_processing(); +}; + + Dynamic_engraver::Dynamic_engraver() { do_post_move_processing(); - dir_ = CENTER; - dynamic_p_ =0; + text_p_ =0; + staff_side_p_ =0; to_end_cresc_p_ = cresc_p_ = 0; + ss_span_p_ = to_end_ss_span_p_=0; cresc_req_l_ = 0; } @@ -32,58 +68,95 @@ Dynamic_engraver::do_post_move_processing() } bool -Dynamic_engraver::do_try_request (Request * r) +Dynamic_engraver::do_try_music (Music * m) { - Musical_req * m = r->access_Musical_req (); - if (!m) - return false; - Dynamic_req * d = m->access_Dynamic_req (); - if (!d) - return false; + Request * r = dynamic_cast (m); -#if 0 - if (cresc_p_ && d->access_Span_dynamic_req () - && d->access_Span_dynamic_req ()->spantype == Span_req::START) + if(Text_script_req * d = dynamic_cast (r)) + { + if (d->style_str_ != "dynamic") + return false; + } + else if (Span_req * s = dynamic_cast (r)) + { + if (s-> span_type_str_ != "crescendo" + && s->span_type_str_ != "decrescendo") + return false; + } + else return false; -#endif + for (int i=0; i < dynamic_req_l_arr_.size (); i++) - if (d->equal_b (dynamic_req_l_arr_[i])) + if (r->equal_b (dynamic_req_l_arr_[i])) return true; - - dynamic_req_l_arr_.push (m->access_Dynamic_req ()); + + dynamic_req_l_arr_.push (r); return true; } + + void Dynamic_engraver::do_process_requests() { Crescendo* new_cresc_p=0; + Staff_side_spanner * new_sss_p =0; for (int i=0; i < dynamic_req_l_arr_.size(); i++) { - Dynamic_req *dreq_l = dynamic_req_l_arr_[i]; - if (dreq_l->access_Absolute_dynamic_req ()) + if (Text_script_req *absd = + dynamic_cast ( dynamic_req_l_arr_[i])) { - - if (dynamic_p_) + if (text_p_) { dynamic_req_l_arr_[i]->warning (_("Got a dynamic already. Continuing dazed and confused")); continue; } - Text_def * td_p = new Text_def; - td_p->align_dir_ = CENTER; - String loud = dreq_l->access_Absolute_dynamic_req ()->loudness_str (); - td_p->text_str_ = paper ()->lookup_l (0)->dynamic (loud).str_; - td_p->style_str_ = "dynamic"; + String loud = absd->text_str_; + + text_p_ = new Text_item; + text_p_->text_str_ = loud; // ugh + Scalar prop = get_property ("dynamicStyle", 0); + + text_p_->style_str_ = prop.length_i () ? prop : "dynamic"; + + staff_side_p_ = new Staff_side_item; + staff_side_p_->set_elt_property (script_priority_scm_sym, + gh_int2scm (100)); + + staff_side_p_->set_victim (text_p_); + staff_side_p_->axis_ = Y_AXIS; + staff_side_p_->dir_ = DOWN; + prop = get_property ("verticalDirection", 0); + if (prop.isdir_b()) + { + staff_side_p_->dir_ = Direction (int (prop)); + } - dynamic_p_ = new Text_item (td_p); - announce_element (Score_element_info (dynamic_p_, dreq_l)); + prop = get_property ("dynamicDir", 0); + if (prop.isnum_b ()) + { + staff_side_p_->dir_ = (Direction) (int) prop; + } + if (absd->dir_) + { + staff_side_p_->dir_ = absd->dir_; + } + + prop = get_property ("dynamicPadding", 0); + if (prop.isnum_b ()) + { + staff_side_p_->set_elt_property (padding_scm_sym, + gh_double2scm(Real(prop))); + } + announce_element (Score_element_info (text_p_, absd)); + announce_element (Score_element_info (staff_side_p_, absd)); } - else if (dreq_l->access_Span_dynamic_req ()) + else if (Span_req *span_l + = dynamic_cast (dynamic_req_l_arr_[i])) { - Span_dynamic_req* span_l = dreq_l->access_Span_dynamic_req (); - if (span_l->spantype == Span_req::STOP) + if (span_l->span_dir_ == STOP) { if (!cresc_p_) { @@ -93,16 +166,46 @@ Dynamic_engraver::do_process_requests() { assert (!to_end_cresc_p_); to_end_cresc_p_ =cresc_p_; + to_end_ss_span_p_ = ss_span_p_ ; + cresc_p_ = 0; + ss_span_p_ =0; + + + + + Scalar prop = get_property ("verticalDirection", 0); + if (prop.isdir_b()) + { + to_end_ss_span_p_->dir_ = Direction (int (prop)); + } + prop = get_property ("dynamicDir", 0); + if (prop.isdir_b ()) + { + to_end_ss_span_p_->dir_ = (Direction) (int) prop; + } + prop = get_property ("dynamicPadding", 0); + if (prop.isnum_b ()) + { + to_end_ss_span_p_->set_elt_property (padding_scm_sym, + gh_double2scm(Real(prop))); + } } } - else if (span_l->spantype == Span_req::START) + else if (span_l->span_dir_ == START) { cresc_req_l_ = span_l; assert (!new_cresc_p); new_cresc_p = new Crescendo; - new_cresc_p->grow_dir_ = span_l->dynamic_dir_; + new_cresc_p->grow_dir_ = (span_l->span_type_str_ == "crescendo") ? BIGGER : SMALLER; announce_element (Score_element_info (new_cresc_p, span_l)); + + new_sss_p = new Staff_side_spanner; + new_sss_p->set_victim (new_cresc_p); + new_sss_p->axis_ = Y_AXIS; + // UGH.! + // new_sss_p->set_elt_property (dangling_scm_sym, SCM_BOOL_T); + announce_element (Score_element_info (new_sss_p, span_l)); } } } @@ -113,14 +216,20 @@ Dynamic_engraver::do_process_requests() { ::warning (_ ("Too many crescendi here")); typeset_element (cresc_p_); + typeset_element (ss_span_p_); cresc_p_ = 0; + ss_span_p_ =0; } cresc_p_ = new_cresc_p; - cresc_p_->set_bounds(LEFT,get_staff_info().musical_l ()); - if (dynamic_p_) + ss_span_p_ = new_sss_p; + cresc_p_->set_bounds(LEFT,get_staff_info().musical_pcol_l ()); + ss_span_p_->set_bounds (LEFT,get_staff_info().musical_pcol_l ()); + if (text_p_) { cresc_p_->dyn_b_drul_[LEFT] = true; + if (to_end_cresc_p_) + to_end_cresc_p_->dyn_b_drul_[RIGHT] = true; } } } @@ -128,39 +237,11 @@ Dynamic_engraver::do_process_requests() void Dynamic_engraver::do_pre_move_processing() { - Staff_symbol* s_l = get_staff_info().staff_sym_l_; - if (to_end_cresc_p_) - { - if (dynamic_p_) - to_end_cresc_p_->dyn_b_drul_[RIGHT]=true; - - - Scalar prop = get_property ("dynamicdir"); - if (prop.isnum_b ()) - { - to_end_cresc_p_->dir_ = (Direction) (int) prop; - } - to_end_cresc_p_->set_bounds(RIGHT,get_staff_info().musical_l ()); - to_end_cresc_p_->add_support (s_l); - typeset_element (to_end_cresc_p_); - to_end_cresc_p_ = 0; - } - if (dynamic_p_) - { - Scalar prop = get_property ("dynamicdir"); - if (prop.isnum_b ()) - { - dynamic_p_->dir_ = (Direction) (int) prop; - } - - dynamic_p_->add_support (s_l); - typeset_element (dynamic_p_); - dynamic_p_ = 0; - } + typeset_all (); } -IMPLEMENT_IS_TYPE_B1(Dynamic_engraver,Engraver); + ADD_THIS_TRANSLATOR(Dynamic_engraver); void @@ -169,34 +250,52 @@ Dynamic_engraver::do_removal_processing () if (cresc_p_) { typeset_element (cresc_p_ ); - + typeset_element (ss_span_p_); + ss_span_p_ =0; cresc_req_l_->warning (_ ("unended crescendo")); cresc_p_ =0; } + typeset_all (); +} + + +void +Dynamic_engraver::typeset_all () +{ if (to_end_cresc_p_) { + to_end_cresc_p_->set_bounds(RIGHT,get_staff_info().musical_pcol_l ()); + to_end_ss_span_p_->set_bounds(RIGHT,get_staff_info().musical_pcol_l ()); typeset_element (to_end_cresc_p_); + typeset_element (to_end_ss_span_p_); to_end_cresc_p_ =0; + to_end_ss_span_p_ =0; } - if (dynamic_p_) + + if (text_p_) { - typeset_element (dynamic_p_); - dynamic_p_ =0; + typeset_element (text_p_); + typeset_element (staff_side_p_); + text_p_ =0; + staff_side_p_ =0; } } + void Dynamic_engraver::acknowledge_element (Score_element_info i) { - if (i.elem_l_->is_type_b (Note_column::static_name ())) + if (dynamic_cast (i.elem_l_) + || dynamic_cast (i.elem_l_) + ) { - if (dynamic_p_) - dynamic_p_->add_support (i.elem_l_); + if (staff_side_p_) + staff_side_p_->add_support (i.elem_l_); - if (to_end_cresc_p_) - to_end_cresc_p_->add_support (i.elem_l_); + if (to_end_ss_span_p_) + to_end_ss_span_p_->add_support (i.elem_l_); - if (cresc_p_) - cresc_p_->add_support (i.elem_l_); + if (ss_span_p_) + ss_span_p_->add_support (i.elem_l_); } }