X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fa2-engraver.cc;h=f52b9f03875d22bde03f4fa5c0c066a61c1b492b;hb=a2991295b2c1fb36bec19de207161855ca3c1756;hp=34039b43ea8289db0c0b2d754d206a026e0d3658;hpb=f988425624a6f6d1a48aea0ac0c1c84ff0857e56;p=lilypond.git diff --git a/lily/a2-engraver.cc b/lily/a2-engraver.cc index 34039b43ea..f52b9f0387 100644 --- a/lily/a2-engraver.cc +++ b/lily/a2-engraver.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 2000 Jan Nieuwenhuizen + (c) 2000--2001 Jan Nieuwenhuizen */ #include "engraver.hh" @@ -14,19 +14,17 @@ #include "translator-group.hh" #include "side-position-interface.hh" #include "directional-element-interface.hh" +#include "multi-measure-rest.hh" class A2_engraver : public Engraver { public: A2_engraver (); VIRTUAL_COPY_CONS (Translator); - protected: - virtual void do_process_music (); - virtual void acknowledge_element (Score_element_info); - - virtual void do_pre_move_processing (); - + virtual void acknowledge_grob (Grob_info); + virtual void create_grobs (); + virtual void stop_translation_timestep (); private: Item* text_p_; enum State { SOLO, SPLIT_INTERVAL, UNIRHYTHM, UNISILENCE, UNISON } state_; @@ -41,7 +39,7 @@ A2_engraver::A2_engraver () } void -A2_engraver::do_process_music () +A2_engraver::create_grobs () { if (!to_boolean (get_property ("combineParts"))) return ; @@ -54,18 +52,18 @@ A2_engraver::do_process_music () if (solo_adue == SCM_BOOL_T && ((solo == SCM_BOOL_T && state_ != SOLO) || (unison == SCM_BOOL_T && state_ != UNISON - && daddy_trans_l_->id_str_ == "one"))) + && daddy_trans_l_->id_str_.left_str (3) == "one"))) { - text_p_ = new Item (get_property ("basicTextScriptProperties")); - Side_position::set_axis (text_p_, Y_AXIS); - announce_element (text_p_, 0); + text_p_ = new Item (get_property ("TextScript")); + Side_position_interface::set_axis (text_p_, Y_AXIS); + announce_grob (text_p_, 0); Direction dir = UP; SCM text; if (solo == SCM_BOOL_T) { state_ = SOLO; - if (daddy_trans_l_->id_str_ == "one") + if (daddy_trans_l_->id_str_.left_str (3) == "one") { text = get_property ("soloText"); } @@ -78,18 +76,18 @@ A2_engraver::do_process_music () else if (unison == SCM_BOOL_T) { state_ = UNISON; - if (daddy_trans_l_->id_str_ == "one") + if (daddy_trans_l_->id_str_.left_str (3) == "one") text = get_property ("aDueText"); } - Side_position::set_direction (text_p_, dir); - text_p_->set_elt_property ("text", text); + Side_position_interface::set_direction (text_p_, dir); + text_p_->set_grob_property ("text", text); } } } void -A2_engraver::acknowledge_element (Score_element_info i) +A2_engraver::acknowledge_grob (Grob_info i) { if (!to_boolean (get_property ("combineParts"))) return ; @@ -98,15 +96,15 @@ A2_engraver::acknowledge_element (Score_element_info i) { if (Note_head::has_interface (i.elem_l_)) { - Score_element*t = text_p_; - Side_position::add_support (t, i.elem_l_); - if (Side_position::get_axis (t) == X_AXIS + Grob*t = text_p_; + Side_position_interface::add_support (t, i.elem_l_); + if (Side_position_interface::get_axis (t) == X_AXIS && !t->parent_l (Y_AXIS)) t->set_parent (i.elem_l_, Y_AXIS); } if (Stem::has_interface (i.elem_l_)) { - Side_position::add_support (text_p_, i.elem_l_); + Side_position_interface::add_support (text_p_, i.elem_l_); } } @@ -131,12 +129,33 @@ A2_engraver::acknowledge_element (Score_element_info i) state_ = SPLIT_INTERVAL; else if (unirhythm) state_ = UNIRHYTHM; + + Direction d = CENTER; + if (daddy_trans_l_->id_str_.left_str (3) == "one") + d = UP; + else if (daddy_trans_l_->id_str_.left_str (3) == "two") + d = DOWN; + + /* Must only set direction for VoiceCombines, not for StaffCombines: + we can't detect that here, so, ugh, yet another property */ + if (!to_boolean (get_property ("noDirection")) + && (Stem::has_interface (i.elem_l_) + || Slur::has_interface (i.elem_l_) + // || Tie::has_interface (i.elem_l_) + || i.elem_l_->has_interface (ly_symbol2scm ("tie-interface")) - if (Stem::has_interface (i.elem_l_) - || Slur::has_interface (i.elem_l_) - // || Text_item::has_interface (i.elem_l_) - //|| Crescendo::has_interface (i.elem_l_) - ) + /* + Usually, dynamics are removed by *_devnull_engravers for the + second voice. On the one hand, we don't want all dynamics for + the first voice to be placed above the staff. On the other + hand, colliding of scripts may be worse. + So, we don't set directions for these when we're playing solo. + */ + || (i.elem_l_->has_interface (ly_symbol2scm ("dynamic-interface")) + && state_ != SOLO) + || (i.elem_l_->has_interface (ly_symbol2scm ("text-interface")) + && state_ != SOLO) + )) { /* Hmm. We must set dir when solo, in order to get @@ -147,25 +166,32 @@ A2_engraver::acknowledge_element (Score_element_info i) || (unirhythm == SCM_BOOL_T && split_interval == SCM_BOOL_T && (unison != SCM_BOOL_T || solo_adue != SCM_BOOL_T))) { - if (daddy_trans_l_->id_str_ == "one") - { - i.elem_l_->set_elt_property ("direction", gh_int2scm (1)); - } - else if (daddy_trans_l_->id_str_ == "two") - { - i.elem_l_->set_elt_property ("direction", gh_int2scm (-1)); - } + + /* + Blunt axe method: every grob gets a propertysetting. + */ + i.elem_l_->set_grob_property ("direction", gh_int2scm (d)); } } + + /* + todo: should we have separate state variable for being "rest while + other has solo?" */ + if ( Multi_measure_rest::has_interface (i.elem_l_) && d ) + if (state_ == UNIRHYTHM + && unisilence != SCM_BOOL_T) + { + i.elem_l_->set_grob_property ("staff-position", gh_int2scm (d * 6)); + } } void -A2_engraver::do_pre_move_processing () +A2_engraver::stop_translation_timestep () { if (text_p_) { - Side_position::add_staff_support (text_p_); - typeset_element (text_p_); + Side_position_interface::add_staff_support (text_p_); + typeset_grob (text_p_); text_p_ = 0; } }