]> git.donarmstrong.com Git - lilypond.git/commitdiff
lilypond-0.0.27
authorfred <fred>
Sun, 24 Mar 2002 19:30:15 +0000 (19:30 +0000)
committerfred <fred>
Sun, 24 Mar 2002 19:30:15 +0000 (19:30 +0000)
src/complexwalker.cc

index 5cc1b5b6a5f52f50914f04200ab638d09b0a8146..f1a73e0200b02be6ffaca5faf376907aae2fa179 100644 (file)
@@ -5,33 +5,14 @@
 #include "clef.hh"
 #include "pscore.hh"
 #include "complexstaff.hh"
-#include "complexwalker.hh"
 #include "sccol.hh"
 #include "debug.hh"
 #include "keyitem.hh"
 #include "clefitem.hh"
 #include "voicegroup.hh"
 #include "register.hh"
-
-Rhythmic_grouping
-cparse_grouping(Array<Scalar> a, Moment one_beat)
-{
-    Array<int> r;
-    for (int i= 0 ; i < a.size(); i++)
-       r.push(a[i]);
-    Moment here =0.0;
-
-    Array<Rhythmic_grouping*> children;
-    for (int i=0; i < r.size(); i++) {
-       
-       Moment last = here;
-       here += one_beat * r[i];
-       children.push(
-           new Rhythmic_grouping(MInterval(last, here), r[i] )
-           );
-    }
-    return Rhythmic_grouping(children);
-}
+#include "complexwalker.hh"
+#include "misc.hh"
 
 void
 Complex_walker::do_INTERPRET_command(Command*com)
