]> git.donarmstrong.com Git - lilypond.git/commitdiff
lilypond-0.0.32
authorfred <fred>
Sun, 24 Mar 2002 19:32:25 +0000 (19:32 +0000)
committerfred <fred>
Sun, 24 Mar 2002 19:32:25 +0000 (19:32 +0000)
src/staffwalker.cc

index eac45b5b13fcd1c94e5a15565be44cea30dfb7fe..d93243255d65c09c91da241ad323738847f32217 100644 (file)
@@ -1,10 +1,28 @@
-#include "request.hh"
+/*
+  staffwalker.cc -- implement Staff_walker
+
+  source file of the LilyPond music typesetter
+
+  (c) 1997 Han-Wen Nienhuys <hanwen@stack.nl>
+*/
+
+#include "grouping.hh"
+#include "staff.hh"
+#include "musicalrequest.hh"
 #include "staffwalker.hh"
 #include "stcol.hh"
 #include "sccol.hh"
 #include "debug.hh"
+#include "timedescription.hh"
+#include "commandrequest.hh"
+#include "grouping.hh"
+#include "scorewalker.hh"
+
+Staff_walker::~Staff_walker()
+{
+    do_pre_move();
+}
 
-Staff_walker::~Staff_walker() {}
 Staff_walker::Staff_walker(Staff_walker const &s)
     :PCursor<Staff_column*> (s)
 {
@@ -16,62 +34,73 @@ Staff_walker::Staff_walker(Staff * s, PScore*ps )
 {
     staff_l_ = s;
     pscore_l_ = ps;
-    break_status = BREAK_END - BREAK_PRE;
+    default_grouping = new Rhythmic_grouping(MInterval(0, 1), 4); // should be in tdes. TODO
+    score_walk_l_ = 0;
 }
 
 Moment
 Staff_walker::when() const
 {
-    return (* (PCursor<Staff_column*> *) this)->when();
-}
-
-void
-Staff_walker::process()
-{
-    break_status = BREAK_END - BREAK_PRE;
-
-    if (ptr()->musical_b()) {
-       process_requests();
-    } else if (ptr()->staff_commands_p_)
-       for (iter_top(*ptr()->staff_commands_p_,i); i.ok(); i++) {
-           process_command(i);
-    }
+    return ptr()->when();
 }
 
 
 void
-Staff_walker::process_command(Command*com)
+Staff_walker::process_timing_reqs()
 {
-    switch (com->code){
-    case BREAK_PRE:
-    case BREAK_MIDDLE:
-    case BREAK_POST:
-    case BREAK_END:
-       (*this)->score_column_l_->set_breakable();
-       break_status = com->code- BREAK_PRE;
-       break;
-    case INTERPRET:
-       do_INTERPRET_command(com);
-       break;
-       
-    case TYPESET:
-       do_TYPESET_command(com);
-       break;
-   
-    default :
-       break;
+    for (int i=0; i < ptr()->timing_req_l_arr_.size(); i++) {
+       Timing_req * tr_l = ptr()->timing_req_l_arr_[i];
+       if (tr_l->meterchange()) {
+           int b_i=tr_l->meterchange()->beats_i_;
+           int o_i = tr_l->meterchange()->one_beat_i_;
+           time_.set_meter(b_i, o_i);
+                       
+           *default_grouping = Rhythmic_grouping(
+               MInterval(0,Moment(b_i, o_i)), b_i);
+       } 
+    }
+    
+    for (int i=0; i < ptr()->timing_req_l_arr_.size(); i++) {
+       Timing_req * tr_l = ptr()->timing_req_l_arr_[i];
+       if (tr_l->partial()) {
+           time_.setpartial(tr_l->partial()->duration_);
+       } else if (tr_l->barcheck() && time_.whole_in_measure_) {
+           warning( "Barcheck failed", tr_l->defined_ch_c_l_ );
+       } 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_);
+       }
     }
+    time_.OK();
 }
 
 void
 Staff_walker::operator++(int i)
 {
+    Moment last = when();
+
     do_pre_move();
-    if (ptr()->musical_b() && ptr()->tdescription_
-       && !ptr()->tdescription_->whole_in_measure) {
-       *mlog << "[" << ptr()->tdescription_->bars<<"]"<< flush;
-    }
     PCursor<Staff_column*>::operator++(i);
-
+    if (ok() ) {
+       Moment delta_t = when() - last;
+       assert(delta_t >0);
+       time_.add( delta_t );
+    }
     do_post_move();
 }
+
+void
+Staff_walker::process()
+{
+    process_timing_reqs();    
+    process_requests();
+}
+void 
+Staff_walker::allow_break()
+{
+    score_walk_l_->allow_break(this);
+}