]> git.donarmstrong.com Git - lilypond.git/blob - lily/musical-request.cc
patch::: 1.1.5.jcn2: extender
[lilypond.git] / lily / musical-request.cc
1 /*
2   request.cc -- implement all musical requests.
3
4   source file of the GNU LilyPond music typesetter
5
6   (c)  1997--1998 Han-Wen Nienhuys <hanwen@cs.uu.nl>
7 */
8
9 #include "musical-request.hh"
10 #include "misc.hh"
11 #include "debug.hh"
12 #include "script-def.hh"
13 #include "text-def.hh"
14 #include "music-list.hh"
15
16
17
18 IMPLEMENT_IS_TYPE_B1 (Musical_req,Request);
19 void
20 Musical_req::do_print () const{}
21 void
22 Tie_req::do_print () const{}
23
24
25
26 IMPLEMENT_IS_TYPE_B1(Span_req,Request);
27
28 IMPLEMENT_IS_TYPE_B2(Musical_span_req, Span_req, Musical_span_req);
29
30 void
31 Musical_span_req::do_print () const
32 {
33   Span_req::do_print ();
34 }
35              
36
37 void
38 Span_req::do_print () const
39 {
40 #ifndef NPRINT
41   DOUT << spantype;
42 #endif
43 }
44
45 IMPLEMENT_IS_TYPE_B1 (Spacing_req,Request);
46
47 Spacing_req::Spacing_req ()
48 {
49   next = 0;
50   distance = 0;
51   strength = 0;
52 }
53
54 void
55 Spacing_req::do_print () const
56 {
57 #ifndef NPRINT
58   DOUT << "next " << next << "dist " << distance << "strength\n";
59 #endif
60 }
61
62 IMPLEMENT_IS_TYPE_B1 (Abbreviation_req, Musical_req);
63
64 Abbreviation_req::Abbreviation_req ()
65 {
66   type_i_ = 0;
67 }
68
69 void
70 Abbreviation_req::do_print () const
71 {
72 #ifndef NPRINT
73   DOUT << "type " << type_i_ << '\n';
74 #endif
75 }
76
77
78 IMPLEMENT_IS_TYPE_B2 (Blank_req,Spacing_req,Rhythmic_req);
79
80 void
81 Blank_req::do_print () const
82 {
83   Spacing_req::do_print ();
84 }
85
86 Melodic_req::Melodic_req ()
87 {
88 }
89
90 void
91 Melodic_req::transpose (Musical_pitch delta)
92 {
93   pitch_.transpose (delta);
94   
95   if (abs (pitch_.accidental_i_) > 2)
96     {
97         warning (_f ("transposition by %s makes accidental larger than two",
98           delta.str ()));
99     }
100 }
101
102 IMPLEMENT_IS_TYPE_B1 (Melodic_req,Musical_req);
103
104 bool
105 Melodic_req::do_equal_b (Request*r) const
106 {
107   Melodic_req* m= dynamic_cast <Melodic_req *> (r);
108   return m&& !compare (*m, *this);
109 }
110
111 int
112 Melodic_req::compare (Melodic_req const &m1 , Melodic_req const&m2)
113 {
114   return Musical_pitch::compare (m1.pitch_, m2.pitch_);
115 }
116
117 void
118 Melodic_req::do_print () const
119 {
120 pitch_.print ();
121 }
122
123 int
124 Rhythmic_req::compare (Rhythmic_req const &r1, Rhythmic_req const &r2)
125 {
126   return (r1.duration () - r2.duration ());
127 }
128
129 bool
130 Rhythmic_req::do_equal_b (Request*r) const
131 {
132   Rhythmic_req* rh = dynamic_cast <Rhythmic_req *> (r);
133
134   return rh && !compare (*this, *rh);
135 }
136
137
138 IMPLEMENT_IS_TYPE_B1 (Rhythmic_req,Musical_req);
139
140 void
141 Rhythmic_req::do_print () const
142 {
143 #ifndef NPRINT
144   DOUT << "duration { " <<duration_.str () << "}";
145 #endif
146 }
147
148
149 Moment
150 Rhythmic_req::duration () const
151 {
152   return duration_.length ();
153 }
154
155 void
156 Rhythmic_req::compress (Moment m)
157 {
158   duration_.compress (m);
159 }
160   
161
162
163
164 IMPLEMENT_IS_TYPE_B1 (Lyric_req,Rhythmic_req);
165
166 void
167 Lyric_req::do_print () const
168 {
169   Rhythmic_req::do_print ();
170 }
171
172
173 bool
174 Note_req::do_equal_b (Request*r) const
175 {
176   Note_req *n = dynamic_cast<Note_req*> (r);
177   return n&& Rhythmic_req::do_equal_b (n) && Melodic_req::do_equal_b (n);
178 }
179
180
181 Note_req::Note_req ()
182 {
183   cautionary_b_ = false;
184   forceacc_b_ = false;
185 }
186
187 IMPLEMENT_IS_TYPE_B2 (Note_req,Melodic_req,Rhythmic_req);
188
189 void
190 Note_req::do_print () const
191 {
192 #ifndef NPRINT
193   Melodic_req::do_print ();
194   if (cautionary_b_)
195     {
196         DOUT << " force cautionary accidental\n";
197     }
198   else if (forceacc_b_)
199     {
200         DOUT << " force accidental\n";
201     }
202   Rhythmic_req::do_print ();
203 #endif
204 }
205
206 IMPLEMENT_IS_TYPE_B1 (Rest_req, Rhythmic_req);
207
208 void
209 Rest_req::do_print () const
210 {
211       Rhythmic_req::do_print ();
212 }
213
214
215
216
217 IMPLEMENT_IS_TYPE_B1 (Multi_measure_rest_req, Rhythmic_req);
218
219 void
220 Multi_measure_rest_req::do_print () const
221 {
222       Rhythmic_req::do_print ();
223 }
224
225
226
227 IMPLEMENT_IS_TYPE_B1 (Beam_req,Span_req);
228
229
230 void
231 Beam_req::do_print () const
232 {
233 }
234
235
236 IMPLEMENT_IS_TYPE_B1 (Abbreviation_beam_req, Span_req);
237
238 Abbreviation_beam_req::Abbreviation_beam_req ()
239 {
240   type_i_ = 0;
241 }
242
243 void
244 Abbreviation_beam_req::do_print () const
245 {
246 }
247
248 IMPLEMENT_IS_TYPE_B1 (Slur_req,Span_req);
249 void
250 Slur_req::do_print () const
251 {
252 }
253
254 IMPLEMENT_IS_TYPE_B1 (Plet_req,Span_req);
255
256 Plet_req::Plet_req ()
257 {
258   plet_i_ = 0;
259 }
260
261 void
262 Plet_req::do_print () const
263 {
264 }
265
266 IMPLEMENT_IS_TYPE_B1 (Extender_req,Span_req);
267
268 Extender_req::Extender_req ()
269 {
270 }
271
272 void
273 Extender_req::do_print () const
274 {
275 }
276
277
278 bool
279 Span_req::do_equal_b (Request*r) const
280 {
281   Span_req * s = dynamic_cast <Span_req *> (r);
282   return s && spantype == s->spantype;
283 }
284
285 Span_req::Span_req ()
286 {
287   spantype = NOSPAN;
288 }
289
290 Script_req::Script_req (Script_req const&s)
291 {
292   dir_ = s.dir_;
293   scriptdef_p_ = s.scriptdef_p_ ? s.scriptdef_p_->clone () : 0;
294 }
295
296 /*
297   don't check dirs?
298
299   (d1.dir_ == d2.dir_)
300  */
301 bool
302 Script_req::do_equal_b (Request*r) const
303 {
304   Script_req * s = dynamic_cast <Script_req *> (r);
305
306   return s&&  scriptdef_p_->equal_b (*s->scriptdef_p_);
307 }
308
309 Script_req::Script_req ()
310 {
311   dir_ = CENTER;
312   scriptdef_p_ = 0;
313 }
314
315
316 IMPLEMENT_IS_TYPE_B1 (Script_req,Request);
317
318 void
319 Script_req::do_print () const
320 {
321 #ifndef NPRINT
322   DOUT << " dir " << dir_;
323   scriptdef_p_->print ();
324 #endif
325 }
326
327 void
328 Musical_script_req::do_print () const
329 {
330   Script_req::do_print ();
331 }
332
333
334 IMPLEMENT_IS_TYPE_B2 (Musical_script_req,Musical_req, Script_req);
335
336
337 Script_req::~Script_req ()
338 {
339   delete scriptdef_p_;
340 }
341
342
343 Text_req::~Text_req ()
344 {
345   delete tdef_p_;
346   tdef_p_ = 0;
347 }
348
349 Text_req::Text_req (Text_req const& src)
350 {
351   tdef_p_ = new Text_def (*src.tdef_p_);
352   dir_ = src.dir_;
353 }
354
355 Text_req::Text_req (int dir_i, Text_def* tdef_p)
356 {
357   dir_ = Direction (dir_i);
358   tdef_p_ = tdef_p;
359 }
360
361
362 IMPLEMENT_IS_TYPE_B1 (Text_req,Musical_req);
363
364 void
365 Text_req::do_print () const
366 {
367 #ifndef NPRINT
368   DOUT << " dir " << dir_;
369   tdef_p_->print ();
370 #endif
371 }
372
373
374
375 IMPLEMENT_IS_TYPE_B1 (Skip_req,Musical_req);
376
377 void
378 Skip_req::do_print () const
379 {
380 #ifndef NPRINT
381
382   DOUT << "duration: " << duration ();
383 #endif
384 }
385
386
387
388 IMPLEMENT_IS_TYPE_B1 (Dynamic_req,Musical_req);
389
390 void
391 Dynamic_req::do_print () const
392 {
393   Musical_req::do_print ();
394 }
395
396
397 IMPLEMENT_IS_TYPE_B1 (Absolute_dynamic_req,Musical_req);
398
399 void
400 Absolute_dynamic_req::do_print () const
401 {
402 #ifndef NPRINT
403   Dynamic_req::do_print ();
404   DOUT << " loudness " <<loudness_str ();
405 #endif
406 }
407
408
409 bool
410 Absolute_dynamic_req::do_equal_b (Request *r) const
411 {
412   Absolute_dynamic_req *a = dynamic_cast <Absolute_dynamic_req *> (r);
413   return a&& loudness_ == a->loudness_;
414 }
415
416 String
417 Dynamic_req::loudness_static_str (Loudness l)
418 {
419   switch (l)
420     {
421     case FFF: return "fff";
422     case FF: return "ff";
423     case F: return "f";
424     case MF: return "mf";
425     case MP: return "mp";
426     case P: return "p";
427     case PP: return "pp";
428     case PPP: return "ppp";
429     case FP: return "fp";
430     case SF: return "sf";
431     case SFZ: return "sfz";
432     }
433   return "";
434 }
435
436 String
437 Absolute_dynamic_req::loudness_str () const
438 {
439   String str = loudness_static_str (loudness_);
440   if (str.empty_b ())
441     {
442       String s = "mf";
443       warning (_f ("never heard of dynamic scale `\%s\', assuming %s",
444         str, s));
445       str = s;
446     }
447   return str;
448 }
449
450
451 Absolute_dynamic_req::Absolute_dynamic_req ()
452 {
453   loudness_ = MF;
454 }
455
456
457
458 bool
459 Span_dynamic_req::do_equal_b (Request *req) const
460 {
461   Span_dynamic_req * s = dynamic_cast <Span_dynamic_req *> (req);
462
463   return s&& Span_req::do_equal_b (req) && s->dynamic_dir_ == dynamic_dir_;
464 }
465
466 Span_dynamic_req::Span_dynamic_req ()
467 {
468   dynamic_dir_  = CENTER;
469 }
470
471
472 IMPLEMENT_IS_TYPE_B1 (Span_dynamic_req,Musical_req);
473
474 void
475 Span_dynamic_req::do_print () const
476 {
477 #ifndef NPRINT
478   Span_req::do_print ();
479   DOUT << "softer/louder: " << dynamic_dir_;
480 #endif
481 }
482
483
484 IMPLEMENT_IS_TYPE_B1 (Tie_req,Musical_req);