]> git.donarmstrong.com Git - lilypond.git/blob - lily/multi-measure-rest-engraver.cc
release: 1.3.17
[lilypond.git] / lily / multi-measure-rest-engraver.cc
1 /*
2   multi_measure_rest-engraver.cc -- implement Multi_measure_rest_engraver
3
4   (c) 1998--1999 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 "multi-measure-rest-engraver.hh"
12 #include "paper-column.hh"
13 #include "engraver-group-engraver.hh"
14 #include "timing-translator.hh"
15 #include "bar.hh"
16 #include "staff-symbol-referencer.hh"
17
18
19 ADD_THIS_TRANSLATOR (Multi_measure_rest_engraver);
20
21 Multi_measure_rest_engraver::Multi_measure_rest_engraver ()
22 {
23   start_measure_i_ = 0;
24   rest_moments_[START] =
25     rest_moments_[STOP] =0;
26   multi_measure_req_l_ = 0;
27
28   lastrest_p_ =0;
29   mmrest_p_ = 0;
30 }
31
32 void
33 Multi_measure_rest_engraver::acknowledge_element (Score_element_info i)
34 {
35   if (Bar *c = dynamic_cast<Bar*> (i.elem_l_))
36     {
37       if (mmrest_p_) 
38         mmrest_p_->add_column (c);
39       if (lastrest_p_)
40         lastrest_p_->add_column (c);
41     }
42 }
43
44 bool
45 Multi_measure_rest_engraver::do_try_music (Music* req_l)
46 {
47   Rhythmic_req *r=0;
48   if (Multi_measure_rest_req *mr = 
49       dynamic_cast<Multi_measure_rest_req *> (req_l))
50     r=mr;
51   else if (Repetitions_req *rr = 
52            dynamic_cast<Repetitions_req *> (req_l))
53     r=rr;
54   if (r)
55     {
56       if (multi_measure_req_l_)
57         if (!multi_measure_req_l_->equal_b (r)
58             || rest_moments_[START] != now_mom ())
59           return false;
60       
61       multi_measure_req_l_ = r;
62       rest_moments_[START] = now_mom ();
63       
64       rest_moments_[STOP] = rest_moments_[START] +
65         multi_measure_req_l_->duration_.length_mom ();
66       return true;
67     }
68   return false;
69 }
70
71 void
72 Multi_measure_rest_engraver::do_process_requests ()
73 {
74   if (multi_measure_req_l_ && !mmrest_p_)
75     {
76
77       Translator * tr = daddy_grav_l()->get_simple_translator ("Timing_engraver");      // ugh
78       Timing_translator * time = dynamic_cast<Timing_translator*> (tr);
79
80       mmrest_p_ = new Multi_measure_rest;
81       Staff_symbol_referencer_interface si (mmrest_p_);
82       si.set_interface ();
83
84       
85       if(dynamic_cast<Repetitions_req *> (multi_measure_req_l_))
86         mmrest_p_->set_elt_property ("alt-symbol", 
87                                      ly_str02scm ("scripts-repeatsign"));
88       announce_element (Score_element_info (mmrest_p_, multi_measure_req_l_));
89       start_measure_i_
90         = gh_int2scm (time->get_property ("currentBarNumber", 0));
91     }
92 }
93
94 void
95 Multi_measure_rest_engraver::do_pre_move_processing ()
96 {
97   Moment now (now_mom ());
98   Translator * tr = daddy_grav_l()->get_simple_translator ("Timing_engraver");  // ugh
99   Timing_translator * time  = dynamic_cast<Timing_translator*> (tr);
100
101
102   if (mmrest_p_ && (now >= rest_moments_[START]) 
103     && !time->measure_position ()
104     && (scm_ilength (mmrest_p_->get_elt_property ("columns")) >= 2))
105     {
106       typeset_element (mmrest_p_);
107       /*
108         must keep mmrest_p_ around to set measures_i_
109        */
110     }
111   if (lastrest_p_)
112     {
113       typeset_element (lastrest_p_);
114       lastrest_p_ = 0;
115     }
116 }
117
118 void
119 Multi_measure_rest_engraver::do_post_move_processing ()
120 {
121   Translator * tr = daddy_grav_l()->get_simple_translator ("Timing_engraver");  // ugh
122   Timing_translator * time  = dynamic_cast<Timing_translator*> (tr);
123
124   Moment now (now_mom ());
125
126   if (mmrest_p_ && !time->measure_position ())
127     {
128       lastrest_p_ = mmrest_p_;
129       lastrest_p_->measures_i_
130         = gh_int2scm (time->get_property ("currentBarNumber", 0)) - start_measure_i_;
131       mmrest_p_ = 0;
132     }
133
134   if (now >= rest_moments_[STOP])
135     {
136       multi_measure_req_l_ = 0;
137       mmrest_p_ = 0;
138     }
139 }
140
141