4 #include "textspanner.hh"
11 #include "simplestaff.hh"
12 #include "simplewalker.hh"
15 #include "notehead.hh"
19 #include "clefitem.hh"
22 #include "localkeyitem.hh"
23 #include "textitem.hh"
26 parse_grouping(Array<Scalar> a, Moment one_beat)
29 for (int i= 0 ; i < a.size(); i++)
33 Array<Rhythmic_grouping*> children;
34 for (int i=0; i < r.size(); i++) {
37 here += one_beat * r[i];
39 new Rhythmic_grouping(MInterval(last, here), r[i] )
42 return Rhythmic_grouping(children);
46 Simple_walker::do_INTERPRET_command(Command*com)
48 Array<Scalar> args(com->args);
50 if (com->args[0] == "GROUPING") {
51 default_grouping = parse_grouping(args,
52 col()->tdescription_->one_beat);
53 }else if (com->args[0] == "NEWMEASURE") {
54 local_key_.reset(key_);
56 } else if (com->args[0] == "KEY") {
58 if (col()->when() > Moment(0)) {
60 oldkey_undo = new Array<int>( key_.oldkey_undo(args));
63 typesetkey = key_.read(args);
64 local_key_.reset(key_);
65 } else if (com->args[0] == "CLEF") {
68 WARN << " ignoring INTERPRET command: " << com->args[0]<< '\n';
73 Simple_walker::do_TYPESET_command(Command*com)
75 /* ignore these commands if non-default versions have been
77 if (com->args[0] == "CURRENTKEY")
81 com->args[0] = "KEY"; // urgh
83 if (com->args[0] == "CURRENTCLEF") {
87 if (com->args[0] == "BAR") {
89 if (processed_bar_priority > com->priority)
92 processed_bar_priority = com->priority;
95 Item* i = staff()->get_TYPESET_item(com);
99 if (com->args[0] == "KEY") {
101 ((Keyitem*) i)->read(*oldkey_undo);
105 processed_key = true;
107 ((Keyitem*) i)->read(typesetkey); // ugh
110 if (com->args[0] == "CLEF"||com->args[0] == "CURRENTCLEF") {
111 processed_clef =true;
112 Clef_item*c=(Clef_item*)i;
114 c->change = (break_status != BREAK_POST - BREAK_PRE);
116 col()->typeset_item_directional(i, 1, break_status);
120 Simple_walker::do_local_key(Note_req*n,Notehead* head_p)
122 if ( local_key_.oct(n->octave).acc(n->name) != n->accidental) {
123 if (!local_key_item_) {
124 local_key_item_ = staff()->get_local_key_item();
125 local_key_item_->c0_position = clef_.c0_pos;
128 local_key_item_->add(n->octave, n->name, n->accidental, head_p);
129 local_key_.oct(n->octave).set(n->name, n->accidental);
134 Simple_walker::do_note(Note_info n)
136 Simple_column*c = col();
137 Simple_staff *s = staff();
140 Note_req * req = n.rq->note() ;
141 const Voice *v = req->elt_l_->voice_;
143 Notehead*n = s->get_notehead(req, clef_.c0_pos);
148 if (current_grouping) {
149 current_grouping->add_child(
150 c->tdescription_->whole_in_measure, req->duration());
153 int sidx =find_slur(v);
155 pending_slurs[sidx]->add(n);
160 }else if (n.rq->rest()) {
161 rhythmic = s->get_rest(n.rq->rest());
162 c->typeset_item(rhythmic);
164 for (int i= 0; i < n.scripts.size(); i ++)
165 c->typeset_item(new Script(n.scripts[i], rhythmic, 10, stem_)); // UGR
169 Simple_walker::process_requests()
171 Simple_column*c = col();
172 Simple_staff *s = staff();
174 if (c->beam_&& c->beam_->spantype == Span_req::START) {
176 error("Too many beams (t = "
177 +String(c->when())+")");
179 assert(!current_grouping);
180 current_grouping = new Rhythmic_grouping;
183 for (int i=0; i < c->slurs.size(); i++) {
184 Slur_req*sl = c->slurs[i];
186 if (sl->spantype == Span_req::START) {
187 if (find_slur(sl->elt_l_->voice_ )>=0)
188 error_t("Too many slurs in voice", col()->when());
189 pending_slur_reqs.add(sl);
190 pending_slurs.add(new Slur);
195 c->typeset_item(new Text_item(c->text_, 10)); // UGR
199 stem_ = s->get_stem(c->stem_->stem(), c->stem_requester_len);
202 for (int i = 0; i < c->notes.size(); i ++) {
203 do_note(c->notes[i]);
208 WARN <<"beamed note should have a stem (t = "
209 <<String(c->when())<<"\n";
216 c->typeset_item(stem_);
217 /* needed, otherwise placement of
218 local_key fucks up */
221 if (c->beam_&& c->beam_->spantype == Span_req::STOP) {
222 beam_->set_grouping(default_grouping, *current_grouping);
223 pscore_->typeset_spanner(beam_, s->theline);
225 if (c->beam_->nplet) {
226 Text_spanner* t = new Text_spanner(beam_);
228 t->spec.text = c->beam_->nplet;
229 pscore_->typeset_spanner(t, s->theline);
233 delete current_grouping;
236 for (int i = 0; i < noteheads.size(); i++) {
237 c->typeset_item(noteheads[i]);
239 noteheads.set_size(0);
241 if (local_key_item_) {
242 c->typeset_item_directional(local_key_item_, -1);
248 for (int i=0; i < c->slurs.size(); i++) {
249 Slur_req *sl = c->slurs[i];
251 if (sl->spantype == Span_req::STOP) {
252 int idx = find_slur(sl->elt_l_->voice_);
254 error_t("can't find slur to end; ", c->when());
256 pscore_->typeset_spanner(pending_slurs[idx],
258 pending_slurs.del(idx);
259 pending_slur_reqs.del(idx);
265 Simple_walker::Simple_walker(Simple_staff*s)
266 : Staff_walker(s, s->theline->pscore_l_)
271 current_grouping = 0;
272 Local_key_item * i = s->get_local_key_item();
282 Simple_walker::staff()
284 return (Simple_staff*) staff_;
290 return (Simple_column*) *(*this);
294 Simple_walker::reset()
296 processed_clef =false;
297 processed_key = false;
298 processed_bar_priority = 0;
302 Simple_walker::find_slur(const Voice *v)
304 for (int i=0; i < pending_slur_reqs.size(); i++) {
305 if (pending_slur_reqs[i]->elt_l_->voice_ == v)