X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fmulti-measure-rest-engraver.cc;h=38318d19b952e5109b72739b5413fe7bf9f60f8a;hb=a6ee9dcd388111e842064a8d46ab06c4897a00d2;hp=e60294316123fb474ccd099e05b4fabb33f5f242;hpb=7d2ec0f1c47d211f243cf5646b35ef5298d8c82a;p=lilypond.git diff --git a/lily/multi-measure-rest-engraver.cc b/lily/multi-measure-rest-engraver.cc index e602943161..38318d19b9 100644 --- a/lily/multi-measure-rest-engraver.cc +++ b/lily/multi-measure-rest-engraver.cc @@ -1,141 +1,186 @@ /* multi_measure_rest-engraver.cc -- implement Multi_measure_rest_engraver - (c) 1998--1999 Jan Nieuwenhuizen + (c) 1998--2002 Jan Nieuwenhuizen Han-Wen Nienhuys */ -#include "proto.hh" #include "musical-request.hh" #include "multi-measure-rest.hh" -#include "multi-measure-rest-engraver.hh" #include "paper-column.hh" #include "engraver-group-engraver.hh" -#include "timing-translator.hh" -#include "bar.hh" -#include "staff-symbol-referencer.hh" +#include "staff-symbol-referencer.hh" +#include "engraver.hh" +#include "moment.hh" +#include "spanner.hh" -ADD_THIS_TRANSLATOR (Multi_measure_rest_engraver); +/** + The name says it all: make multi measure rests -Multi_measure_rest_engraver::Multi_measure_rest_engraver () +*/ +class Multi_measure_rest_engraver : public Engraver { - start_measure_i_ = 0; - rest_moments_[START] = - rest_moments_[STOP] =0; - multi_measure_req_l_ = 0; +public: + TRANSLATOR_DECLARATIONS(Multi_measure_rest_engraver); - lastrest_p_ =0; - mmrest_p_ = 0; -} +protected: + virtual bool try_music (Music*); + virtual void process_music (); + virtual void stop_translation_timestep (); + virtual void start_translation_timestep (); + virtual void finalize (); -void -Multi_measure_rest_engraver::acknowledge_element (Score_element_info i) +private: + Span_req * new_req_; + Span_req * busy_span_req_; + Span_req * stop_req_; + int start_measure_; + Moment start_moment_; + + Spanner *mmrest_; + Spanner *lastrest_; +}; + + + +Multi_measure_rest_engraver::Multi_measure_rest_engraver () { - if (Bar *c = dynamic_cast (i.elem_l_)) - { - if (mmrest_p_) - mmrest_p_->add_column (c); - if (lastrest_p_) - lastrest_p_->add_column (c); - } + start_measure_ = 0; + mmrest_ = lastrest_ =0; + new_req_ = busy_span_req_ = stop_req_ =0; } + bool -Multi_measure_rest_engraver::do_try_music (Music* req_l) +Multi_measure_rest_engraver::try_music (Music* req) { - 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) + if (Span_req * sp = dynamic_cast (req)) { - 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; + if (scm_equal_p (sp->get_mus_property ("span-type"), + ly_str02scm ("rest")) == SCM_BOOL_T) + { + if (sp->get_span_dir () == STOP) + { + stop_req_ = sp; + } + else if (sp->get_span_dir () == START && !new_req_) + { + new_req_ = sp; + } + return true; + } } return false; } void -Multi_measure_rest_engraver::do_process_requests () +Multi_measure_rest_engraver::process_music () { - if (multi_measure_req_l_ && !mmrest_p_) + if (new_req_ && stop_req_) + stop_req_ = 0; + + if (new_req_) + start_moment_ = now_mom (); + + if (stop_req_) + { + busy_span_req_ =0; + stop_req_ = 0; + } + + if (new_req_) { + busy_span_req_ = new_req_; + new_req_ =0; + } - Translator * tr = daddy_grav_l()->get_simple_translator ("Timing_engraver"); // ugh - Timing_translator * time = dynamic_cast (tr); + if (busy_span_req_ && !mmrest_) + { + mmrest_ = new Spanner (get_property ("MultiMeasureRest")); - mmrest_p_ = new Multi_measure_rest; - Staff_symbol_referencer_interface si (mmrest_p_); - si.set_interface (); + announce_grob(mmrest_, busy_span_req_->self_scm()); + start_measure_ + = gh_scm2int (get_property ("currentBarNumber")); + } - - 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_ - = gh_int2scm (time->get_property ("currentBarNumber", 0)); + if (gh_string_p (get_property ("whichBar"))) + { + Grob *cmc = unsmob_grob (get_property( "currentCommandColumn")); + Item *it = dynamic_cast (cmc); + if (mmrest_) + add_bound_item (mmrest_, it); + if (lastrest_) + add_bound_item (lastrest_,it); } } void -Multi_measure_rest_engraver::do_pre_move_processing () +Multi_measure_rest_engraver::stop_translation_timestep () { - Moment now (now_mom ()); - Translator * tr = daddy_grav_l()->get_simple_translator ("Timing_engraver"); // ugh - Timing_translator * time = dynamic_cast (tr); - + SCM smp = get_property ("measurePosition"); + Moment mp = (unsmob_moment (smp)) ? *unsmob_moment (smp) : Moment (0); - if (mmrest_p_ && (now >= rest_moments_[START]) - && !time->measure_position () - && (scm_ilength (mmrest_p_->get_elt_property ("columns")) >= 2)) + if (mmrest_ && (now_mom () >= start_moment_) + && !mp.to_bool () + && mmrest_->get_bound (LEFT) && mmrest_->get_bound (RIGHT)) { - typeset_element (mmrest_p_); + typeset_grob (mmrest_); /* - must keep mmrest_p_ around to set measures_i_ + we must keep mmrest_ around to set measure-count, so + no mmrest_ = 0 here. */ } - if (lastrest_p_) + + if (lastrest_) { - typeset_element (lastrest_p_); - lastrest_p_ = 0; + /* sanity check */ + if (lastrest_->get_bound (LEFT) && lastrest_->get_bound (RIGHT) + && lastrest_->get_bound (LEFT) != lastrest_->get_bound (RIGHT)) + typeset_grob (lastrest_); + lastrest_ = 0; } -} - -void -Multi_measure_rest_engraver::do_post_move_processing () -{ - Translator * tr = daddy_grav_l()->get_simple_translator ("Timing_engraver"); // ugh - Timing_translator * time = dynamic_cast (tr); - - Moment now (now_mom ()); - if (mmrest_p_ && !time->measure_position ()) + if (new_req_) { - lastrest_p_ = mmrest_p_; - lastrest_p_->measures_i_ - = gh_int2scm (time->get_property ("currentBarNumber", 0)) - start_measure_i_; - mmrest_p_ = 0; + busy_span_req_ = new_req_; + new_req_ =0; } + +} - if (now >= rest_moments_[STOP]) +void +Multi_measure_rest_engraver::start_translation_timestep () +{ + SCM smp = get_property ("measurePosition"); + Moment mp = (unsmob_moment (smp)) ? *unsmob_moment (smp) : Moment (0); + + if (mmrest_ && !mp.to_bool ()) { - multi_measure_req_l_ = 0; - mmrest_p_ = 0; + lastrest_ = mmrest_; + int cur = gh_scm2int (get_property ("currentBarNumber")); + lastrest_->set_grob_property ("measure-count", + gh_int2scm (cur - start_measure_)); + mmrest_ = 0; } } +void +Multi_measure_rest_engraver::finalize () +{ + if (mmrest_) + typeset_grob (mmrest_); + if (lastrest_) + typeset_grob (lastrest_); +} + +ENTER_DESCRIPTION(Multi_measure_rest_engraver, +/* descr */ "Engraves multi-measure rests that are produced with @code{R}. Reads +measurePosition and currentBarNumber to determine what number to print over the MultiMeasureRest +", +/* creats*/ "MultiMeasureRest", +/* acks */ "", +/* reads */ "currentBarNumber currentCommandColumn measurePosition", +/* write */ "");