]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/meter-reg.cc
release: 0.0.68pre
[lilypond.git] / lily / meter-reg.cc
index 4c34c187348e76641f72f06911055412e7fee2df..e0e3829ed0414b5da75271531fc743a4bebfd343 100644 (file)
@@ -9,28 +9,80 @@
 #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;
@@ -45,22 +97,30 @@ Meter_register::process_requests()
 }
 
 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);