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 Spacing_req::Spacing_req()
47 IMPLEMENT_IS_TYPE_B1(Spacing_req,Request);
50 Spacing_req::do_print() const
53 DOUT << "next " << next << "dist " << distance << "strength\n";
58 IMPLEMENT_IS_TYPE_B2(Blank_req,Spacing_req,Rhythmic_req);
61 Blank_req::do_print() const
63 Spacing_req::do_print();
67 Melodic_req::Melodic_req()
75 Melodic_req::transpose (Melodic_req const & delta)
77 int old_pitch = pitch();
78 int delta_pitch = delta.pitch();
79 octave_i_ += delta.octave_i_;
80 notename_i_ += delta.notename_i_;
81 while (notename_i_ >= 7)
87 int new_pitch = pitch();
88 int delta_acc = new_pitch - old_pitch - delta_pitch;
90 accidental_i_ -= delta_acc;
91 if (abs (accidental_i_) > 2)
93 delta.warning ("transposition makes accidental larger than 2");
97 IMPLEMENT_IS_TYPE_B1(Melodic_req,Musical_req);
100 Melodic_req::do_equal_b (Request*r) const
102 Melodic_req* m= r->musical()->melodic ();
103 return !compare (*m, *this);
107 Melodic_req::compare (Melodic_req const &m1 , Melodic_req const&m2)
109 int o= m1.octave_i_ - m2.octave_i_;
110 int n = m1.notename_i_ - m2.notename_i_;
111 int a = m1.accidental_i_ - m2.accidental_i_;
123 Melodic_req::do_print() const
126 DOUT << "notename: " << notename_i_
127 << " acc: " <<accidental_i_<<" oct: "<< octave_i_;
132 Melodic_req::height() const
134 return notename_i_ + octave_i_*7;
138 should be settable from input to allow "viola"-mode
140 static Byte pitch_byte_a[ ] = { 0, 2, 4, 5, 7, 9, 11 };
143 Melodic_req::pitch() const
145 return pitch_byte_a[ notename_i_ % 7 ] + accidental_i_ + octave_i_ * 12;
148 /* *************** */
150 Rhythmic_req::compare (Rhythmic_req const &r1, Rhythmic_req const &r2)
152 return (r1.duration() - r2.duration ());
156 Rhythmic_req::do_equal_b (Request*r) const
158 Rhythmic_req* rh = r->musical()->rhythmic ();
160 return !compare (*this, *rh);
164 Rhythmic_req::set_duration (Duration d)
169 Rhythmic_req::Rhythmic_req()
174 IMPLEMENT_IS_TYPE_B1(Rhythmic_req,Musical_req);
177 Rhythmic_req::do_print() const
180 DOUT << "duration { " <<duration_.str() << "}";
186 Rhythmic_req::duration() const {
187 return duration_.length();
189 /* *************** */
191 Lyric_req::Lyric_req (Text_def* def_p)
194 def_p->align_i_ = 0; // centre
195 dir_ = DOWN; // lyrics below (invisible) staff
199 IMPLEMENT_IS_TYPE_B2(Lyric_req,Musical_req,Rhythmic_req);
202 Lyric_req::do_print() const
204 Rhythmic_req::do_print();
205 Text_req::do_print();
208 /* *************** */
210 Note_req::do_equal_b (Request*r) const
212 return Rhythmic_req::do_equal_b (r) && Melodic_req::do_equal_b (r);
221 IMPLEMENT_IS_TYPE_B2(Note_req,Melodic_req,Rhythmic_req);
224 Note_req::do_print() const
227 Melodic_req::do_print();
230 DOUT << " force accidental\n";
232 Rhythmic_req::do_print();
235 /* *************** */
237 IMPLEMENT_IS_TYPE_B1(Rest_req,Rhythmic_req);
240 Rest_req::do_print() const
242 Rhythmic_req::do_print();
245 /* *************** */
251 IMPLEMENT_IS_TYPE_B1(Beam_req,Span_req);
253 Beam_req::do_print() const{}
254 /* *************** */
256 IMPLEMENT_IS_TYPE_B1(Slur_req,Span_req);
258 Slur_req::do_print() const{}
259 /* *************** */
263 Span_req:: do_equal_b (Request*r) const
265 Span_req * s = r->span();
266 return spantype - s->spantype;
274 /* *************** */
275 Script_req::Script_req (Script_req const&s)
278 scriptdef_p_ = s.scriptdef_p_ ? s.scriptdef_p_->clone() : 0;
287 Script_req::do_equal_b (Request*r) const
289 Script_req * s = r->script();
291 return scriptdef_p_->equal_b (*s->scriptdef_p_);
294 Script_req::Script_req()
301 IMPLEMENT_IS_TYPE_B1(Script_req,Request);
304 Script_req::do_print() const
307 DOUT << " dir " << dir_ ;
308 scriptdef_p_->print();
313 Musical_script_req::do_print() const
315 Script_req::do_print();
319 IMPLEMENT_IS_TYPE_B2(Musical_script_req,Musical_req, Script_req);
322 Script_req::~Script_req()
326 /* *************** */
329 Text_req::~Text_req()
335 Text_req::Text_req (Text_req const& src)
337 tdef_p_ = new Text_def (*src.tdef_p_);
341 Text_req::Text_req (int dir_i, Text_def* tdef_p)
343 dir_ = Direction(dir_i);
348 IMPLEMENT_IS_TYPE_B1(Text_req,Musical_req);
351 Text_req::do_print() const
354 DOUT << " dir " << dir_ ;
359 /* *************** */
362 IMPLEMENT_IS_TYPE_B1(Skip_req,Musical_req);
365 Skip_req::do_print() const
369 DOUT << "duration: " << duration();
375 IMPLEMENT_IS_TYPE_B1(Dynamic_req,Musical_req);
378 Dynamic_req::do_print() const
380 Musical_req::do_print();
384 IMPLEMENT_IS_TYPE_B1(Absolute_dynamic_req,Musical_req);
387 Absolute_dynamic_req::do_print() const
390 Dynamic_req::do_print();
391 DOUT << " loudness " <<loudness_str (loudness_);
396 Dynamic_req::loudness_str (Loudness l)
400 case FFF: return "fff";
401 case FF: return "ff";
403 case MF: return "mf";
404 case MP: return "mp";
406 case PP: return "pp";
407 case PPP: return "ppp";
413 Absolute_dynamic_req::Absolute_dynamic_req()
419 Span_dynamic_req::Span_dynamic_req()
421 dynamic_dir_ = CENTER;
425 IMPLEMENT_IS_TYPE_B1(Span_dynamic_req,Musical_req);
428 Span_dynamic_req::do_print() const
431 Span_req::do_print();
432 DOUT << "softer/louder: " <<dynamic_dir_;
437 IMPLEMENT_IS_TYPE_B1(Tie_req,Musical_req);