]> git.donarmstrong.com Git - lilypond.git/blob - lily/multi-measure-rest-engraver.cc
release: 1.3.22
[lilypond.git] / lily / multi-measure-rest-engraver.cc
1 /*
2   multi_measure_rest-engraver.cc -- implement Multi_measure_rest_engraver
3
4   (c) 1998--2000 Jan Nieuwenhuizen <janneke@gnu.org>
5        Han-Wen Nienhuys <hanwen@cs.uu.nl>
6 */
7
8 #include "proto.hh"
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"
14 #include "bar.hh"
15 #include "staff-symbol-referencer.hh"
16 #include "engraver.hh"
17 #include "moment.hh"
18
19 /**
20  */
21 class Multi_measure_rest_engraver : public Engraver
22 {
23 public:
24   VIRTUAL_COPY_CONS(Translator);
25   
26   Multi_measure_rest_engraver ();
27
28 protected:
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 ();
34
35 private:
36   Drul_array<Moment> rest_moments_;
37   
38   int start_measure_i_;
39   Rhythmic_req* multi_measure_req_l_;
40   Multi_measure_rest* mmrest_p_;
41   Multi_measure_rest* lastrest_p_;
42 };
43
44 ADD_THIS_TRANSLATOR (Multi_measure_rest_engraver);
45
46 Multi_measure_rest_engraver::Multi_measure_rest_engraver ()
47 {
48   start_measure_i_ = 0;
49   rest_moments_[START] =
50     rest_moments_[STOP] =0;
51   multi_measure_req_l_ = 0;
52
53   lastrest_p_ =0;
54   mmrest_p_ = 0;
55 }
56
57 void
58 Multi_measure_rest_engraver::acknowledge_element (Score_element_info i)
59 {
60   if (Bar *c = dynamic_cast<Bar*> (i.elem_l_))
61     {
62       if (mmrest_p_) 
63         mmrest_p_->add_column (c);
64       if (lastrest_p_)
65         lastrest_p_->add_column (c);
66     }
67 }
68
69 bool
70 Multi_measure_rest_engraver::do_try_music (Music* req_l)
71 {
72   Rhythmic_req *r=0;
73   if (Multi_measure_rest_req *mr = 
74       dynamic_cast<Multi_measure_rest_req *> (req_l))
75     r=mr;
76   else if (Repetitions_req *rr = 
77            dynamic_cast<Repetitions_req *> (req_l))
78     r=rr;
79   if (r)
80     {
81       if (multi_measure_req_l_)
82         if (!multi_measure_req_l_->equal_b (r)
83             || rest_moments_[START] != now_mom ())
84           return false;
85       
86       multi_measure_req_l_ = r;
87       rest_moments_[START] = now_mom ();
88       
89       rest_moments_[STOP] = rest_moments_[START] +
90         multi_measure_req_l_->duration_.length_mom ();
91       return true;
92     }
93   return false;
94 }
95
96 void
97 Multi_measure_rest_engraver::do_process_requests ()
98 {
99   if (multi_measure_req_l_ && !mmrest_p_)
100     {
101
102       Translator * tr = daddy_grav_l()->get_simple_translator ("Timing_engraver");      // ugh
103       Timing_translator * time = dynamic_cast<Timing_translator*> (tr);
104
105       mmrest_p_ = new Multi_measure_rest;
106       Staff_symbol_referencer_interface si (mmrest_p_);
107       si.set_interface ();
108
109
110       /*
111         UGH. JUNKME
112        */
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_));
117       start_measure_i_
118         = gh_scm2int (time->get_property ("currentBarNumber", 0));
119     }
120 }
121
122 void
123 Multi_measure_rest_engraver::do_pre_move_processing ()
124 {
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);
128
129
130   if (mmrest_p_ && (now >= rest_moments_[START]) 
131     && !time->measure_position ()
132     && (scm_ilength (mmrest_p_->get_elt_property ("columns")) >= 2))
133     {
134       typeset_element (mmrest_p_);
135       /*
136         must keep mmrest_p_ around to set measures_i_
137        */
138     }
139   if (lastrest_p_)
140     {
141       typeset_element (lastrest_p_);
142       lastrest_p_ = 0;
143     }
144 }
145
146 void
147 Multi_measure_rest_engraver::do_post_move_processing ()
148 {
149   Translator * tr = daddy_grav_l()->get_simple_translator ("Timing_engraver");  // ugh
150   Timing_translator * time  = dynamic_cast<Timing_translator*> (tr);
151
152   Moment now (now_mom ());
153
154   if (mmrest_p_ && !time->measure_position ())
155     {
156       lastrest_p_ = mmrest_p_;
157       lastrest_p_->measures_i_
158         = gh_scm2int (time->get_property ("currentBarNumber", 0)) - start_measure_i_;
159       mmrest_p_ = 0;
160     }
161
162   if (now >= rest_moments_[STOP])
163     {
164       multi_measure_req_l_ = 0;
165       mmrest_p_ = 0;
166     }
167 }
168
169