2 request.cc -- implement all musical requests.
4 source file of the GNU LilyPond music typesetter
6 (c) 1997--1998 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);
232 Note_req::Note_req ()
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 /* *************** */
265 IMPLEMENT_IS_TYPE_B1 (Multi_measure_rest_req, Rhythmic_req);
268 Multi_measure_rest_req::do_print () const
270 Rhythmic_req::do_print ();
274 /* *************** */
276 IMPLEMENT_IS_TYPE_B1 (Beam_req,Span_req);
278 Beam_req::Beam_req ()
283 Beam_req::do_print () const
287 /* *************** */
289 IMPLEMENT_IS_TYPE_B1 (Abbreviation_beam_req, Span_req);
291 Abbreviation_beam_req::Abbreviation_beam_req ()
297 Abbreviation_beam_req::do_print () const
301 IMPLEMENT_IS_TYPE_B1 (Slur_req,Span_req);
303 Slur_req::do_print () const
307 IMPLEMENT_IS_TYPE_B1 (Plet_req,Span_req);
309 Plet_req::Plet_req ()
315 Plet_req::do_print () const
319 /* *************** */
322 Span_req:: do_equal_b (Request*r) const
324 Span_req * s = r->span ();
325 return spantype == s->spantype;
328 Span_req::Span_req ()
333 /* *************** */
334 Script_req::Script_req (Script_req const&s)
337 scriptdef_p_ = s.scriptdef_p_ ? s.scriptdef_p_->clone () : 0;
346 Script_req::do_equal_b (Request*r) const
348 Script_req * s = r->script ();
350 return scriptdef_p_->equal_b (*s->scriptdef_p_);
353 Script_req::Script_req ()
360 IMPLEMENT_IS_TYPE_B1 (Script_req,Request);
363 Script_req::do_print () const
366 DOUT << " dir " << dir_ ;
367 scriptdef_p_->print ();
372 Musical_script_req::do_print () const
374 Script_req::do_print ();
378 IMPLEMENT_IS_TYPE_B2 (Musical_script_req,Musical_req, Script_req);
381 Script_req::~Script_req ()
385 /* *************** */
388 Text_req::~Text_req ()
394 Text_req::Text_req (Text_req const& src)
396 tdef_p_ = new Text_def (*src.tdef_p_);
400 Text_req::Text_req (int dir_i, Text_def* tdef_p)
402 dir_ = Direction (dir_i);
407 IMPLEMENT_IS_TYPE_B1 (Text_req,Musical_req);
410 Text_req::do_print () const
413 DOUT << " dir " << dir_ ;
418 /* *************** */
421 IMPLEMENT_IS_TYPE_B1 (Skip_req,Musical_req);
424 Skip_req::do_print () const
428 DOUT << "duration: " << duration ();
434 IMPLEMENT_IS_TYPE_B1 (Dynamic_req,Musical_req);
437 Dynamic_req::do_print () const
439 Musical_req::do_print ();
443 IMPLEMENT_IS_TYPE_B1 (Absolute_dynamic_req,Musical_req);
446 Absolute_dynamic_req::do_print () const
449 Dynamic_req::do_print ();
450 DOUT << " loudness " <<loudness_str ();
456 Absolute_dynamic_req::do_equal_b (Request *r) const
458 Absolute_dynamic_req *a = r->musical ()->dynamic ()->absdynamic ();
459 return loudness_ == a->loudness_;
463 Dynamic_req::loudness_static_str (Loudness l)
467 case FFF: return "fff";
468 case FF: return "ff";
470 case MF: return "mf";
471 case MP: return "mp";
473 case PP: return "pp";
474 case PPP: return "ppp";
475 case FP: return "fp";
476 case SF: return "sf";
477 case SFZ: return "sfz";
483 Absolute_dynamic_req::loudness_str () const
485 String s = loudness_static_str (loudness_);
489 warning (String (_ ("Never heard of dynamic scale "))
490 + loudness_ + _ (" assuming mf"));
496 Absolute_dynamic_req::Absolute_dynamic_req ()
502 Span_dynamic_req::Span_dynamic_req ()
504 dynamic_dir_ = CENTER;
508 IMPLEMENT_IS_TYPE_B1 (Span_dynamic_req,Musical_req);
511 Span_dynamic_req::do_print () const
514 Span_req::do_print ();
515 DOUT << "softer/louder: " <<dynamic_dir_;
520 IMPLEMENT_IS_TYPE_B1 (Tie_req,Musical_req);