#include "meter-reg.hh"
#include "meter.hh"
#include "command-request.hh"
+#include "score-reg.hh"
Meter_register::Meter_register()
+{
+ meter_req_l_ = 0;
+ meter_p_ =0;
+ default_grouping_ = Rhythmic_grouping(MInterval(0,4),4); // ugh
+}
+
+void
+Meter_register::fill_staff_info(Staff_info&inf)
{
- post_move_processing();
+ inf.time_C_ = &time_;
+ inf.rhythmic_C_ = &default_grouping_;
}
bool
-Meter_register::try_request(Request*r_l)
+Meter_register::do_try_request(Request*r)
{
- Command_req* creq_l= r_l->command();
- if (!creq_l || !creq_l->meterchange())
- return false;
- Meter_change_req *m = creq_l->meterchange();
- if (meter_req_l_ && meter_req_l_->compare(*m))
- return false;
-
- meter_req_l_ = m;
- return true;
+ bool gotcha = false;
+
+ if (r->command() && r->command()->timing()) {
+ gotcha = true;
+ Timing_req * tr_l = r->command()->timing();
+ Meter_change_req *m_l = tr_l->meterchange();
+ if (m_l) {
+ meter_req_l_ = m_l;
+
+ int b_i= m_l->beats_i_;
+ int o_i = m_l->one_beat_i_;
+ if (! time_.allow_meter_change_b() )
+ tr_l->warning("Meter change not allowed here");
+ else{
+ time_.set_meter(b_i, o_i);
+ default_grouping_ =
+ Rhythmic_grouping(MInterval(0,Moment(b_i, o_i)), b_i);
+ }
+ } else if (tr_l->partial()) {
+ Moment m = tr_l->partial()->duration_;
+ String error = time_.try_set_partial_str(m);
+ if (error != "") {
+ tr_l->warning(error);
+ } else
+ time_.setpartial(m);
+ } else if (tr_l->barcheck()) {
+ if (time_.whole_in_measure_) {
+ tr_l ->warning( "Barcheck failed");
+
+ time_.whole_in_measure_ = 0; // resync
+ time_.error_b_ = true;
+ }
+
+ } else if (tr_l->cadenza()) {
+ time_.set_cadenza(tr_l->cadenza()->on_b_);
+
+ } else if (tr_l->measuregrouping()) {
+ default_grouping_ = parse_grouping(
+ tr_l->measuregrouping()->beat_i_arr_,
+ tr_l->measuregrouping()->elt_length_arr_);
+
+ }
+ }
+
+ return gotcha;
}
void
-Meter_register::process_requests()
+Meter_register::do_creation_processing()
+{
+ time_.when_ = get_staff_info().when();
+}
+
+void
+Meter_register::do_process_requests()
{
if (meter_req_l_ ) {
Array<Scalar> args;
}
void
-Meter_register::pre_move_processing()
+Meter_register::do_pre_move_processing()
{
if (meter_p_) {
- Meter * post_p =new Meter(*meter_p_);
- Meter * pre_p =new Meter(*meter_p_);
-
- typeset_breakable_item(pre_p, meter_p_, post_p);
+ typeset_breakable_item(meter_p_);
meter_p_ =0;
+ meter_req_l_ = 0;
}
+
+ Register_group_register * reg_l = daddy_reg_l_;
+ while (reg_l->daddy_reg_l_) {
+ reg_l = reg_l->daddy_reg_l_;
+ }
+
+ assert( reg_l->name() == Score_register::static_name());
+ if (!time_.cadenza_b_)
+ ((Score_register*)reg_l)->add_moment_to_process( time_.next_bar_moment());
}
void
-Meter_register::post_move_processing()
+Meter_register::do_post_move_processing()
{
- meter_req_l_ = 0;
- meter_p_ =0;
+ time_.add( get_staff_info().when() - time_.when_ );
}
+
IMPLEMENT_STATIC_NAME(Meter_register);
ADD_THIS_REGISTER(Meter_register);
+IMPLEMENT_IS_TYPE_B1(Meter_register,Request_register);