]> git.donarmstrong.com Git - lilypond.git/blob - lily/input-music.cc
f1047e8bf9fbc5312b977d662860e5d7a4340cfb
[lilypond.git] / lily / input-music.cc
1 #include "debug.hh"
2 #include "input-music.hh"
3 #include "voice.hh"
4 #include "musicalrequest.hh"
5 #include "voice-element.hh"
6
7 void
8 Input_music::check_plet(Voice_element* velt_l)
9 {
10     for (iter_top(velt_l->reqs,i); i.ok(); i++)
11         if ( i->plet() ) {
12             Moment start_moment = 0;
13             if ( !find_plet_start_bo( i->plet()->type_c_, start_moment ) ) {
14                 error( "begin of plet not found", i->defined_ch_c_l_ );
15                 break;
16             }
17             Moment moment = 0;
18             set_plet_backwards( moment, start_moment, i->plet()->dur_i_, i->plet()->type_i_ );
19             i.del();
20             break;
21         }
22 }
23
24 void
25 Simple_music::add(Voice_element*v)
26 {
27     voice_.add(v);
28 }
29
30 Moment
31 Simple_music::length()const
32 {
33     return voice_.last();
34 }
35 void
36 Simple_music::translate_time(Moment t)
37 {
38     voice_.start += t;
39 }
40
41 Voice_list
42 Simple_music::convert()const
43 {
44     Voice_list l;
45     l.bottom().add(new Voice(voice_));
46     return l;
47 }
48
49
50 void
51 Simple_music::print() const
52 {
53     mtor << "Simple_music {";
54     voice_.print();
55     mtor << "}\n";
56 }
57 bool
58 Simple_music::find_plet_start_bo(char c, Moment& moment_r)
59 {
60     return voice_.find_plet_start_bo(c, moment_r);
61 }
62 void 
63 Simple_music::set_plet_backwards(Moment& now_moment_r, Moment until_moment, int num_i, int den_i)
64 {
65     voice_.set_plet_backwards(now_moment_r, until_moment, num_i, den_i);
66 }
67
68 /* *************** */
69
70 void
71 Complex_music::add(Input_music*v)
72 {
73     elts.bottom().add(v);
74 }
75
76 void
77 Complex_music::print() const
78 {
79     for (iter_top(elts,i); i.ok(); i++)
80          i->print();
81 }
82
83 void
84 Complex_music::concatenate(Complex_music*h)
85 {
86     for (iter_top(h->elts,i); i.ok(); i++)
87         add(i->clone());    
88 }
89
90 Complex_music::Complex_music()
91 {
92 }
93
94 Complex_music::Complex_music(Complex_music const&s)
95 {
96     for (iter_top(s.elts,i); i.ok(); i++)
97         add(i->clone());
98 }
99 void
100 Complex_music::set_default_group(String g)
101 {
102     for (iter_top(elts,i); i.ok(); i++)
103             i->set_default_group(g);
104 }
105 bool
106 Complex_music::find_plet_start_bo(char c, Moment& moment_r)
107 {
108     for (iter_bot(elts,i); i.ok(); i--) {
109         if ( i->find_plet_start_bo(c, moment_r) )
110             return true;
111     }
112     return false;
113 }
114 void 
115 Complex_music::set_plet_backwards(Moment& now_moment_r, Moment until_moment, int num_i, int den_i)
116 {
117     for (iter_bot(elts,i); i.ok(); i--) {
118         i->set_plet_backwards(now_moment_r, until_moment, num_i, den_i);
119     }
120 }
121 /* *************************************************************** */
122
123 void
124 Music_voice::print() const
125 {
126     mtor << "Music_voice {";
127     Complex_music::print();    
128     mtor << "}\n";
129 }
130
131 void
132 Music_voice::add_elt(Voice_element*v)
133 {
134     PCursor<Input_music*> c(elts.bottom());
135     if (!c.ok() || !c->simple()) {
136         Simple_music*vs = new Simple_music;
137         
138         c.add(vs);
139     }
140     
141     c = elts.bottom();
142     Simple_music *s = c->simple();
143     s->add(v);              
144
145     check_plet(v);
146 }
147
148 Moment
149 Music_voice::length()const
150 {
151     Moment l = 0;
152     
153     for (iter_top(elts,i); i.ok(); i++)
154         l += i->length();
155     return l;
156 }
157
158     
159 Voice_list
160 Music_voice::convert()const
161 {
162     Voice_list l;
163     Moment here = 0;
164     
165     for (iter_top(elts,i); i.ok(); i++) {
166         Moment len = i->length();       
167         Voice_list k(i->convert());
168         k.translate_time(here); 
169         l.concatenate(k);
170         here +=len;     
171     }
172     return l;    
173 }
174
175 void
176 Music_voice::translate_time(Moment t)
177 {
178     elts.bottom()->translate_time(t);
179 }
180
181     
182     
183 /* *************** */
184
185 void
186 Music_general_chord::add_elt(Voice_element*v)
187 {
188     Simple_music*vs = new Simple_music;
189     vs->add(v);
190     elts.bottom().add(vs);
191
192     check_plet(v);
193 }
194
195 void
196 Music_general_chord::print() const
197 {
198     mtor << "Music_general_chord {";
199     Complex_music::print();
200      mtor << "}\n";
201 }
202
203 void
204 Music_general_chord::translate_time(Moment t)
205 {
206     for (iter_top(elts,i); i.ok(); i++) 
207         i->translate_time(t);    
208 }
209
210 Moment
211 Music_general_chord::length()const
212 {
213     Moment l =0;
214     
215     for (iter_top(elts,i); i.ok(); i++) 
216         l = l >? i->length();
217     return l;
218 }
219
220 Voice_list
221 Music_general_chord::convert()const
222 {
223     Voice_list l;
224     for (iter_top(elts,i); i.ok(); i++) {
225         Voice_list k(i->convert());
226         l.concatenate(k);
227     }
228     return l;
229 }
230
231 /* *************** */
232
233 void
234 Multi_voice_chord::set_default_group(String g)
235 {
236     int j=0;
237     for (iter_top(elts, i); i.ok(); i++) {
238         i->set_default_group(g + String(j));
239         j++;
240     }
241 }
242
243
244 /* *************** */
245
246 void
247 Voice_list::translate_time(Moment x)
248 {
249     for (iter_top(*this,i); i.ok(); i++)
250         i->start += x;    
251 }
252