X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fmusical-request.cc;h=3ee6004add9f0e2d330c6cf08213de3d38037da7;hb=7fa94555679e3197028b1ab3fea02c374cd855da;hp=396870dd36a8effed905a614fa9ad7be9b150cfa;hpb=6ce61146edb1c36647b514778c29cdc9beedab6a;p=lilypond.git diff --git a/lily/musical-request.cc b/lily/musical-request.cc index 396870dd36..3ee6004add 100644 --- a/lily/musical-request.cc +++ b/lily/musical-request.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1997 Han-Wen Nienhuys + (c) 1997--1998 Han-Wen Nienhuys */ #include "musical-request.hh" @@ -13,381 +13,402 @@ #include "text-def.hh" #include "music-list.hh" -IMPLEMENT_STATIC_NAME(Stem_req); -IMPLEMENT_IS_TYPE_B1(Stem_req,Rhythmic_req); + +IMPLEMENT_IS_TYPE_B1 (Musical_req,Request); void -Stem_req::do_print() const -{ -#ifndef NPRINT - Rhythmic_req::do_print(); - mtor << "dir : " << dir_i_; -#endif -} +Musical_req::do_print () const{} +void +Tie_req::do_print () const{} + + -Stem_req::Stem_req() +IMPLEMENT_IS_TYPE_B1(Span_req,Request); + +IMPLEMENT_IS_TYPE_B2(Musical_span_req, Span_req, Musical_span_req); + +void +Musical_span_req::do_print () const { - dir_i_ = 0; + Span_req::do_print (); } + -/* ************** */ -IMPLEMENT_STATIC_NAME(Musical_req); -IMPLEMENT_IS_TYPE_B1(Musical_req,Request); -void -Musical_req::do_print()const{} void -Tie_req::do_print()const{} - - -/* *************** */ - +Span_req::do_print () const +{ +#ifndef NPRINT + DOUT << spantype; +#endif +} +IMPLEMENT_IS_TYPE_B1 (Spacing_req,Request); -IMPLEMENT_STATIC_NAME(Span_req); -IMPLEMENT_IS_TYPE_B1(Span_req,Musical_req); +Spacing_req::Spacing_req () +{ + next = 0; + distance = 0; + strength = 0; +} void -Span_req::do_print() const +Spacing_req::do_print () const { #ifndef NPRINT - mtor << spantype ; + DOUT << "next " << next << "dist " << distance << "strength\n"; #endif } -Spacing_req::Spacing_req() +IMPLEMENT_IS_TYPE_B1 (Abbreviation_req, Musical_req); + +Abbreviation_req::Abbreviation_req () { - next = 0; - distance = 0; - strength = 0; + type_i_ = 0; } -IMPLEMENT_STATIC_NAME(Spacing_req); -IMPLEMENT_IS_TYPE_B1(Spacing_req,Request); void -Spacing_req::do_print()const +Abbreviation_req::do_print () const { #ifndef NPRINT - mtor << "next " << next << "dist " << distance << "strength\n"; + DOUT << "type " << type_i_ << '\n'; #endif } -IMPLEMENT_STATIC_NAME(Blank_req); -IMPLEMENT_IS_TYPE_B2(Blank_req,Spacing_req,Rhythmic_req); + +IMPLEMENT_IS_TYPE_B2 (Blank_req,Spacing_req,Rhythmic_req); void -Blank_req::do_print()const +Blank_req::do_print () const { - Spacing_req::do_print(); + Spacing_req::do_print (); } -/* *************** */ -Melodic_req::Melodic_req() + +Melodic_req::Melodic_req () { - notename_i_ = 0; - octave_i_ = 0; - accidental_i_ = 0; } void -Melodic_req::transpose(Melodic_req const & delta) -{ - int old_pitch = pitch(); - int delta_pitch = delta.pitch(); - octave_i_ += delta.octave_i_; - notename_i_ += delta.notename_i_; - while (notename_i_ >= 7 ) { - notename_i_ -= 7; - octave_i_ ++; - } - int new_pitch = pitch(); - int delta_acc = new_pitch - old_pitch - delta_pitch; - - accidental_i_ -= delta_acc; - if (abs(accidental_i_) > 2) { - delta.warning("transposition makes accidental larger than 2"); +Melodic_req::transpose (Musical_pitch delta) +{ + pitch_.transpose (delta); + + if (abs (pitch_.accidental_i_) > 2) + { + warning (_f ("transposition by %s makes accidental larger than two", + delta.str ())); } } -IMPLEMENT_STATIC_NAME(Melodic_req); -IMPLEMENT_IS_TYPE_B1(Melodic_req,Musical_req); +IMPLEMENT_IS_TYPE_B1 (Melodic_req,Musical_req); + +bool +Melodic_req::do_equal_b (Request*r) const +{ + Melodic_req* m= r->access_Musical_req ()->access_Melodic_req (); + return !compare (*m, *this); +} int -Melodic_req::compare(Melodic_req const&m1, Melodic_req const&m2) +Melodic_req::compare (Melodic_req const &m1 , Melodic_req const&m2) { - if (m1.octave_i_ != m2.octave_i_) - return m1.octave_i_ -m2.octave_i_; - else if (m1.notename_i_ != m2.notename_i_) - return m1.notename_i_ - m2.notename_i_; - else if (m1.accidental_i_ != m2.accidental_i_) - return m1.accidental_i_ - m2.accidental_i_; - return 0; + return Musical_pitch::compare (m1.pitch_, m2.pitch_); } void -Melodic_req::do_print() const +Melodic_req::do_print () const { -#ifndef NPRINT - mtor << "notename: " << notename_i_ << " acc: " <access_Musical_req ()->access_Rhythmic_req (); -int -Melodic_req::pitch() const + return !compare (*this, *rh); +} + + +Rhythmic_req::Rhythmic_req () { - return pitch_byte_a[ notename_i_ % 7 ] + accidental_i_ + octave_i_ * 12; } -/* *************** */ -int -Rhythmic_req::compare(Rhythmic_req const &r1, Rhythmic_req const &r2) + +IMPLEMENT_IS_TYPE_B1 (Rhythmic_req,Musical_req); + +void +Rhythmic_req::do_print () const +{ +#ifndef NPRINT + DOUT << "duration { " <align_i_ = 0; // centre - dir_i_ = -1; // lyrics below (invisible) staff + Rhythmic_req::do_print (); } -IMPLEMENT_STATIC_NAME(Lyric_req); -IMPLEMENT_IS_TYPE_B2(Lyric_req,Musical_req,Rhythmic_req); + + +IMPLEMENT_IS_TYPE_B1 (Beam_req,Span_req); + +Beam_req::Beam_req () +{ +} void -Lyric_req::do_print() const -{ - Rhythmic_req::do_print(); - Text_req::do_print(); +Beam_req::do_print () const +{ } -/* *************** */ -Note_req::Note_req() + +IMPLEMENT_IS_TYPE_B1 (Abbreviation_beam_req, Span_req); + +Abbreviation_beam_req::Abbreviation_beam_req () { - forceacc_b_ = false; + type_i_ = 0; } -IMPLEMENT_STATIC_NAME(Note_req); -IMPLEMENT_IS_TYPE_B2(Note_req,Melodic_req,Rhythmic_req); void -Note_req::do_print() const +Abbreviation_beam_req::do_print () const { -#ifndef NPRINT - Melodic_req::do_print(); - if (forceacc_b_) { - mtor << " force accidental\n"; - } - Rhythmic_req::do_print(); -#endif } -/* *************** */ -IMPLEMENT_STATIC_NAME(Rest_req); -IMPLEMENT_IS_TYPE_B1(Rest_req,Rhythmic_req); +IMPLEMENT_IS_TYPE_B1 (Slur_req,Span_req); void -Rest_req::do_print() const +Slur_req::do_print () const { - Rhythmic_req::do_print(); } -/* *************** */ -Beam_req::Beam_req() +IMPLEMENT_IS_TYPE_B1 (Plet_req,Span_req); + +Plet_req::Plet_req () { - nplet = 0; + plet_i_ = 0; } -IMPLEMENT_STATIC_NAME(Beam_req); -IMPLEMENT_IS_TYPE_B1(Beam_req,Span_req); -void -Beam_req::do_print()const{} -/* *************** */ -IMPLEMENT_STATIC_NAME(Slur_req); -IMPLEMENT_IS_TYPE_B1(Slur_req,Span_req); + void -Slur_req::do_print()const{} -/* *************** */ -int -Span_req:: compare(Span_req const &r1, Span_req const &r2) +Plet_req::do_print () const { - return r1.spantype - r2.spantype; } -Span_req::Span_req() + +bool +Span_req:: do_equal_b (Request*r) const { - spantype = NOSPAN; + Span_req * s = r->access_Span_req (); + return spantype == s->spantype; } -/* *************** */ -Script_req::Script_req(Script_req const&s) +Span_req::Span_req () { - dir_i_ = s.dir_i_; - scriptdef_p_ = s.scriptdef_p_ ? s.scriptdef_p_->clone() : 0; + spantype = NOSPAN; } -int -Script_req::compare(Script_req const &d1, Script_req const &d2) +Script_req::Script_req (Script_req const&s) { - return !(d1.dir_i_ == d2.dir_i_ && - d1.scriptdef_p_->equal_b(*d2.scriptdef_p_)); + dir_ = s.dir_; + scriptdef_p_ = s.scriptdef_p_ ? s.scriptdef_p_->clone () : 0; +} + +/* + don't check dirs? + + (d1.dir_ == d2.dir_) + */ +bool +Script_req::do_equal_b (Request*r) const +{ + Script_req * s = r->access_Script_req (); + + return scriptdef_p_->equal_b (*s->scriptdef_p_); } -Script_req::Script_req() +Script_req::Script_req () { - dir_i_ = 0; - scriptdef_p_ = 0; + dir_ = CENTER; + scriptdef_p_ = 0; } -IMPLEMENT_STATIC_NAME(Script_req); -IMPLEMENT_IS_TYPE_B1(Script_req,Request); + +IMPLEMENT_IS_TYPE_B1 (Script_req,Request); void -Script_req::do_print() const +Script_req::do_print () const { #ifndef NPRINT - mtor << " dir " << dir_i_ ; - scriptdef_p_->print(); + DOUT << " dir " << dir_; + scriptdef_p_->print (); #endif } void -Musical_script_req::do_print() const +Musical_script_req::do_print () const { - Script_req::do_print(); + Script_req::do_print (); } -IMPLEMENT_STATIC_NAME(Musical_script_req); -IMPLEMENT_IS_TYPE_B2(Musical_script_req,Musical_req, Script_req); +IMPLEMENT_IS_TYPE_B2 (Musical_script_req,Musical_req, Script_req); -Script_req::~Script_req() -{ - delete scriptdef_p_; -} -/* *************** */ -int -Text_req:: compare(Text_req const &r1, Text_req const &r2) + +Script_req::~Script_req () { - bool b1 = (r1.dir_i_ == r2.dir_i_); - bool b2 = (r1.tdef_p_ ->equal_b(*r2.tdef_p_)); - return b1 && b2; + delete scriptdef_p_; } -Text_req::~Text_req() + + +Text_req::~Text_req () { - delete tdef_p_; - tdef_p_ = 0; + delete tdef_p_; + tdef_p_ = 0; } -Text_req::Text_req(Text_req const& src) +Text_req::Text_req (Text_req const& src) { - tdef_p_ = new Text_def(*src.tdef_p_); - dir_i_ = src.dir_i_; + tdef_p_ = new Text_def (*src.tdef_p_); + dir_ = src.dir_; } -Text_req::Text_req(int dir_i, Text_def* tdef_p) +Text_req::Text_req (int dir_i, Text_def* tdef_p) { - dir_i_ = dir_i; - tdef_p_ = tdef_p; + dir_ = Direction (dir_i); + tdef_p_ = tdef_p; } -IMPLEMENT_STATIC_NAME(Text_req); -IMPLEMENT_IS_TYPE_B1(Text_req,Musical_req); + +IMPLEMENT_IS_TYPE_B1 (Text_req,Musical_req); void -Text_req::do_print() const +Text_req::do_print () const { #ifndef NPRINT - - mtor << " dir " << dir_i_ ; - tdef_p_->print(); + DOUT << " dir " << dir_; + tdef_p_->print (); #endif } -/* *************** */ -IMPLEMENT_STATIC_NAME(Skip_req); -IMPLEMENT_IS_TYPE_B1(Skip_req,Musical_req); + +IMPLEMENT_IS_TYPE_B1 (Skip_req,Musical_req); void -Skip_req::do_print() const +Skip_req::do_print () const { #ifndef NPRINT - mtor << "duration: " << duration(); + DOUT << "duration: " << duration (); #endif } -Voice * -Request::voice_l() -{ - if (!parent_music_l_) - return 0; - else - return (Voice*)parent_music_l_; -} -/* *************** */ -IMPLEMENT_STATIC_NAME(Dynamic_req); -IMPLEMENT_IS_TYPE_B1(Dynamic_req,Musical_req); + +IMPLEMENT_IS_TYPE_B1 (Dynamic_req,Musical_req); void -Dynamic_req::do_print() const +Dynamic_req::do_print () const { - Musical_req::do_print(); + Musical_req::do_print (); } -IMPLEMENT_STATIC_NAME(Absolute_dynamic_req); -IMPLEMENT_IS_TYPE_B1(Absolute_dynamic_req,Musical_req); + +IMPLEMENT_IS_TYPE_B1 (Absolute_dynamic_req,Musical_req); void -Absolute_dynamic_req::do_print() const +Absolute_dynamic_req::do_print () const { #ifndef NPRINT - Dynamic_req::do_print(); - mtor << " loudness " <access_Musical_req ()->access_Dynamic_req ()->access_Absolute_dynamic_req (); + return loudness_ == a->loudness_; +} + String -Dynamic_req::loudness_str(Loudness l) +Dynamic_req::loudness_static_str (Loudness l) { - switch (l) { + switch (l) + { case FFF: return "fff"; case FF: return "ff"; case F: return "f"; @@ -396,35 +417,59 @@ Dynamic_req::loudness_str(Loudness l) case P: return "p"; case PP: return "pp"; case PPP: return "ppp"; + case FP: return "fp"; + case SF: return "sf"; + case SFZ: return "sfz"; + } + return ""; +} + +String +Absolute_dynamic_req::loudness_str () const +{ + String str = loudness_static_str (loudness_); + if (str.empty_b ()) + { + String s = "mf"; + warning (_f ("never heard of dynamic scale `\%s\', assuming %s", + str, s)); + str = s; } - assert(false); - return ""; + return str; } -Absolute_dynamic_req::Absolute_dynamic_req() + +Absolute_dynamic_req::Absolute_dynamic_req () { - loudness_ = MF; + loudness_ = MF; } -Span_dynamic_req::Span_dynamic_req() + +bool +Span_dynamic_req::do_equal_b (Request *req) const { - dynamic_dir_i_ = 0; + Span_dynamic_req * s = req->access_Musical_req ()->access_Span_dynamic_req (); + + return Span_req::do_equal_b (req) && s->dynamic_dir_ == dynamic_dir_; } -IMPLEMENT_STATIC_NAME(Span_dynamic_req); -IMPLEMENT_IS_TYPE_B1(Span_dynamic_req,Musical_req); +Span_dynamic_req::Span_dynamic_req () +{ + dynamic_dir_ = CENTER; +} + + +IMPLEMENT_IS_TYPE_B1 (Span_dynamic_req,Musical_req); void -Span_dynamic_req::do_print()const +Span_dynamic_req::do_print () const { #ifndef NPRINT - Span_req::do_print(); - mtor << "louder/louder: " <