2 // mudela-staff.cc -- implement Mudela_staff
4 // copyright 1997 Jan Nieuwenhuizen <janneke@gnu.org>
9 #include "duration-convert.hh"
10 #include "string-convert.hh"
11 #include "mi2mu-proto.hh"
12 #include "mi2mu-global.hh"
13 #include "mudela-column.hh"
14 #include "mudela-item.hh"
15 #include "mudela-staff.hh"
16 #include "mudela-stream.hh"
17 #include "mudela-voice.hh"
18 #include "mudela-score.hh"
20 extern Mudela_score* mudela_score_l_g;
22 Mudela_staff::Mudela_staff (int number_i, String copyright_str, String track_name_str, String instrument_str)
25 copyright_str_ = copyright_str;
26 instrument_str_ = instrument_str;
27 name_str_ = track_name_str;
29 mudela_time_signature_l_ = 0;
34 Mudela_staff::add_item (Mudela_item* mudela_item_p)
36 mudela_item_p_list_.bottom().add (mudela_item_p);
37 if (mudela_item_p->mudela_column_l_)
38 mudela_item_p->mudela_column_l_->add_item (mudela_item_p);
42 Mudela_staff::eat_voice (Link_list<Mudela_item*>& items)
44 Mudela_voice* voice_p = new Mudela_voice (this);
45 mudela_voice_p_list_.bottom().add (voice_p);
47 // Moment mom = items.top()->at_mom();
50 for (PCursor<Mudela_item*> i (items); i.ok();)
52 LOGOUT(DEBUG_ver) << "At: " << i->at_mom ().str () << "; ";
53 LOGOUT(DEBUG_ver) << "dur: " << i->duration_mom ().str () << "; ";
54 LOGOUT(DEBUG_ver) << "mom: " << mom.str () << " -> ";
55 if (i->at_mom() > mom)
57 Moment dur = i->at_mom() - mom;
59 Mudela_column* start = mudela_score_l_g->find_column_l (mom);
60 voice_p->add_item (new Mudela_skip (start, dur));
63 if (i->at_mom() == mom)
65 mom = i->at_mom() + i->duration_mom();
66 voice_p->add_item (i.remove_p());
71 LOGOUT(DEBUG_ver) << "mom: " << mom.str () << '\n';
76 Mudela_staff::id_str()
78 String id (name_str ());
79 char *cp = id.ch_l ();
80 char *end = cp + id.length_i();
92 Mudela_staff::name_str()
94 if (name_str_.length_i())
96 return String ("track") + to_str (char ('A' - 1 + number_i_));
102 Mudela_staff::output (Mudela_stream& mudela_stream_r)
104 mudela_stream_r << id_str() << " = \\notes";
105 mudela_stream_r << (mudela_voice_p_list_.size() > 1 ? "<" : "{");
106 mudela_stream_r << '\n';
107 mudela_stream_r << _ ("% midi copyright:") << copyright_str_ << '\n';
108 mudela_stream_r << _ ("% instrument:") << instrument_str_ << '\n';
110 // don't use last duration mode
111 // mudela_stream_r << "\\duration 4;\n";
112 if (mudela_voice_p_list_.size() == 1)
113 mudela_voice_p_list_.top()->output (mudela_stream_r);
115 for (PCursor<Mudela_voice*> i (mudela_voice_p_list_); i.ok(); i++)
117 mudela_stream_r << "{ ";
118 i->output (mudela_stream_r);
119 mudela_stream_r << "} ";
122 mudela_stream_r << (mudela_voice_p_list_.size() > 1 ? "\n>" : "\n}");
123 mudela_stream_r << " % " << name_str() << '\n';
127 Mudela_staff::output_mudela_begin_bar (Mudela_stream& mudela_stream_r, Moment now_mom, int bar_i)
129 Moment bar_mom = mudela_time_signature_l_->bar_mom();
130 Moment into_bar_mom = now_mom - Moment (bar_i - 1) * bar_mom;
134 mudela_stream_r << "|\n";
136 mudela_stream_r << "% " << String_convert::i2dec_str (bar_i, 0, ' ');
138 mudela_stream_r << ":" << Duration_convert::dur2_str (Duration_convert::mom2_dur (into_bar_mom));
139 mudela_stream_r << '\n';
143 #if 0 // not used for now
145 Mudela_staff::output_mudela_rest (Mudela_stream& mudela_stream_r, Moment begin_mom, Moment end_mom)
147 Moment bar_mom = mudela_time_signature_l_->bar_mom();
148 Moment now_mom = begin_mom;
150 int begin_bar_i = (int) (now_mom / bar_mom) + 1;
151 int end_bar_i = (int) (end_mom / bar_mom) + 1;
153 if (end_bar_i == begin_bar_i)
155 output_mudela_rest_remain (mudela_stream_r, end_mom - begin_mom);
159 // multiple bars involved
160 int bar_i = (int) (now_mom / bar_mom) + 1;
163 Moment begin_bar_mom = Moment (begin_bar_i - 1) * bar_mom;
164 if (now_mom > begin_bar_mom)
166 int next_bar_i = (int) (now_mom / bar_mom) + 2;
167 Moment next_bar_mom = Moment (next_bar_i - 1) * bar_mom;
168 assert (next_bar_mom <= end_mom);
170 Moment remain_mom = next_bar_mom - now_mom;
171 if (remain_mom > Moment (0))
173 output_mudela_rest_remain (mudela_stream_r, remain_mom);
174 now_mom += remain_mom;
177 bar_i = check_end_bar_i (now_mom, bar_i);
181 int count_i = end_bar_i - bar_i;
182 for (int i = 0; i < count_i; i++)
184 int begin_bar_i = check_begin_bar_i (now_mom, bar_i);
186 output_mudela_begin_bar (mudela_stream_r, now_mom, begin_bar_i);
187 mudela_stream_r << "r1 ";
188 // *mudela_stream_r.os_p_ << flush;
190 LOGOUT(NORMAL_ver) << begin_bar_i << flush;
191 bar_i = check_end_bar_i (now_mom, bar_i);
195 // use "int i" here, and gcc 2.7.2 hits internal compiler error
196 int ii = check_begin_bar_i (now_mom, bar_i);
198 output_mudela_begin_bar (mudela_stream_r, now_mom, ii);
200 // bar_i = check_end_bar_i (now_mom, bar_i);
202 Moment remain_mom = end_mom - Moment (end_bar_i - 1) * bar_mom;
203 if (remain_mom > Moment (0))
205 output_mudela_rest_remain (mudela_stream_r, remain_mom);
206 now_mom += remain_mom;
208 assert (now_mom == end_mom);
212 Mudela_staff::output_mudela_rest_remain (Mudela_stream& mudela_stream_r, Moment mom)
214 if (Duration_convert::no_quantify_b_s)
216 Duration dur = Duration_convert::mom2_dur (mom);
217 mudela_stream_r << "r" << dur.str() << " ";
218 // assert (mom == dur.mom());
219 assert (mom == dur.length());
223 Duration dur = Duration_convert::mom2standardised_dur (mom);
225 mudela_stream_r << "r" << dur.str() << " ";
231 Mudela_staff::process()
234 group items into voices
237 assert (mudela_score_l_g);
238 mudela_key_l_ = mudela_score_l_g->mudela_key_l_;
239 mudela_time_signature_l_ = mudela_score_l_g->mudela_time_signature_l_;
240 mudela_tempo_l_ = mudela_score_l_g->mudela_tempo_l_;
242 Link_list<Mudela_item*> items;
243 for (PCursor<Mudela_item*> i (mudela_item_p_list_); i.ok(); i++)
244 items.bottom().add (*i);