10 #include "simplestaff.hh"
11 #include "simplewalker.hh"
14 #include "notehead.hh"
18 #include "clefitem.hh"
21 #include "localkeyitem.hh"
24 parse_grouping(svec<Scalar> a, Moment one_beat)
28 for (int i= 0 ; i < a.sz(); i++)
32 svec<Rhythmic_grouping*> children;
33 for (int i=0; i < r.sz(); i++) {
36 here += one_beat * r[i];
38 new Rhythmic_grouping(MInterval(last, here), r[i] )
41 return Rhythmic_grouping(children);
45 Simple_walker::do_INTERPRET_command(Command*com)
47 svec<Scalar> args(com->args);
49 if (com->args[0] == "GROUPING") {
50 default_grouping = parse_grouping(args, col()->tdescription_->one_beat);
51 }else if (com->args[0] == "BAR") {
52 local_key_.reset(key_);
54 } else if (com->args[0] == "KEY") {
58 oldkey_undo = new svec<int>( key_.oldkey_undo(args));
61 typesetkey = key_.read(args);
62 local_key_.reset(key_);
63 } else if (com->args[0] == "CLEF") {
66 WARN << " ignoring INTERPRET command: " << com->args[0]<< '\n';
71 Simple_walker::do_TYPESET_command(Command*com)
73 /* ignore these commands if non-default versions have been
75 if (com->args[0] == "CURRENTKEY")
81 if (com->args[0] == "CURRENTCLEF") {
87 Item* i = staff()->get_TYPESET_item(com);
91 if (com->args[0] == "KEY") {
93 ((Keyitem*) i)->read(*oldkey_undo);
98 ((Keyitem*) i)->read(typesetkey); // ugh
101 if (com->args[0] == "CLEF"||com->args[0] == "CURRENTCLEF") {
102 processed_clef =true;
103 Clef_item*c=(Clef_item*)i;
105 c->change = (break_status != BREAK_POST - BREAK_PRE);
107 col()->typeset_item_directional(i, 1, break_status);
111 Simple_walker::do_local_key(Note_req*n)
113 if ( local_key_.oct(n->octave).acc(n->name) != n->accidental) {
114 if (!local_key_item_) {
115 local_key_item_ = staff()->get_local_key_item();
116 local_key_item_->c0_position = clef_.c0_pos;
119 local_key_item_->add(n->octave, n->name, n->accidental);
120 local_key_.oct(n->octave).set(n->name, n->accidental);
125 Simple_walker::do_note(Rhythmic_req*rq)
127 Simple_column*c = col();
128 Simple_staff *s = staff();
131 Note_req * req = rq->note() ;
132 const Voice *v = req->elt->voice_;
134 Notehead*n = s->get_notehead(req, clef_.c0_pos);
136 if (current_grouping) {
137 current_grouping->add_child(
138 c->tdescription_->whole_in_measure, rq->duration());
141 int sidx =find_slur(v);
143 pending_slurs[sidx]->add(n);
151 c->typeset_item( s->get_rest(rq->rest()) );
156 Simple_walker::process_requests()
158 Simple_column*c = col();
159 Simple_staff *s = staff();
160 if (c->beam_&& c->beam_->spantype == Span_req::START) {
162 error("Too many beams (t = "
163 +String(c->when())+")");
165 current_grouping = new Rhythmic_grouping;
167 for (int i=0; i < c->slurs.sz(); i++) {
168 Slur_req*sl = c->slurs[i];
170 if (sl->spantype == Span_req::START) {
171 if (find_slur(sl->elt->voice_ )>=0)
172 error_t("Too many slurs in voice", col()->when());
173 pending_slur_reqs.add(sl);
174 pending_slurs.add(new Slur);
179 stem_ = s->get_stem(c->stem_->stem(), c->stem_requester_len);
182 for (int i = 0; i < c->notes.sz(); i ++) {
183 do_note(c->notes[i]);
188 WARN <<"beamed note should have a stem (t = "
189 <<String(c->when())<<"\n";
196 c->typeset_item(stem_);
197 /* needed, otherwise placement of
198 local_key fucks up */
200 if (c->beam_&& c->beam_->spantype == Span_req::STOP) {
201 beam_->set_grouping(default_grouping, *current_grouping);
202 pscore_->typeset_spanner(beam_, s->theline);
204 delete current_grouping;
207 for (int i = 0; i < noteheads.sz(); i++) {
208 c->typeset_item(noteheads[i]);
210 noteheads.set_size(0);
212 if (local_key_item_) {
213 c->typeset_item_directional(local_key_item_, -1);
219 for (int i=0; i < c->slurs.sz(); i++) {
220 Slur_req *sl = c->slurs[i];
222 if (sl->spantype == Span_req::STOP) {
223 int idx = find_slur(sl->elt->voice_);
225 error("can't find slur to end");
227 pscore_->typeset_spanner(pending_slurs[idx],
229 pending_slurs.del(idx);
230 pending_slur_reqs.del(idx);
236 Simple_walker::Simple_walker(Simple_staff*s)
237 : Staff_walker(s, s->theline->pscore_)
242 current_grouping = 0;
243 Local_key_item * i = s->get_local_key_item();
253 Simple_walker::staff()
255 return (Simple_staff*) staff_;
261 return (Simple_column*) *(*this);
265 Simple_walker::reset()
267 processed_clef =false;
268 processed_key = false;
272 Simple_walker::find_slur(const Voice *v)
274 for (int i=0; i < pending_slur_reqs.sz(); i++) {
275 if (pending_slur_reqs[i]->elt->voice_ == v)