]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/meter-grav.cc
partial: 1.0.1.jcn
[lilypond.git] / lily / meter-grav.cc
index eff12b4a6c366c1f90f15b60d8ae1f8b2704c6e0..f14d00a4edbbe8ff7d7e19345b21cc0d11dd9c63 100644 (file)
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1997 Han-Wen Nienhuys <hanwen@stack.nl>
+  (c)  1997--1998 Han-Wen Nienhuys <hanwen@stack.nl>
 */
 
 #include "meter-grav.hh"
 #include "meter.hh"
 #include "command-request.hh"
-#include "score-grav.hh"
+#include "timing-grav.hh"
+#include "engraver-group.hh"
 
 Meter_engraver::Meter_engraver()
 { 
-    meter_req_l_ = 0;
-    meter_p_ =0;
-    default_grouping_ = Rhythmic_grouping (MInterval (0,4),4); // ugh
+  meter_p_ =0;
 }
 
 void
-Meter_engraver::fill_staff_info (Staff_info&inf)
-{
-    inf.time_C_ = &time_;
-    inf.rhythmic_C_ = &default_grouping_;
-}
-
-bool
-Meter_engraver::do_try_request (Request*r)
+Meter_engraver::do_process_requests()
 {
-    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;
-           }
+  Translator * result =
+    daddy_grav_l()->get_simple_translator (Timing_engraver::static_name());
 
-       } 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_);
-
-       }       
+  if (!result)
+    {
+      warning ("Lost in time: can't find Timing_translator");
+      return ;
     }
-    
-    return gotcha;
-}
-
-void
-Meter_engraver::do_creation_processing()
-{
-    time_.when_ = get_staff_info().when ();
-}
-
-void
-Meter_engraver::do_process_requests()
-{
-    if (meter_req_l_) {
-       Array<Scalar> args;
-       args.push (meter_req_l_->beats_i_);
-       args.push (meter_req_l_->one_beat_i_);
+  
+  Timing_engraver * timing_grav_l= (Timing_engraver*) result->engraver_l ();
+  
+  Meter_change_req *req = timing_grav_l->meter_req_l();
+  if (req)
+    {
+      Array<Scalar> args;
+      args.push (req->beats_i_);
+      args.push (req->one_beat_i_);
        
-       meter_p_ = new Meter (args);
+      meter_p_ = new Meter (args);
+      meter_p_->break_priority_i_ = 1; // ugh
     }
 
-    if (meter_p_)
-       announce_element (Score_elem_info (meter_p_, meter_req_l_));
+  if (meter_p_)
+    announce_element (Score_elem_info (meter_p_, req));
 }
 
 void
 Meter_engraver::do_pre_move_processing()
 {
-    if (meter_p_) {
-       typeset_element (meter_p_);
-       meter_p_ =0;
-       meter_req_l_ = 0;
+  if (meter_p_) 
+    {
+      typeset_element (meter_p_);
+      meter_p_ =0;
     }
-
-    Engraver_group_engraver * grav_l = daddy_grav_l_;
-    while (grav_l->daddy_grav_l_) {
-       grav_l = grav_l->daddy_grav_l_;
-    }
-    
-    assert (grav_l->name() == Score_engraver::static_name ());
-    if (!time_.cadenza_b_)
-       ((Score_engraver*)grav_l)->add_moment_to_process (time_.next_bar_moment());
-}
-
-void
-Meter_engraver::do_post_move_processing()
-{
-    time_.add (get_staff_info().when ()  - time_.when_);
 }
 
 
-ADD_THIS_ENGRAVER(Meter_engraver);
+ADD_THIS_TRANSLATOR(Meter_engraver);
 IMPLEMENT_IS_TYPE_B1(Meter_engraver,Engraver);