6 #include "simplestaff.hh"
7 #include "simplewalker.hh"
10 #include "notehead.hh"
14 #include "clefitem.hh"
17 #include "localkeyitem.hh"
20 Simple_walker::do_INTERPRET_command(Command*com)
22 if (com->args[0] == "BAR") {
23 local_key_.reset(key_);
24 } else if (com->args[0] == "KEY") {
25 svec<Scalar>s(com->args);
29 oldkey_undo = new svec<int>( key_.oldkey_undo(s));
32 typesetkey = key_.read(s);
33 local_key_.reset(key_);
34 } else if (com->args[0] == "CLEF") {
35 svec<Scalar>s(com->args);
39 WARN << " ignoring INTERPRET command: " << com->args[0]<< '\n';
44 Simple_walker::do_TYPESET_command(Command*com)
46 /* ignore these commands if non-default versions have been
48 if (com->args[0] == "CURRENTKEY")
54 if (com->args[0] == "CURRENTCLEF") {
60 Item* i = staff()->get_TYPESET_item(com);
64 if (com->args[0] == "KEY") {
66 ((Keyitem*) i)->read(*oldkey_undo);
71 ((Keyitem*) i)->read(typesetkey); // ugh
74 if (com->args[0] == "CLEF"||com->args[0] == "CURRENTCLEF") {
76 Clef_item*c=(Clef_item*)i;
78 c->change = (break_status != BREAK_POST - BREAK_PRE);
80 col()->typeset_item_directional(i, 1, break_status);
84 Simple_walker::do_local_key(Note_req*n)
86 if ( local_key_.oct(n->octave).acc(n->name) != n->accidental) {
87 if (!local_key_item_) {
88 local_key_item_ = staff()->get_local_key_item();
89 local_key_item_->c0_position = clef_.c0_pos;
92 local_key_item_->add(n->octave, n->name, n->accidental);
93 local_key_.oct(n->octave).set(n->name, n->accidental);
98 Simple_walker::do_note(Rhythmic_req*rq)
100 Simple_column*c = col();
101 Simple_staff *s = staff();
104 Note_req * req = rq->note() ;
105 const Voice *v = req->elt->voice_;
107 Notehead*n = s->get_notehead(req, clef_.c0_pos);
110 int sidx =find_slur(v);
112 pending_slurs[sidx]->add(n);
120 c->typeset_item( s->get_rest(rq->rest()) );
125 Simple_walker::process_requests()
127 Simple_column*c = col();
128 Simple_staff *s = staff();
129 if (c->beam_&& c->beam_->spantype == Span_req::START) {
131 error("Too many beams (t = "
132 +String(c->when())+")");
135 for (int i=0; i < c->slurs.sz(); i++) {
136 Slur_req*sl = c->slurs[i];
138 if (sl->spantype == Span_req::START) {
139 if (find_slur(sl->elt->voice_ )>=0)
140 error("Too many slurs in voice");
141 pending_slur_reqs.add(sl);
142 pending_slurs.add(new Slur);
147 stem_ = s->get_stem(c->stem_->stem(), c->stem_requester_len);
150 for (int i = 0; i < c->notes.sz(); i ++) {
151 do_note(c->notes[i]);
156 error("beamed note should have a stem (t = "
157 +String(c->when())+")");
161 c->typeset_item(stem_);
162 /* needed, otherwise placement of
163 local_key fucks up */
164 // stem_->set_default_extents();
165 // can somebody explain myself?
167 if (c->beam_&& c->beam_->spantype == Span_req::STOP) {
168 pscore_->typeset_spanner(beam_, s->theline);
171 for (int i = 0; i < noteheads.sz(); i++) {
172 c->typeset_item(noteheads[i]);
174 noteheads.set_size(0);
176 if (local_key_item_) {
177 c->typeset_item_directional(local_key_item_, -1);
183 for (int i=0; i < c->slurs.sz(); i++) {
184 Slur_req*sl = c->slurs[i];
186 if (sl->spantype == Span_req::STOP) {
187 int idx = find_slur(sl->elt->voice_);
189 error("can't find slur to end");
191 pscore_->typeset_spanner(pending_slurs[idx],
193 pending_slurs.del(idx);
194 pending_slur_reqs.del(idx);
200 Simple_walker::Simple_walker(Simple_staff*s)
201 : Staff_walker(s, s->theline->pscore_)
207 Local_key_item * i = s->get_local_key_item();
217 Simple_walker::staff()
219 return (Simple_staff*) staff_;
225 return (Simple_column*) *(*this);
229 Simple_walker::reset()
231 processed_clef =false;
232 processed_key = false;
236 Simple_walker::find_slur(const Voice *v)
238 for (int i=0; i < pending_slur_reqs.sz(); i++) {
239 if (pending_slur_reqs[i]->elt->voice_ == v)