X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fmulti-measure-rest-engraver.cc;h=cd6efa31723b2ed8875264042e9daaeb850e510e;hb=7ed4019033adf7db7a8f64c4eb7b7f6d0449402f;hp=2c93ec04c695259a0dd817921a68c801f36729bd;hpb=2059367f59496fb11796bd2cf239f6b58625231e;p=lilypond.git diff --git a/lily/multi-measure-rest-engraver.cc b/lily/multi-measure-rest-engraver.cc index 2c93ec04c6..cd6efa3172 100644 --- a/lily/multi-measure-rest-engraver.cc +++ b/lily/multi-measure-rest-engraver.cc @@ -1,7 +1,8 @@ /* multi_measure_rest-engraver.cc -- implement Multi_measure_rest_engraver - (c) 1998 Jan Nieuwenhuizen + (c) 1998--1999 Jan Nieuwenhuizen + Han-Wen Nienhuys */ #include "proto.hh" @@ -9,76 +10,125 @@ #include "multi-measure-rest.hh" #include "multi-measure-rest-engraver.hh" #include "score-column.hh" +#include "engraver-group-engraver.hh" +#include "timing-translator.hh" +#include "bar.hh" + -IMPLEMENT_IS_TYPE_B1 (Multi_measure_rest_engraver, Engraver); ADD_THIS_TRANSLATOR (Multi_measure_rest_engraver); Multi_measure_rest_engraver::Multi_measure_rest_engraver () { - last_mom_ = 0; + start_measure_i_ = 0; + rest_moments_[START] = + rest_moments_[STOP] =0; multi_measure_req_l_ = 0; + + lastrest_p_ =0; mmrest_p_ = 0; } -bool -Multi_measure_rest_engraver::do_try_request (Request* req_l) +void +Multi_measure_rest_engraver::acknowledge_element (Score_element_info i) { - if (!req_l->musical () || !req_l->musical ()->multi_measure ()) - return false; - - multi_measure_req_l_ = req_l->musical ()->multi_measure (); - last_mom_ = now_moment () + multi_measure_req_l_->duration_.length (); - - return true; + if (Bar *c = dynamic_cast (i.elem_l_)) + { + if (mmrest_p_) + mmrest_p_->add_column (c); + if (lastrest_p_) + lastrest_p_->add_column (c); + } } -void -Multi_measure_rest_engraver::do_removal_processing () +bool +Multi_measure_rest_engraver::do_try_music (Music* req_l) { - if (mmrest_p_) + Rhythmic_req *r=0; + if (Multi_measure_rest_req *mr = + dynamic_cast (req_l)) + r=mr; + else if (Repetitions_req *rr = + dynamic_cast (req_l)) + r=rr; + if (r) { - typeset_element (mmrest_p_); - mmrest_p_ = 0; + if (multi_measure_req_l_) + if (!multi_measure_req_l_->equal_b (r) + || rest_moments_[START] != now_mom ()) + return false; + + multi_measure_req_l_ = r; + rest_moments_[START] = now_mom (); + + rest_moments_[STOP] = rest_moments_[START] + + multi_measure_req_l_->duration_.length_mom (); + return true; } + return false; } void Multi_measure_rest_engraver::do_process_requests () { - if (mmrest_p_ || !multi_measure_req_l_) - return; - - mmrest_p_ = new Multi_measure_rest; + if (multi_measure_req_l_ && !mmrest_p_) + { - Scalar prop = get_property ("part"); - if (prop.isnum_b ()) - part_b_ = prop.to_bool (); + Translator * tr = daddy_grav_l()->get_simple_translator ("Timing_engraver"); // ugh + Timing_translator * time = dynamic_cast (tr); -// if (!part_b_) -// return; + mmrest_p_ = new Multi_measure_rest; + if(dynamic_cast (multi_measure_req_l_)) + mmrest_p_->set_elt_property ("alt-symbol", + ly_str02scm ("scripts-repeatsign")); + announce_element (Score_element_info (mmrest_p_, multi_measure_req_l_)); + start_measure_i_ = time->bars_i (); + } +} - int measures_i = (int)multi_measure_req_l_->duration_.plet_.iso_i_; - if (part_b_) - mmrest_p_->measures_i_ = measures_i; +void +Multi_measure_rest_engraver::do_pre_move_processing () +{ + Moment now (now_mom ()); + Translator * tr = daddy_grav_l()->get_simple_translator ("Timing_engraver"); // ugh + Timing_translator * time = dynamic_cast (tr); - announce_element (Score_elem_info (mmrest_p_, multi_measure_req_l_)); - multi_measure_req_l_ = 0; + if (mmrest_p_ && (now >= rest_moments_[START]) + && !time->measure_position () + && (mmrest_p_->column_arr_.size () >= 2)) + { + typeset_element (mmrest_p_); + /* + must keep mmrest_p_ around to set measures_i_ + */ + } + if (lastrest_p_) + { + typeset_element (lastrest_p_); + lastrest_p_ = 0; + } } void -Multi_measure_rest_engraver::do_pre_move_processing () +Multi_measure_rest_engraver::do_post_move_processing () { - if (!mmrest_p_) - return; + Translator * tr = daddy_grav_l()->get_simple_translator ("Timing_engraver"); // ugh + Timing_translator * time = dynamic_cast (tr); - typeset_element (mmrest_p_); - mmrest_p_ = 0; + Moment now (now_mom ()); - if (part_b_) - return; + if (mmrest_p_ && !time->measure_position ()) + { + lastrest_p_ = mmrest_p_; + lastrest_p_->measures_i_ = time->bars_i () - start_measure_i_; + mmrest_p_ = 0; + } - if (last_mom_ <= now_moment ()) - multi_measure_req_l_ = 0; + if (now >= rest_moments_[STOP]) + { + multi_measure_req_l_ = 0; + mmrest_p_ = 0; + } } +