2 request.cc -- implement all musical requests.
4 source file of the GNU LilyPond music typesetter
6 (c) 1997 Han-Wen Nienhuys <hanwen@stack.nl>
9 #include "musical-request.hh"
12 #include "script-def.hh"
13 #include "text-def.hh"
14 #include "music-list.hh"
18 IMPLEMENT_IS_TYPE_B1(Musical_req
,Request
);
20 Musical_req::do_print() const{}
22 Tie_req::do_print() const{}
30 IMPLEMENT_IS_TYPE_B1(Span_req
,Musical_req
);
33 Span_req::do_print() const
40 IMPLEMENT_IS_TYPE_B1(Spacing_req
,Request
);
42 Spacing_req::Spacing_req()
50 Spacing_req::do_print() const
53 DOUT
<< "next " << next
<< "dist " << distance
<< "strength\n";
57 IMPLEMENT_IS_TYPE_B1 (Abbreviation_req
, Musical_req
);
59 Abbreviation_req::Abbreviation_req ()
65 Abbreviation_req::do_print() const
68 DOUT
<< "type " << type_i_
<< "\n";
73 IMPLEMENT_IS_TYPE_B2(Blank_req
,Spacing_req
,Rhythmic_req
);
76 Blank_req::do_print() const
78 Spacing_req::do_print();
82 Melodic_req::Melodic_req()
90 Melodic_req::transpose (Melodic_req
const * delta
)
92 int old_pitch
= pitch();
93 int delta_pitch
= delta
->pitch();
94 octave_i_
+= delta
->octave_i_
;
95 notename_i_
+= delta
->notename_i_
;
96 while (notename_i_
>= 7)
102 int new_pitch
= pitch();
103 int delta_acc
= new_pitch
- old_pitch
- delta_pitch
;
105 accidental_i_
-= delta_acc
;
106 if (abs (accidental_i_
) > 2)
108 delta
->warning (_("transposition makes accidental larger than 2"));
112 IMPLEMENT_IS_TYPE_B1(Melodic_req
,Musical_req
);
115 Melodic_req::do_equal_b (Request
*r
) const
117 Melodic_req
* m
= r
->musical()->melodic ();
118 return !compare (*m
, *this);
122 Melodic_req::compare (Melodic_req
const &m1
, Melodic_req
const&m2
)
124 int o
= m1
.octave_i_
- m2
.octave_i_
;
125 int n
= m1
.notename_i_
- m2
.notename_i_
;
126 int a
= m1
.accidental_i_
- m2
.accidental_i_
;
138 Melodic_req::do_print() const
141 DOUT
<< "notename: " << notename_i_
142 << " acc: " <<accidental_i_
<<" oct: "<< octave_i_
;
147 Melodic_req::height() const
149 return notename_i_
+ octave_i_
*7;
153 should be settable from input to allow "viola"-mode
155 static Byte pitch_byte_a
[ ] = { 0, 2, 4, 5, 7, 9, 11 };
158 Melodic_req::pitch() const
160 return pitch_byte_a
[ notename_i_
% 7 ] + accidental_i_
+ octave_i_
* 12;
163 /* *************** */
165 Rhythmic_req::compare (Rhythmic_req
const &r1
, Rhythmic_req
const &r2
)
167 return (r1
.duration() - r2
.duration ());
171 Rhythmic_req::do_equal_b (Request
*r
) const
173 Rhythmic_req
* rh
= r
->musical()->rhythmic ();
175 return !compare (*this, *rh
);
179 Rhythmic_req::set_duration (Duration d
)
184 Rhythmic_req::Rhythmic_req()
189 IMPLEMENT_IS_TYPE_B1(Rhythmic_req
,Musical_req
);
192 Rhythmic_req::do_print() const
195 DOUT
<< "duration { " <<duration_
.str() << "}";
201 Rhythmic_req::duration() const
203 return duration_
.length();
205 /* *************** */
207 Lyric_req::Lyric_req (Text_def
* def_p
)
210 def_p
->align_i_
= CENTER
; // centre
211 dir_
= DOWN
; // lyrics below (invisible) staff
215 IMPLEMENT_IS_TYPE_B2(Lyric_req
,Musical_req
,Rhythmic_req
);
218 Lyric_req::do_print() const
220 Rhythmic_req::do_print();
221 Text_req::do_print();
224 /* *************** */
226 Note_req::do_equal_b (Request
*r
) const
228 return Rhythmic_req::do_equal_b (r
) && Melodic_req::do_equal_b (r
);
237 IMPLEMENT_IS_TYPE_B2(Note_req
,Melodic_req
,Rhythmic_req
);
240 Note_req::do_print() const
243 Melodic_req::do_print();
246 DOUT
<< " force accidental\n";
248 Rhythmic_req::do_print();
251 /* *************** */
253 IMPLEMENT_IS_TYPE_B1(Rest_req
,Rhythmic_req
);
256 Rest_req::do_print() const
258 Rhythmic_req::do_print();
261 /* *************** */
263 IMPLEMENT_IS_TYPE_B1(Beam_req
,Span_req
);
270 Beam_req::do_print() const
274 /* *************** */
276 IMPLEMENT_IS_TYPE_B1 (Abbreviation_beam_req
, Span_req
);
278 Abbreviation_beam_req::Abbreviation_beam_req ()
284 Abbreviation_beam_req::do_print () const
288 IMPLEMENT_IS_TYPE_B1(Slur_req
,Span_req
);
290 Slur_req::do_print() const
294 IMPLEMENT_IS_TYPE_B1(Plet_req
,Span_req
);
296 Plet_req::Plet_req ()
302 Plet_req::do_print () const
306 /* *************** */
309 Span_req:: do_equal_b (Request
*r
) const
311 Span_req
* s
= r
->span();
312 return spantype
== s
->spantype
;
320 /* *************** */
321 Script_req::Script_req (Script_req
const&s
)
324 scriptdef_p_
= s
.scriptdef_p_
? s
.scriptdef_p_
->clone() : 0;
333 Script_req::do_equal_b (Request
*r
) const
335 Script_req
* s
= r
->script();
337 return scriptdef_p_
->equal_b (*s
->scriptdef_p_
);
340 Script_req::Script_req()
347 IMPLEMENT_IS_TYPE_B1(Script_req
,Request
);
350 Script_req::do_print() const
353 DOUT
<< " dir " << dir_
;
354 scriptdef_p_
->print();
359 Musical_script_req::do_print() const
361 Script_req::do_print();
365 IMPLEMENT_IS_TYPE_B2(Musical_script_req
,Musical_req
, Script_req
);
368 Script_req::~Script_req()
372 /* *************** */
375 Text_req::~Text_req()
381 Text_req::Text_req (Text_req
const& src
)
383 tdef_p_
= new Text_def (*src
.tdef_p_
);
387 Text_req::Text_req (int dir_i
, Text_def
* tdef_p
)
389 dir_
= Direction(dir_i
);
394 IMPLEMENT_IS_TYPE_B1(Text_req
,Musical_req
);
397 Text_req::do_print() const
400 DOUT
<< " dir " << dir_
;
405 /* *************** */
408 IMPLEMENT_IS_TYPE_B1(Skip_req
,Musical_req
);
411 Skip_req::do_print() const
415 DOUT
<< "duration: " << duration();
421 IMPLEMENT_IS_TYPE_B1(Dynamic_req
,Musical_req
);
424 Dynamic_req::do_print() const
426 Musical_req::do_print();
430 IMPLEMENT_IS_TYPE_B1(Absolute_dynamic_req
,Musical_req
);
433 Absolute_dynamic_req::do_print() const
436 Dynamic_req::do_print();
437 DOUT
<< " loudness " <<loudness_str ();
443 Absolute_dynamic_req::do_equal_b (Request
*r
) const
445 Absolute_dynamic_req
*a
= r
->musical ()->dynamic ()->absdynamic ();
446 return loudness_
== a
->loudness_
;
450 Dynamic_req::loudness_static_str (Loudness l
)
454 case FFF
: return "fff";
455 case FF
: return "ff";
457 case MF
: return "mf";
458 case MP
: return "mp";
460 case PP
: return "pp";
461 case PPP
: return "ppp";
462 case FP
: return "fp";
463 case SF
: return "sf";
464 case SFZ
: return "sfz";
470 Absolute_dynamic_req::loudness_str () const
472 String s
= loudness_static_str (loudness_
);
476 warning (String (_("Never heard of dynamic scale "))
477 + loudness_
+ _(" assuming mf"));
483 Absolute_dynamic_req::Absolute_dynamic_req()
489 Span_dynamic_req::Span_dynamic_req()
491 dynamic_dir_
= CENTER
;
495 IMPLEMENT_IS_TYPE_B1(Span_dynamic_req
,Musical_req
);
498 Span_dynamic_req::do_print() const
501 Span_req::do_print();
502 DOUT
<< "softer/louder: " <<dynamic_dir_
;
507 IMPLEMENT_IS_TYPE_B1(Tie_req
,Musical_req
);