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"
17 IMPLEMENT_IS_TYPE_B1(Stem_req,Rhythmic_req);
20 Stem_req::do_print() const
23 Rhythmic_req::do_print();
24 DOUT << "dir : " << dir_i_;
35 IMPLEMENT_IS_TYPE_B1(Musical_req,Request);
37 Musical_req::do_print()const{}
39 Tie_req::do_print()const{}
47 IMPLEMENT_IS_TYPE_B1(Span_req,Musical_req);
50 Span_req::do_print() const
57 Spacing_req::Spacing_req()
64 IMPLEMENT_IS_TYPE_B1(Spacing_req,Request);
67 Spacing_req::do_print()const
70 DOUT << "next " << next << "dist " << distance << "strength\n";
75 IMPLEMENT_IS_TYPE_B2(Blank_req,Spacing_req,Rhythmic_req);
78 Blank_req::do_print()const
80 Spacing_req::do_print();
84 Melodic_req::Melodic_req()
92 Melodic_req::transpose (Melodic_req const & delta)
94 int old_pitch = pitch();
95 int delta_pitch = delta.pitch();
96 octave_i_ += delta.octave_i_;
97 notename_i_ += delta.notename_i_;
98 while (notename_i_ >= 7)
104 int new_pitch = pitch();
105 int delta_acc = new_pitch - old_pitch - delta_pitch;
107 accidental_i_ -= delta_acc;
108 if (abs (accidental_i_) > 2)
110 delta.warning ("transposition makes accidental larger than 2");
114 IMPLEMENT_IS_TYPE_B1(Melodic_req,Musical_req);
117 Melodic_req::do_equal_b (Request*r)const
119 Melodic_req* m= r->musical()->melodic ();
120 return !compare (*m, *this);
124 Melodic_req::compare (Melodic_req const &m1 , Melodic_req const&m2)
126 int o= m1.octave_i_ - m2.octave_i_;
127 int n = m1.notename_i_ - m2.notename_i_;
128 int a = m1.accidental_i_ - m2.accidental_i_;
140 Melodic_req::do_print() const
143 DOUT << "notename: " << notename_i_
144 << " acc: " <<accidental_i_<<" oct: "<< octave_i_;
149 Melodic_req::height() const
151 return notename_i_ + octave_i_*7;
155 should be settable from input to allow "viola"-mode
157 static Byte pitch_byte_a[ ] = { 0, 2, 4, 5, 7, 9, 11 };
160 Melodic_req::pitch() const
162 return pitch_byte_a[ notename_i_ % 7 ] + accidental_i_ + octave_i_ * 12;
165 /* *************** */
167 Rhythmic_req::compare (Rhythmic_req const &r1, Rhythmic_req const &r2)
169 return (r1.duration() - r2.duration ());
173 Rhythmic_req::do_equal_b (Request*r)const
175 Rhythmic_req* rh = r->musical()->rhythmic ();
177 return !compare (*this, *rh);
181 Rhythmic_req::set_duration (Duration d)
186 Rhythmic_req::Rhythmic_req()
191 IMPLEMENT_IS_TYPE_B1(Rhythmic_req,Musical_req);
194 Rhythmic_req::do_print() const
197 DOUT << "duration { " <<duration_.str() << "}";
203 Rhythmic_req::duration() const {
204 return duration_.length();
206 /* *************** */
208 Lyric_req::Lyric_req (Text_def* def_p)
211 def_p->align_i_ = 0; // centre
212 dir_i_ = -1; // lyrics below (invisible) staff
216 IMPLEMENT_IS_TYPE_B2(Lyric_req,Musical_req,Rhythmic_req);
219 Lyric_req::do_print() const
221 Rhythmic_req::do_print();
222 Text_req::do_print();
225 /* *************** */
227 Note_req::do_equal_b (Request*r)const
229 return Rhythmic_req::do_equal_b (r) && Melodic_req::do_equal_b (r);
238 IMPLEMENT_IS_TYPE_B2(Note_req,Melodic_req,Rhythmic_req);
241 Note_req::do_print() const
244 Melodic_req::do_print();
247 DOUT << " force accidental\n";
249 Rhythmic_req::do_print();
252 /* *************** */
254 IMPLEMENT_IS_TYPE_B1(Rest_req,Rhythmic_req);
257 Rest_req::do_print() const
259 Rhythmic_req::do_print();
262 /* *************** */
268 IMPLEMENT_IS_TYPE_B1(Beam_req,Span_req);
270 Beam_req::do_print()const{}
271 /* *************** */
273 IMPLEMENT_IS_TYPE_B1(Slur_req,Span_req);
275 Slur_req::do_print()const{}
276 /* *************** */
280 Span_req:: do_equal_b (Request*r)const
282 Span_req * s = r->span();
283 return spantype - s->spantype;
291 /* *************** */
292 Script_req::Script_req (Script_req const&s)
295 scriptdef_p_ = s.scriptdef_p_ ? s.scriptdef_p_->clone() : 0;
301 (d1.dir_i_ == d2.dir_i_)
304 Script_req::do_equal_b (Request*r)const
306 Script_req * s = r->script();
308 return scriptdef_p_->equal_b (*s->scriptdef_p_);
311 Script_req::Script_req()
318 IMPLEMENT_IS_TYPE_B1(Script_req,Request);
321 Script_req::do_print() const
324 DOUT << " dir " << dir_i_ ;
325 scriptdef_p_->print();
330 Musical_script_req::do_print() const
332 Script_req::do_print();
336 IMPLEMENT_IS_TYPE_B2(Musical_script_req,Musical_req, Script_req);
339 Script_req::~Script_req()
343 /* *************** */
346 Text_req::~Text_req()
352 Text_req::Text_req (Text_req const& src)
354 tdef_p_ = new Text_def (*src.tdef_p_);
358 Text_req::Text_req (int dir_i, Text_def* tdef_p)
365 IMPLEMENT_IS_TYPE_B1(Text_req,Musical_req);
368 Text_req::do_print() const
371 DOUT << " dir " << dir_i_ ;
376 /* *************** */
379 IMPLEMENT_IS_TYPE_B1(Skip_req,Musical_req);
382 Skip_req::do_print() const
386 DOUT << "duration: " << duration();
392 IMPLEMENT_IS_TYPE_B1(Dynamic_req,Musical_req);
395 Dynamic_req::do_print() const
397 Musical_req::do_print();
401 IMPLEMENT_IS_TYPE_B1(Absolute_dynamic_req,Musical_req);
404 Absolute_dynamic_req::do_print() const
407 Dynamic_req::do_print();
408 DOUT << " loudness " <<loudness_str (loudness_);
413 Dynamic_req::loudness_str (Loudness l)
417 case FFF: return "fff";
418 case FF: return "ff";
420 case MF: return "mf";
421 case MP: return "mp";
423 case PP: return "pp";
424 case PPP: return "ppp";
430 Absolute_dynamic_req::Absolute_dynamic_req()
436 Span_dynamic_req::Span_dynamic_req()
442 IMPLEMENT_IS_TYPE_B1(Span_dynamic_req,Musical_req);
445 Span_dynamic_req::do_print()const
448 Span_req::do_print();
449 DOUT << "louder/louder: " <<dynamic_dir_i_;
454 IMPLEMENT_IS_TYPE_B1(Tie_req,Musical_req);