]> git.donarmstrong.com Git - lilypond.git/blob - lily/meter-grav.cc
7f5a0d3bc8bf190b9d6d291034daead654d15ed3
[lilypond.git] / lily / meter-grav.cc
1 /*
2   meter-reg.cc -- implement Meter_engraver
3
4   source file of the GNU LilyPond music typesetter
5
6   (c) 1997 Han-Wen Nienhuys <hanwen@stack.nl>
7 */
8
9 #include "meter-grav.hh"
10 #include "meter.hh"
11 #include "command-request.hh"
12 #include "score-grav.hh"
13
14 Meter_engraver::Meter_engraver()
15
16   meter_req_l_ = 0;
17   meter_p_ =0;
18   default_grouping_ = Rhythmic_grouping (MInterval (0,4),4); // ugh
19 }
20
21 void
22 Meter_engraver::fill_staff_info (Staff_info&inf)
23 {
24   inf.time_C_ = &time_;
25   inf.rhythmic_C_ = &default_grouping_;
26 }
27
28 bool
29 Meter_engraver::do_try_request (Request*r)
30 {
31   bool gotcha = false;
32
33   if (r->command() && r->command ()->timing ()) 
34     {
35         gotcha = true;
36         Timing_req * tr_l = r->command()->timing ();
37         Meter_change_req *m_l = tr_l->meterchange();
38         if (m_l) 
39           {
40             meter_req_l_ = m_l;
41
42             int b_i= m_l->beats_i_;
43             int o_i = m_l->one_beat_i_;
44             if (! time_.allow_meter_change_b())
45                 tr_l->warning ("Meter change not allowed here");
46             else
47               {
48                 time_.set_meter (b_i, o_i);
49                 default_grouping_ = 
50                     Rhythmic_grouping (MInterval (0,Moment (b_i, o_i)), b_i);
51               }
52           }
53         else if (tr_l->partial()) 
54           {
55             Moment m = tr_l->partial()->duration_;
56             String error = time_.try_set_partial_str (m);
57             if (error != "") 
58               {
59                 tr_l->warning (error);
60               }
61             else 
62                 time_.setpartial (m);
63           }
64         else if (tr_l->barcheck()) 
65           {
66             if (time_.whole_in_measure_) 
67               {
68                 tr_l ->warning ("Barcheck failed");
69             
70                 time_.whole_in_measure_ = 0; // resync
71                 time_.error_b_ = true;
72               }
73
74           }
75         else if (tr_l->cadenza()) 
76           {
77             time_.set_cadenza (tr_l->cadenza()->on_b_);
78
79           }
80         else if (tr_l->measuregrouping()) 
81           {
82             default_grouping_ = parse_grouping (
83                     tr_l->measuregrouping()->beat_i_arr_,
84                     tr_l->measuregrouping()->elt_length_arr_);
85
86         }       
87     }
88   
89   return gotcha;
90 }
91
92 void
93 Meter_engraver::do_creation_processing()
94 {
95   time_.when_ = get_staff_info().when ();
96 }
97
98 void
99 Meter_engraver::do_process_requests()
100 {
101   if (meter_req_l_) 
102     {
103         Array<Scalar> args;
104         args.push (meter_req_l_->beats_i_);
105         args.push (meter_req_l_->one_beat_i_);
106         
107         meter_p_ = new Meter (args);
108     }
109
110   if (meter_p_)
111         announce_element (Score_elem_info (meter_p_, meter_req_l_));
112 }
113
114 void
115 Meter_engraver::do_pre_move_processing()
116 {
117   if (meter_p_) 
118     {
119         typeset_element (meter_p_);
120         meter_p_ =0;
121         meter_req_l_ = 0;
122     }
123
124   Engraver_group_engraver * grav_l = daddy_grav_l_;
125   while (grav_l->daddy_grav_l_) 
126     {
127         grav_l = grav_l->daddy_grav_l_;
128     }
129   
130   assert (grav_l->name() == Score_engraver::static_name ());
131   if (!time_.cadenza_b_)
132         ((Score_engraver*)grav_l)->add_moment_to_process (time_.next_bar_moment());
133 }
134
135 void
136 Meter_engraver::do_post_move_processing()
137 {
138   time_.add (get_staff_info().when ()  - time_.when_);
139 }
140
141
142 ADD_THIS_ENGRAVER(Meter_engraver);
143 IMPLEMENT_IS_TYPE_B1(Meter_engraver,Engraver);