2 meter-reg.cc -- implement Meter_engraver
4 source file of the GNU LilyPond music typesetter
6 (c) 1997 Han-Wen Nienhuys <hanwen@stack.nl>
9 #include "meter-grav.hh"
11 #include "command-request.hh"
12 #include "score-grav.hh"
14 Meter_engraver::Meter_engraver()
18 default_grouping_ = Rhythmic_grouping (MInterval (0,4),4); // ugh
22 Meter_engraver::fill_staff_info (Staff_info&inf)
25 inf.rhythmic_C_ = &default_grouping_;
29 Meter_engraver::do_try_request (Request*r)
33 if (r->command() && r->command ()->timing ())
36 Timing_req * tr_l = r->command()->timing ();
37 Meter_change_req *m_l = tr_l->meterchange();
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");
48 time_.set_meter (b_i, o_i);
50 Rhythmic_grouping (MInterval (0,Moment (b_i, o_i)), b_i);
53 else if (tr_l->partial())
55 Moment m = tr_l->partial()->duration_;
56 String error = time_.try_set_partial_str (m);
59 tr_l->warning (error);
64 else if (tr_l->barcheck())
66 if (time_.whole_in_measure_)
68 tr_l ->warning ("Barcheck failed");
70 time_.whole_in_measure_ = 0; // resync
71 time_.error_b_ = true;
75 else if (tr_l->cadenza())
77 time_.set_cadenza (tr_l->cadenza()->on_b_);
80 else if (tr_l->measuregrouping())
82 default_grouping_ = parse_grouping (
83 tr_l->measuregrouping()->beat_i_arr_,
84 tr_l->measuregrouping()->elt_length_arr_);
93 Meter_engraver::do_creation_processing()
95 time_.when_ = get_staff_info().when ();
99 Meter_engraver::do_process_requests()
104 args.push (meter_req_l_->beats_i_);
105 args.push (meter_req_l_->one_beat_i_);
107 meter_p_ = new Meter (args);
111 announce_element (Score_elem_info (meter_p_, meter_req_l_));
115 Meter_engraver::do_pre_move_processing()
119 typeset_element (meter_p_);
124 Engraver_group_engraver * grav_l = daddy_grav_l_;
125 while (grav_l->daddy_grav_l_)
127 grav_l = grav_l->daddy_grav_l_;
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());
136 Meter_engraver::do_post_move_processing()
138 time_.add (get_staff_info().when () - time_.when_);
142 ADD_THIS_ENGRAVER(Meter_engraver);
143 IMPLEMENT_IS_TYPE_B1(Meter_engraver,Engraver);