@@ -39,8 +20,7 @@ Complex_walker::do_INTERPRET_command(Command*com)
     Array<Scalar> args(com->args);
     args.del(0);
     if (com->args[0] == "GROUPING") {  
-       default_grouping = cparse_grouping(args,
-                                         col()->tdescription_->one_beat);
+       default_grouping = parse_grouping(args);
     }else if (com->args[0] == "NEWMEASURE") {
        local_key_.reset(key_);
 
@@ -111,19 +91,21 @@ Complex_walker::do_TYPESET_command(Command*com)
 void
 Complex_walker::announce_element(Staff_elem_info info)
 {
+    info.group_regs_l_ = find_voice_group((Voice*)info.voice_l_);
     announce_info_arr_.push(info);
 }
 
 void
 Complex_walker::do_announces()
 {
-
     for (int i = 0; i < announce_info_arr_.size(); i++){
        Staff_elem_info info = announce_info_arr_[i];
        for (iter_top(voice_reg_list_,j); j.ok(); j++) {
            j->announce_element(info);
        }
-       group_regs_.announce_element(info);
+       for (iter_top ( group_reg_list_, j); j.ok(); j++) {
+           j->announce_element(info);
+       }
        local_key_reg_.acknowledge_element(info);
     }
 }
@@ -131,32 +113,97 @@ Complex_walker::do_announces()
 Voice_registers *
 Complex_walker::find_voice_reg(Voice*v_l)
 {
-    for (iter_top(voice_reg_list_, i); i.ok(); i++) {
+   for (iter_top(voice_reg_list_, i); i.ok(); i++) {
        if (i->voice_l_ == v_l)
            return i;
-    }
+   }
+   return 0;
+}
+
+Voice_registers*
+Complex_walker::get_voice_reg(Voice*v_l)
+{
+    Voice_registers *regs_p=find_voice_reg(v_l);
+    if (regs_p)
+       return regs_p;
     
-    Voice_registers *regs_p=new Voice_registers(this,v_l);
+    regs_p = new Voice_registers(this,v_l);
     voice_reg_list_.bottom().add (regs_p);
-    //voice_reg_map_[v_l] = regs_p;
     return regs_p;
 }
 
+Voice_group_registers *
+Complex_walker::find_voice_group(Voice* v_l)
+{
+    if (!voice_group_map_.elt_query(v_l))
+       return 0;
+    else return voice_group_map_[v_l];
+}
+
+Voice_group_registers *
+Complex_walker::find_voice_group(const char *id)
+{
+    for (iter_top(group_reg_list_, i); i.ok(); i++)
+       if (i->group_id_str_ == id)
+           return i;
+    return 0;
+}
+
+
+Voice_group_registers *
+Complex_walker::get_voice_group(Voice *v_l)
+{
+    Voice_group_registers *group_p = find_voice_group(v_l);
+    if (group_p)
+       return group_p;
+    
+    group_p = new Voice_group_registers(this);
+    group_reg_list_.bottom().add(group_p);
+    voice_group_map_[v_l] = group_p;
+    return group_p;
+}
+
+
+Voice_group_registers *
+Complex_walker::get_voice_group(const char* id)
+{
+    Voice_group_registers *group_p = find_voice_group(id);
+    if (group_p)
+       return group_p;
+    group_p = new Voice_group_registers(this,id);
+    group_reg_list_.bottom().add(group_p);
+    return group_p;
+}
+
+void 
+Complex_walker::do_change_group(const Voice * v, String group_id_str)
+{
+    voice_group_map_[v] = get_voice_group(group_id_str);
+}
+
 void
 Complex_walker::try_request(Request*req)
 {
-    bool b;
-    if (req->note() || req->rest()|| req->slur()) {
-       Voice *v_l = req->elt_l_->voice_l_;
-       Voice_registers *vregs_l = find_voice_reg(v_l);
-       
+    bool b=false;
+    Voice *voice_l = req->elt_l_->voice_l_;
+
+    if (req->groupchange()) {
+       do_change_group(voice_l, req->groupchange()->newgroup_str_);
+       b = true;
+    } else if (Voice_registers::acceptable_request(req)) {
+       Voice_registers *vregs_l = get_voice_reg(voice_l);
        b = vregs_l->try_request(req);
-           
-    } else {
-       b = group_regs_.try_request(req);
-       if (!b)
-           b = local_key_reg_.try_request(req);
-    }
+    } else if (Voice_group_registers::acceptable_request(req)){
+       Voice_group_registers* reg_l = get_voice_group(voice_l);
+       b = reg_l->try_request(req);
+#if 0
+       if (!b) {
+           bool please_b = get_voice_group("")->try_request(req);         
+           b |= please_b;
+       }
+#endif
+    } 
+
     if (!b)
        WARN<< "junking request: " <<req->name() <<"\n";
 }
@@ -165,10 +212,13 @@ void
 Complex_walker::process_requests()
 {
     Complex_column*c = col();
-//    Complex_staff *s = staff();
 
-    for (int i=0; i < c->todo_l_arr_.size(); i++) {
-       try_request(c->todo_l_arr_[i]);
+    for (int i=0; i < c->first_l_arr_.size(); i++) {
+       try_request(c->first_l_arr_[i]);
+    }
+
+    for (int i=0; i < c->second_l_arr_.size(); i++) {
+       try_request(c->second_l_arr_[i]);
     }
 
     regs_process_requests();
@@ -178,16 +228,20 @@ Complex_walker::process_requests()
 void
 Complex_walker::regs_process_requests()
 {
-    for (iter_top(voice_reg_list_,j); j.ok(); j++) {
+    for (iter_top(voice_reg_list_, j); j.ok(); j++) {
        j->process_requests();
     }
-    group_regs_.process_requests();
+    for (iter_top(group_reg_list_, j); j.ok(); j++) 
+       j->process_requests();
+    
     local_key_reg_.process_request();
 }
 
 void
 Complex_walker::typeset_element(Staff_elem *elem_p)
 {
+    if (!elem_p)
+       return;
     if (elem_p->spanner())
        pscore_l_->typeset_spanner(elem_p->spanner(), staff()->theline_l_);
     else
@@ -196,7 +250,6 @@ Complex_walker::typeset_element(Staff_elem *elem_p)
 
 Complex_walker::Complex_walker(Complex_staff*s)
     : Staff_walker(s, s->theline_l_->pscore_l_),
-      group_regs_(this),
       local_key_reg_(this)      
 {
     oldkey_undo = 0;
@@ -221,14 +274,15 @@ Complex_walker::do_pre_move()
     for (iter_top(voice_reg_list_,i); i.ok(); i++) {
        i->pre_move_processing();   
     }
-    group_regs_.pre_move_processing();
+    for (iter_top (group_reg_list_, j); j.ok(); j++) 
+       j->pre_move_processing();
     local_key_reg_.pre_move_processing();
 }
 
 void
 Complex_walker::do_post_move()
 {
-    processed_clef =false;    
+    processed_clef = false;    
     processed_key = false;
     processed_bar_priority = 0;
     
@@ -236,6 +290,7 @@ Complex_walker::do_post_move()
        i->post_move_processing();   
     }
     announce_info_arr_.set_size(0);
-    group_regs_.post_move_processing();
+    for (iter_top (group_reg_list_, j); j.ok(); j++) 
+       j->post_move_processing();
     local_key_reg_.post_move_processing();
 }