X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fa2-engraver.cc;h=c1b5e47036eee42937a2c96988d4b75be6415528;hb=8438b824fb221159742957c2eeab761effe73be4;hp=6a08f56b79d35065854b1b0cfe11d61d8f78b275;hpb=94375d04f45b415ad705fd444fdb344416f116d9;p=lilypond.git diff --git a/lily/a2-engraver.cc b/lily/a2-engraver.cc index 6a08f56b79..c1b5e47036 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--2001 Jan Nieuwenhuizen + (c) 2000--2002 Jan Nieuwenhuizen */ #include "engraver.hh" @@ -15,6 +15,7 @@ #include "side-position-interface.hh" #include "directional-element-interface.hh" #include "multi-measure-rest.hh" +#include "tie.hh" class A2_engraver : public Engraver { @@ -22,10 +23,10 @@ class A2_engraver : public Engraver protected: virtual void acknowledge_grob (Grob_info); - virtual void create_grobs (); + virtual void process_acknowledged_grobs (); virtual void stop_translation_timestep (); private: - Item* text_p_; + Item* text_; enum State { SOLO, SPLIT_INTERVAL, UNIRHYTHM, UNISILENCE, UNISON } state_; }; @@ -33,16 +34,16 @@ private: A2_engraver::A2_engraver () { - text_p_ = 0; + text_ = 0; state_ = UNISILENCE; } void -A2_engraver::create_grobs () +A2_engraver::process_acknowledged_grobs () { if (!to_boolean (get_property ("combineParts"))) return ; - if (!text_p_) + if (!text_) { SCM unison = get_property ("unison"); SCM solo = get_property ("solo"); @@ -51,18 +52,18 @@ A2_engraver::create_grobs () if (solo_adue == SCM_BOOL_T && ((solo == SCM_BOOL_T && state_ != SOLO) || (unison == SCM_BOOL_T && state_ != UNISON - && daddy_trans_l_->id_str_.left_str (3) == "one"))) + && daddy_trans_->id_string_.left_string (3) == "one"))) { - text_p_ = new Item (get_property ("TextScript")); - Side_position_interface::set_axis (text_p_, Y_AXIS); - announce_grob (text_p_, 0); + text_ = new Item (get_property ("TextScript")); + Side_position_interface::set_axis (text_, Y_AXIS); + announce_grob(text_, SCM_EOL); Direction dir = UP; SCM text = SCM_EOL; if (solo == SCM_BOOL_T) { state_ = SOLO; - if (daddy_trans_l_->id_str_.left_str (3) == "one") + if (daddy_trans_->id_string_.left_string (3) == "one") { text = get_property ("soloText"); } @@ -75,12 +76,12 @@ A2_engraver::create_grobs () else if (unison == SCM_BOOL_T) { state_ = UNISON; - if (daddy_trans_l_->id_str_.left_str (3) == "one") + if (daddy_trans_->id_string_.left_string (3) == "one") text = get_property ("aDueText"); } - Side_position_interface::set_direction (text_p_, dir); - text_p_->set_grob_property ("text", text); + Side_position_interface::set_direction (text_, dir); + text_->set_grob_property ("text", text); } } } @@ -91,19 +92,19 @@ A2_engraver::acknowledge_grob (Grob_info i) if (!to_boolean (get_property ("combineParts"))) return ; - if (text_p_) + if (text_) { - if (Note_head::has_interface (i.grob_l_)) + if (Note_head::has_interface (i.grob_)) { - Grob*t = text_p_; - Side_position_interface::add_support (t, i.grob_l_); + Grob*t = text_; + Side_position_interface::add_support (t, i.grob_); if (Side_position_interface::get_axis (t) == X_AXIS - && !t->parent_l (Y_AXIS)) - t->set_parent (i.grob_l_, Y_AXIS); + && !t->get_parent (Y_AXIS)) + t->set_parent (i.grob_, Y_AXIS); } - if (Stem::has_interface (i.grob_l_)) + if (Stem::has_interface (i.grob_)) { - Side_position_interface::add_support (text_p_, i.grob_l_); + Side_position_interface::add_support (text_, i.grob_); } } @@ -130,83 +131,86 @@ A2_engraver::acknowledge_grob (Grob_info i) state_ = UNIRHYTHM; Direction d = CENTER; - if (daddy_trans_l_->id_str_.left_str (3) == "one") + if (daddy_trans_->id_string_.left_string (3) == "one") d = UP; - else if (daddy_trans_l_->id_str_.left_str (3) == "two") + else if (daddy_trans_->id_string_.left_string (3) == "two") d = DOWN; /* Must only set direction for VoiceCombines, not for StaffCombines: - we can't detect that here, so, ugh, yet another property */ + we can't detect that here, so we use yet another property */ if (!to_boolean (get_property ("noDirection")) - && (Stem::has_interface (i.grob_l_) - || Slur::has_interface (i.grob_l_) - // || Tie::has_interface (i.grob_l_) - || i.grob_l_->has_interface (ly_symbol2scm ("tie-interface")) - - /* - 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.grob_l_->has_interface (ly_symbol2scm ("dynamic-interface")) + && (Stem::has_interface (i.grob_) + || Slur::has_interface (i.grob_) + || Tie::has_interface (i.grob_) + /* 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.grob_->internal_has_interface (ly_symbol2scm + ("dynamic-interface")) && state_ != SOLO) - || (i.grob_l_->has_interface (ly_symbol2scm ("text-interface")) + || (i.grob_->internal_has_interface (ly_symbol2scm + ("text-interface")) && state_ != SOLO) )) { - /* - Hmm. We must set dir when solo, in order to get - the rests collided to the right position - */ - if ((unirhythm != SCM_BOOL_T) || (solo == SCM_BOOL_T) - || ((unisilence == SCM_BOOL_T && previous_state != UNISON)) - || (unirhythm == SCM_BOOL_T && split_interval == SCM_BOOL_T - && (unison != SCM_BOOL_T || solo_adue != SCM_BOOL_T))) + /* When in solo a due mode, and we have solo, every grob in + other thread gets annihilated, so we don't set dir. + + Maybe that should be optional? */ + if ((solo != SCM_BOOL_T && solo_adue == SCM_BOOL_T) + + /* When not same rhythm, we set dir */ + && (unirhythm != SCM_BOOL_T + /* When both have rests, but previously played something + different, we set dir */ + || ((unisilence == SCM_BOOL_T && previous_state != UNISON)) + /* When same rhythm, and split stems, but not same pitch + or not solo a du mode, we set dir */ + || (unirhythm == SCM_BOOL_T && split_interval == SCM_BOOL_T + && (unison != SCM_BOOL_T || solo_adue != SCM_BOOL_T)))) { - /* - Blunt axe method: every grob gets a propertysetting. - */ - i.grob_l_->set_grob_property ("direction", gh_int2scm (d)); + /* Blunt axe method: every grob gets a propertysetting. */ + i.grob_->set_grob_property ("direction", scm_int2num (d)); } } - /* - todo: should we have separate state variable for being "rest while - other has solo?" */ - if ( Multi_measure_rest::has_interface (i.grob_l_) && d ) + /* Should we have separate state variable for being "rest + while other has solo?" */ + if (Multi_measure_rest::has_interface (i.grob_) && d) if (state_ == UNIRHYTHM && unisilence != SCM_BOOL_T) { - i.grob_l_->set_grob_property ("staff-position", gh_int2scm (d * 6)); + i.grob_->set_grob_property ("staff-position", scm_int2num (d * 6)); } } void A2_engraver::stop_translation_timestep () { - if (text_p_) + if (text_) { - Side_position_interface::add_staff_support (text_p_); - typeset_grob (text_p_); - text_p_ = 0; + Side_position_interface::add_staff_support (text_); + typeset_grob (text_); + text_ = 0; } } ENTER_DESCRIPTION(A2_engraver, -/* descr */ "Part combine engraver for orchestral scores. - -The markings @emph{a2}, @emph{Solo} and @emph{Solo II}, are -created by this engraver. It also acts upon instructions of the part -combiner. Another thing that the this engraver, is forcing of stem, -slur and tie directions, always when both threads are not identical; -up for the musicexpr called @code{one}, down for the musicexpr called -@code{two}. - -", +/* descr */ "Part combine engraver for orchestral scores. " +"The markings @emph{a2}, @emph{Solo} and @emph{Solo II}, are " +"created by this engraver. It also acts upon instructions of the part " +"combiner. Another thing that the this engraver, is forcing of stem, " +"slur and tie directions, always when both threads are not identical; " +"up for the musicexpr called @code{one}, down for the musicexpr called " +"@code{two}. " +, /* creats*/ "TextScript", -/* acks */ "grob-interface tie-interface note-head-interface ", -/* reads */ "combineParts noDirection soloADue soloText soloIIText aDueText split-interval unison solo unisilence unirhythm", +/* accepts */ "", +/* acks */ "multi-measure-rest-interface " +"slur-interface stem-interface tie-interface note-head-interface dynamic-interface text-interface" +,/* reads */ "combineParts noDirection soloADue soloText soloIIText aDueText split-interval unison solo unisilence unirhythm", /* write */ "");