#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)
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_);
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);
}
}
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";
}
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();
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
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;
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;
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();
}