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