From 812b658363bcbf6c313d6e9da57658958d4ee4dd Mon Sep 17 00:00:00 2001 From: fred Date: Sun, 24 Mar 2002 19:30:15 +0000 Subject: [PATCH] lilypond-0.0.27 --- src/complexwalker.cc | 153 +++++++++++++++++++++++++++++-------------- 1 file changed, 104 insertions(+), 49 deletions(-) diff --git a/src/complexwalker.cc b/src/complexwalker.cc index 5cc1b5b6a5..f1a73e0200 100644 --- a/src/complexwalker.cc +++ b/src/complexwalker.cc @@ -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 a, Moment one_beat) -{ - Array r; - for (int i= 0 ; i < a.size(); i++) - r.push(a[i]); - Moment here =0.0; - - Array 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 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: " <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(); } -- 2.39.5