2 timing-translator.cc -- implement Timing_translator
4 source file of the GNU LilyPond music typesetter
6 (c) 1997--1999 Han-Wen Nienhuys <hanwen@cs.uu.nl>
9 #include "timing-translator.hh"
10 #include "command-request.hh"
11 #include "translator-group.hh"
12 #include "global-translator.hh"
13 #include "multi-measure-rest.hh"
15 Timing_translator::Timing_translator ()
17 default_grouping_ = Rhythmic_grouping (MInterval (0, 1), 4); // ugh
21 Timing_translator::do_try_music (Music*r)
23 if (Timing_req *t = dynamic_cast <Timing_req *> (r))
25 for (int i=0; i < timing_req_l_arr_.size (); i++)
27 if (timing_req_l_arr_[i]->equal_b(t))
29 if (String (classname (timing_req_l_arr_[i])) == classname (r))
31 r->warning (_ ("conflicting timing request"));
36 timing_req_l_arr_.push(t);
44 Time_signature_change_req*
45 Timing_translator::time_signature_req_l() const
47 Time_signature_change_req *m_l=0;
48 for (int i=0; !m_l && i < timing_req_l_arr_.size (); i++)
50 m_l=dynamic_cast<Time_signature_change_req*> (timing_req_l_arr_[i]);
56 Timing_translator::do_process_requests()
58 for (int i=0; i < timing_req_l_arr_.size (); i++)
60 Timing_req * tr_l = timing_req_l_arr_[i];
62 if (Time_signature_change_req *m_l = dynamic_cast <Time_signature_change_req *> (tr_l))
64 int b_i= m_l->beats_i_;
65 int o_i = m_l->one_beat_i_;
66 if (! time_.allow_time_signature_change_b())
67 tr_l->warning (_ ("time signature change not allowed here"));
70 time_.set_time_signature (b_i, o_i);
73 Rhythmic_grouping (MInterval (0,Moment (b_i, o_i)),
77 else if (Partial_measure_req *pm = dynamic_cast <Partial_measure_req *> (tr_l))
79 Moment m = pm->length_mom_;
80 String error = time_.try_set_partial_str (m);
81 if (error.length_i ())
83 tr_l->warning (error);
88 else if (dynamic_cast <Barcheck_req *> (tr_l))
90 if (time_.whole_in_measure_)
92 tr_l ->warning (_f ("barcheck failed by: %s",
93 time_.whole_in_measure_.str ()));
95 time_.whole_in_measure_ = 0; // resync
96 time_.error_b_ = true;
99 else if (Cadenza_req *cr = dynamic_cast <Cadenza_req *> (tr_l))
101 time_.set_cadenza (cr->on_b_);
103 else if (Measure_grouping_req *mg=dynamic_cast <Measure_grouping_req *> (tr_l))
106 parse_grouping (mg->beat_i_arr_,
107 mg->elt_length_arr_);
112 Translator_group * tr=0;
114 Scalar barn = get_property ("currentBarNumber", &tr);
115 if (!barn.empty_b () && barn.isnum_b ())
117 time_.bars_i_ = int(barn);
118 tr->set_property ("currentBarNumber", "");
126 Timing_translator::do_pre_move_processing()
128 timing_req_l_arr_.set_size (0);
129 Global_translator *global_l =
130 dynamic_cast<Global_translator*> (daddy_trans_l_->ancestor_l (100)); // ugh 100.
133 /* allbars == ! skipbars */
134 bool allbars = ! get_property ("skipBars", 0).to_bool ();
136 // urg: multi bar rests: should always must process whole of first bar?
137 if (!time_.cadenza_b_ && allbars)
138 global_l->add_moment_to_process (time_.next_bar_moment ());
142 ADD_THIS_TRANSLATOR(Timing_translator);
145 Timing_translator::do_creation_processing()
147 time_.when_ = now_mom ();
151 Timing_translator::do_post_move_processing()
153 time_.add (now_mom () - time_.when_);
159 Timing_translator::do_print () const
163 default_grouping_.print ();