X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fmulti-measure-rest-engraver.cc;h=4f1115a98a3727c41fea67705aad8fe5d815a69c;hb=f9efd2c54b174591fa42889557686c7aea356547;hp=de6975998a9ab50f19d576a4a9fbfa647d3a4b01;hpb=fbb6d20e9f58d691ffe845284cbb4d8bacf9ca60;p=lilypond.git diff --git a/lily/multi-measure-rest-engraver.cc b/lily/multi-measure-rest-engraver.cc index de6975998a..4f1115a98a 100644 --- a/lily/multi-measure-rest-engraver.cc +++ b/lily/multi-measure-rest-engraver.cc @@ -1,36 +1,36 @@ /* multi_measure_rest-engraver.cc -- implement Multi_measure_rest_engraver - (c) 1998--2000 Jan Nieuwenhuizen + (c) 1998--2002 Jan Nieuwenhuizen Han-Wen Nienhuys */ -#include "proto.hh" #include "musical-request.hh" #include "multi-measure-rest.hh" #include "paper-column.hh" #include "engraver-group-engraver.hh" -#include "timing-translator.hh" -#include "bar.hh" + #include "staff-symbol-referencer.hh" #include "engraver.hh" #include "moment.hh" +#include "spanner.hh" /** - */ + The name says it all: make multi measure rests + +*/ class Multi_measure_rest_engraver : public Engraver { public: - VIRTUAL_COPY_CONS(Translator); - Multi_measure_rest_engraver (); + TRANSLATOR_DECLARATIONS(Multi_measure_rest_engraver); protected: - virtual void acknowledge_element (Score_element_info i); - virtual void do_process_music (); - virtual bool do_try_music (Music*); - virtual void do_pre_move_processing (); - virtual void do_post_move_processing (); - virtual void do_removal_processing (); + virtual bool try_music (Music*); + virtual void process_music (); + virtual void stop_translation_timestep (); + virtual void start_translation_timestep (); + virtual void finalize (); + private: Span_req * new_req_l_; Span_req * busy_span_req_l_; @@ -38,11 +38,11 @@ private: int start_measure_i_; Moment start_moment_; - Multi_measure_rest *mmrest_p_; - Multi_measure_rest *lastrest_p_; + Spanner *mmrest_p_; + Spanner *lastrest_p_; }; -ADD_THIS_TRANSLATOR (Multi_measure_rest_engraver); + Multi_measure_rest_engraver::Multi_measure_rest_engraver () { @@ -51,30 +51,21 @@ Multi_measure_rest_engraver::Multi_measure_rest_engraver () new_req_l_ = busy_span_req_l_ = stop_req_l_ =0; } -void -Multi_measure_rest_engraver::acknowledge_element (Score_element_info i) -{ - if (Bar *c = dynamic_cast (i.elem_l_)) - { - if (mmrest_p_) - mmrest_p_->add_column (c); - if (lastrest_p_) - lastrest_p_->add_column (c); - } -} bool -Multi_measure_rest_engraver::do_try_music (Music* req_l) +Multi_measure_rest_engraver::try_music (Music* req_l) { if (Span_req * sp = dynamic_cast (req_l)) { - if (sp->span_type_str_ == "rest") + + if (scm_equal_p (sp->get_mus_property ("span-type"), + ly_str02scm ("rest")) == SCM_BOOL_T) { - if (sp->span_dir_ == STOP) + if (sp->get_span_dir () == STOP) { stop_req_l_ = sp; } - else if (sp->span_dir_ == START && !new_req_l_) + else if (sp->get_span_dir () == START && !new_req_l_) { new_req_l_ = sp; } @@ -84,10 +75,8 @@ Multi_measure_rest_engraver::do_try_music (Music* req_l) return false; } - - void -Multi_measure_rest_engraver::do_process_music () +Multi_measure_rest_engraver::process_music () { if (new_req_l_ && stop_req_l_) stop_req_l_ = 0; @@ -109,38 +98,47 @@ Multi_measure_rest_engraver::do_process_music () if (busy_span_req_l_ && !mmrest_p_) { - Translator * tr = daddy_grav_l()->get_simple_translator ("Timing_engraver"); // ugh - Timing_translator * time = dynamic_cast (tr); - - mmrest_p_ = new Multi_measure_rest; - Staff_symbol_referencer_interface si (mmrest_p_); - si.set_interface (); + mmrest_p_ = new Spanner (get_property ("MultiMeasureRest")); - announce_element (Score_element_info (mmrest_p_, busy_span_req_l_)); + announce_grob(mmrest_p_, busy_span_req_l_->self_scm()); start_measure_i_ - = gh_scm2int (time->get_property ("currentBarNumber")); + = gh_scm2int (get_property ("currentBarNumber")); + } + + if (gh_string_p (get_property ("whichBar"))) + { + Grob *cmc = unsmob_grob (get_property( "currentCommandColumn")); + Item *it = dynamic_cast (cmc); + if (mmrest_p_) + add_bound_item (mmrest_p_, it); + if (lastrest_p_) + add_bound_item (lastrest_p_,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 >= start_moment_) - && !time->measure_position () - && (scm_ilength (mmrest_p_->get_elt_property ("columns")) >= 2)) + if (mmrest_p_ && (now_mom () >= start_moment_) + && !mp.to_bool () + && mmrest_p_->get_bound (LEFT) && mmrest_p_->get_bound (RIGHT)) { - typeset_element (mmrest_p_); + typeset_grob (mmrest_p_); /* - must keep mmrest_p_ around to set measures_i_ + we must keep mmrest_p_ around to set measure-count, so + no mmrest_p_ = 0 here. */ } + if (lastrest_p_) { - typeset_element (lastrest_p_); + /* sanity check */ + if (lastrest_p_->get_bound (LEFT) && lastrest_p_->get_bound (RIGHT) + && lastrest_p_->get_bound (LEFT) != lastrest_p_->get_bound (RIGHT)) + typeset_grob (lastrest_p_); lastrest_p_ = 0; } @@ -153,18 +151,16 @@ Multi_measure_rest_engraver::do_pre_move_processing () } void -Multi_measure_rest_engraver::do_post_move_processing () +Multi_measure_rest_engraver::start_translation_timestep () { - 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 ()) + SCM smp = get_property ("measurePosition"); + Moment mp = (unsmob_moment (smp)) ? *unsmob_moment (smp) : Moment (0); + + if (mmrest_p_ && !mp.to_bool ()) { lastrest_p_ = mmrest_p_; - int cur = gh_scm2int (time->get_property ("currentBarNumber")); - lastrest_p_->set_elt_property ("measure-count", + int cur = gh_scm2int (get_property ("currentBarNumber")); + lastrest_p_->set_grob_property ("measure-count", gh_int2scm (cur - start_measure_i_)); mmrest_p_ = 0; } @@ -172,10 +168,19 @@ Multi_measure_rest_engraver::do_post_move_processing () void -Multi_measure_rest_engraver::do_removal_processing () +Multi_measure_rest_engraver::finalize () { if (mmrest_p_) - typeset_element (mmrest_p_); + typeset_grob (mmrest_p_); if (lastrest_p_) - typeset_element (lastrest_p_); + typeset_grob (lastrest_p_); } + +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 */ "");