flower-1.0.27
[lilypond.git] / src / staff.cc
blob2e650b008fb7578cf56d366e179cbac7e62bc5ed
1 #include "staff.hh"
2 #include "score.hh"
3 #include "voice.hh"
4 #include "staffwalker.hh"
5 #include "stcol.hh"
6 #include "sccol.hh"
7 #include "staffcommands.hh"
8 #include "debug.hh"
9 #include "inputcommands.hh"
10 #include "inputcommand.hh"
11 #include "request.hh"
13 void
14 Staff::do_commands(PointerList<Input_command*> score_wide,
15 PointerList<Input_command*> staff_wide)
17 Input_commands commands;
19 // bring in commands from voices.
20 for (iter_top(voices, i); i.ok(); i++) {
21 Moment here = i->start;
22 for (iter_top(i->elts, j); j.ok(); j++) {
23 for (iter_top(j->reqs, k); k.ok(); k++) {
24 if (k->command()){
25 commands.find_moment(here);
26 commands.add(*k->command()->com_p_,
27 score_l_->markers_assoc_);
30 here += j->duration;
33 for (iter_top(score_wide,i); i.ok(); i++)
34 commands.add(**i, score_l_->markers_assoc_);
35 for (iter_top(staff_wide,i); i.ok(); i++)
36 commands.add(**i, score_l_->markers_assoc_);
38 commands.parse(this);
41 void
42 Staff::add(PointerList<Voice*> &l)
44 for (iter_top(l,i); i.ok(); i++)
45 voices.bottom().add(i);
48 void
49 Staff::truncate_cols(Moment l)
51 iter_bot(cols, i);
52 for (; i->when() > l; i=cols.bottom()) {
53 Staff_column * col_p = i.get();
54 assert(col_p->when() > l);
55 delete col_p;
59 Paperdef*
60 Staff::paper() const
62 return score_l_->paper_p_;
65 void
66 Staff::clean_cols()
68 iter_top(cols,i);
69 for(; i.ok(); ){
70 if (!i->score_column_l_->used())
71 delete i.get();
72 else
73 i++;
77 Staff_column *
78 Staff::get_col(Moment w, bool mus)
80 iter_top(cols,i);
81 for (; i.ok(); i++) {
82 if (i->when() == w) {
83 if (i->musical_b() == mus) {
84 assert( score_l_->find_col(w,mus).ptr() == i->score_column_l_);
85 return i;
87 else if (!mus)
88 break;
89 } else if (i->when() > w)
90 break;
92 /* post: *sc > *->score_column_l_ || !i.ok() */
94 Score_column* sccol_l = score_l_->find_col(w,mus);
95 Staff_column* newst = create_col(sccol_l);
97 if (!i.ok()) {
98 cols.bottom().add(newst);
99 return cols.bottom();
102 if (mus) {
103 i.insert(newst);
105 return newst;
109 // making a fix at 2:30 am, with several beers drunk.
110 // but it works :-)
111 if ((i-1).ok()&& (i-1)->when() == newst->when()) {
112 i--;
115 i.insert(newst);
117 return newst;
120 void
121 Staff::get_marks(Array<String>&s_arr, Array<Moment>&m_arr)
123 for (iter_top(voices,i); i.ok(); i++) {
124 Moment now = i->start;
125 for (iter_top(i->elts,j); j.ok(); j++) {
126 for (iter_top(j->reqs, k); k.ok(); k++) {
127 if (k->mark()) { // ugh. 4 levels
128 s_arr.push(k->mark()->mark_str_);
129 m_arr.push(now);
132 now += j->duration;
137 put all stuff grouped vertically in the Staff_cols
139 void
140 Staff::setup_staffcols()
142 for (iter_top(voices,i); i.ok(); i++) {
144 Moment now = i->start;
145 for (iter_top(i->elts,j); j.ok(); j++) {
147 Staff_column *s_l= get_col(now, true);
148 assert(now == s_l->when());
149 s_l->add(j);
150 now += j->duration;
152 get_col(now, false);
154 OK();
155 set_time_descriptions();
160 void
161 Staff::set_time_descriptions()
163 Time_description t(0,0);
164 for (iter_top(cols,i); i.ok(); i++) {
165 if (i->staff_commands_p_)
166 t = i->staff_commands_p_->tdescription_;
167 else if (i->tdescription_)
168 t = *i->tdescription_;
169 if(!i->tdescription_) {
170 i->tdescription_ = new Time_description(i->when() - t.when ,&t);
175 void
176 Staff::process()
178 setup_staffcols();
179 OK();
180 walk();
183 void
184 Staff::OK() const
186 #ifndef NDEBUG
187 cols.OK();
188 voices.OK();
189 iter_top(cols, i);
190 iter_top(cols, j);
191 i++;
192 for (; i.ok(); j++,i++) {
193 if ( j->when() == i->when())
194 assert(!j->musical_b() && i->musical_b());
195 else
196 assert(j->when () < i->when() );
198 assert(score_l_);
199 #endif
203 Moment
204 Staff::last() const
206 Moment l = 0.0;
207 for (iter_top(voices,i); i.ok(); i++) {
208 l = l >? i->last();
210 return l;
214 void
215 Staff::print() const
217 #ifndef NPRINT
218 mtor << "Staff {\n";
219 for (iter_top(voices,i); i.ok(); i++) {
220 i->print();
222 mtor <<"}\n";
223 #endif
226 Staff::Staff()
228 score_l_ =0;
229 pscore_l_ =0;