2 multi_measure_rest-engraver.cc -- implement Multi_measure_rest_engraver
4 (c) 1998--2000 Jan Nieuwenhuizen <janneke@gnu.org>
5 Han-Wen Nienhuys <hanwen@cs.uu.nl>
9 #include "musical-request.hh"
10 #include "multi-measure-rest.hh"
11 #include "paper-column.hh"
12 #include "engraver-group-engraver.hh"
13 #include "timing-translator.hh"
15 #include "staff-symbol-referencer.hh"
16 #include "engraver.hh"
21 class Multi_measure_rest_engraver : public Engraver
24 VIRTUAL_COPY_CONS(Translator);
26 Multi_measure_rest_engraver ();
29 virtual void acknowledge_element (Score_element_info i);
30 virtual void do_process_requests ();
31 virtual bool do_try_music (Music*);
32 virtual void do_pre_move_processing ();
33 virtual void do_post_move_processing ();
36 Drul_array<Moment> rest_moments_;
39 Rhythmic_req* multi_measure_req_l_;
40 Multi_measure_rest* mmrest_p_;
41 Multi_measure_rest* lastrest_p_;
44 ADD_THIS_TRANSLATOR (Multi_measure_rest_engraver);
46 Multi_measure_rest_engraver::Multi_measure_rest_engraver ()
49 rest_moments_[START] =
50 rest_moments_[STOP] =0;
51 multi_measure_req_l_ = 0;
58 Multi_measure_rest_engraver::acknowledge_element (Score_element_info i)
60 if (Bar *c = dynamic_cast<Bar*> (i.elem_l_))
63 mmrest_p_->add_column (c);
65 lastrest_p_->add_column (c);
70 Multi_measure_rest_engraver::do_try_music (Music* req_l)
73 if (Multi_measure_rest_req *mr =
74 dynamic_cast<Multi_measure_rest_req *> (req_l))
76 else if (Repetitions_req *rr =
77 dynamic_cast<Repetitions_req *> (req_l))
81 if (multi_measure_req_l_)
82 if (!multi_measure_req_l_->equal_b (r)
83 || rest_moments_[START] != now_mom ())
86 multi_measure_req_l_ = r;
87 rest_moments_[START] = now_mom ();
89 rest_moments_[STOP] = rest_moments_[START] +
90 multi_measure_req_l_->duration_.length_mom ();
97 Multi_measure_rest_engraver::do_process_requests ()
99 if (multi_measure_req_l_ && !mmrest_p_)
102 Translator * tr = daddy_grav_l()->get_simple_translator ("Timing_engraver"); // ugh
103 Timing_translator * time = dynamic_cast<Timing_translator*> (tr);
105 mmrest_p_ = new Multi_measure_rest;
106 Staff_symbol_referencer_interface si (mmrest_p_);
113 if(dynamic_cast<Repetitions_req *> (multi_measure_req_l_))
114 mmrest_p_->set_elt_property ("alt-symbol",
115 ly_str02scm ("scripts-repeatsign"));
116 announce_element (Score_element_info (mmrest_p_, multi_measure_req_l_));
118 = gh_scm2int (time->get_property ("currentBarNumber", 0));
123 Multi_measure_rest_engraver::do_pre_move_processing ()
125 Moment now (now_mom ());
126 Translator * tr = daddy_grav_l()->get_simple_translator ("Timing_engraver"); // ugh
127 Timing_translator * time = dynamic_cast<Timing_translator*> (tr);
130 if (mmrest_p_ && (now >= rest_moments_[START])
131 && !time->measure_position ()
132 && (scm_ilength (mmrest_p_->get_elt_property ("columns")) >= 2))
134 typeset_element (mmrest_p_);
136 must keep mmrest_p_ around to set measures_i_
141 typeset_element (lastrest_p_);
147 Multi_measure_rest_engraver::do_post_move_processing ()
149 Translator * tr = daddy_grav_l()->get_simple_translator ("Timing_engraver"); // ugh
150 Timing_translator * time = dynamic_cast<Timing_translator*> (tr);
152 Moment now (now_mom ());
154 if (mmrest_p_ && !time->measure_position ())
156 lastrest_p_ = mmrest_p_;
157 lastrest_p_->measures_i_
158 = gh_scm2int (time->get_property ("currentBarNumber", 0)) - start_measure_i_;
162 if (now >= rest_moments_[STOP])
164 multi_measure_req_l_ = 0;