X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fcommand-request.cc;h=6cbd2bc92fc13983d4f5bbd8658d361c25698e5c;hb=670a98f23a2561c6a4a4a19bb72c776189715541;hp=55ccf54c27f25d015a292e71c372e205af8f31a5;hpb=79511c44a27908a1beaed25bbcac8d95a8a6b7c8;p=lilypond.git diff --git a/lily/command-request.cc b/lily/command-request.cc index 55ccf54c27..6cbd2bc92f 100644 --- a/lily/command-request.cc +++ b/lily/command-request.cc @@ -1,243 +1,323 @@ /* - commandrequest.cc -- implement Nonmusical reqs + command-request.cc -- implement non-musical reqs - source file of the LilyPond music typesetter + source file of the GNU LilyPond music typesetter - (c) 1997 Han-Wen Nienhuys + (c) 1997--1999 Han-Wen Nienhuys */ #include "command-request.hh" #include "debug.hh" #include "musical-request.hh" - -IMPLEMENT_STATIC_NAME(Cadenza_req); - void -Cadenza_req::do_print()const +Cadenza_req::do_print() const { - mtor << on_b_; +#ifndef NPRINT + DOUT << on_b_; +#endif } -Cadenza_req::Cadenza_req(bool b) +bool +Cadenza_req::do_equal_b (Request*r) const { - on_b_ =b; + Cadenza_req*cad = dynamic_cast (r); + return cad && cad->on_b_ == on_b_; } -/* *************** */ - -int -Bar_req::compare(Bar_req const &c1)const +Cadenza_req::Cadenza_req (bool b) { - return type_str_ == c1.type_str_; + on_b_ =b; } -IMPLEMENT_STATIC_NAME(Bar_req); + + +bool +Bar_req::do_equal_b (Request*r) const +{ + Bar_req * b = dynamic_cast (r); + return b && type_str_ == b->type_str_; +} void Bar_req::do_print() const { - mtor << type_str_; +#ifndef NPRINT + DOUT << type_str_; +#endif } -Bar_req::Bar_req(String s) +Bar_req::Bar_req (String s) { - type_str_ = s; + type_str_ = s; } -Partial_measure_req::Partial_measure_req(Moment m) +Partial_measure_req::Partial_measure_req (Moment m) { - duration_ =m; + length_mom_ =m; } -/* *************** */ - -IMPLEMENT_STATIC_NAME(Timing_req); - -void -Timing_req::do_print()const{} - -IMPLEMENT_STATIC_NAME(Command_req); -void -Command_req::do_print()const{} -/* *************** */ -IMPLEMENT_STATIC_NAME(Barcheck_req); +bool +Partial_measure_req::do_equal_b (Request* r) const +{ + Partial_measure_req *p = dynamic_cast (r); -void -Barcheck_req::do_print() const{} + return p&& p->length_mom_ == length_mom_; +} -/* *************** */ -IMPLEMENT_STATIC_NAME(Clef_change_req); +bool +Barcheck_req::do_equal_b (Request*r) const +{ + Barcheck_req *b = dynamic_cast (r); + return b; +} void Clef_change_req::do_print() const { #ifndef NPRINT - mtor << clef_str_ ; + DOUT << clef_str_ ; #endif } -Clef_change_req::Clef_change_req(String s) +Clef_change_req::Clef_change_req (String s) { - clef_str_ = s; + clef_str_ = s; } -/* *************** */ -IMPLEMENT_STATIC_NAME(Group_feature_req); void -Group_feature_req::do_print() const -{ -#ifndef NPRINT - mtor << "stemdir " << stemdir_i_; -#endif -} - -Group_feature_req::Group_feature_req() +Partial_measure_req::do_print() const { - stemdir_i_ = 0; + DOUT << length_mom_; } -IMPLEMENT_STATIC_NAME(Group_change_req); - void -Group_change_req::do_print()const +Time_signature_change_req::do_print() const { #ifndef NPRINT - mtor << "id : " << newgroup_str_; + DOUT << beats_i_ << "/" << one_beat_i_; #endif } -/* *************** */ -IMPLEMENT_STATIC_NAME(Terminate_voice_req); -void -Terminate_voice_req::do_print()const +bool +Time_signature_change_req::do_equal_b (Request * r) const { -} + Time_signature_change_req * m + = dynamic_cast (r); -/* *************** */ -IMPLEMENT_STATIC_NAME(Partial_measure_req); + return m && m->beats_i_ == beats_i_ + && one_beat_i_ == m->one_beat_i_; +} -void -Partial_measure_req::do_print() const +Time_signature_change_req::Time_signature_change_req() { - mtor << duration_; + beats_i_ = 0; + one_beat_i_ =0; } -IMPLEMENT_STATIC_NAME(Meter_change_req); -void -Meter_change_req::do_print() const +Tempo_req::Tempo_req() { - mtor << beats_i_ << "/" << one_beat_i_; + metronome_i_ = 60; + dur_. durlog_i_ = 2; } -int -Meter_change_req::compare(Meter_change_req const &m) +void +Tempo_req::do_print() const { - return m.beats_i_ == beats_i_ && one_beat_i_ == m.one_beat_i_; + DOUT << dur_.str() << " = " << metronome_i_; } -Meter_change_req::Meter_change_req() + +bool +Tempo_req::do_equal_b (Request *r) const { - beats_i_ = 0; - one_beat_i_ =0; + Tempo_req *t = dynamic_cast (r); + + return t&& t->dur_.length_mom ()== dur_.length_mom () && metronome_i_ == t->metronome_i_; } void -Meter_change_req::set(int b,int o) +Measure_grouping_req::do_print() const { - beats_i_=b; - one_beat_i_=o; + for (int i=0; i < elt_length_arr_.size(); i++) + { + DOUT << beat_i_arr_[i] << "*" << elt_length_arr_[i].str () << " "; + } } -/* *************** */ - -IMPLEMENT_STATIC_NAME(Measure_grouping_req); -void -Measure_grouping_req::do_print() const +bool +Measure_grouping_req::do_equal_b (Request*) const { - for (int i=0; i < elt_length_arr_.size(); i++) { - mtor << beat_i_arr_[i] <<"*" << elt_length_arr_[i]<<" "; - } + return false; // todo } -/* *************** */ void -Key_change_req::transpose(Melodic_req const & d)const +Key_change_req::transpose (Musical_pitch d) { - WARN << "don't know how to transpose a key. \n"; - for (int i=0; i < melodic_p_arr_.size(); i++) { - melodic_p_arr_[i]->transpose(d); + if (ordinary_key_b_ ) + { + if (pitch_arr_.size () > 0) + pitch_arr_[0].transpose(d); + else + { + warning(_ ("don't know how handle empty keys")); // TODO + } + } + else + { + Array old_pitch_arr_; + for (int i = 0; i < pitch_arr_.size(); i++) + { + old_pitch_arr_.push(pitch_arr_[i]); + } + // set accidentals for \key d (as in Key_engraver::read_req) + // (later called "new accidentals") + int p = d.semitone_pitch (); + /* Solve the equation 7*no_of_acc mod 12 = p, -6 <= no_of_acc <= 5 */ + int no_of_acc = (7*p) % 12; + no_of_acc = (no_of_acc + 18) % 12 -6; + + /* Correct from flats to sharps or vice versa */ + if (no_of_acc * d.accidental_i_ < 0) + no_of_acc += 12 * sign (d.accidental_i_); + + pitch_arr_.clear (); + if (no_of_acc < 0) + { + int accidental = 6 ; // First accidental: bes + for ( ; no_of_acc < 0 ; no_of_acc++ ) + { + Musical_pitch m; + m.accidental_i_ = -1; + m.notename_i_ = accidental; + pitch_arr_.push(m); + + accidental = (accidental + 3) % 7 ; + } + } + else + { + int accidental = 3 ; // First accidental: fis + for ( ; no_of_acc > 0 ; no_of_acc-- ) + { + Musical_pitch m; + m.accidental_i_ = 1; + m.notename_i_ = accidental; + pitch_arr_.push(m); + + accidental = (accidental + 4) % 7 ; + } + } + // Check if transposed old accidentals and the new ones coincide + no_of_acc = pitch_arr_.size(); + int acc_found; + Musical_pitch mm; + for (int i=0; i < old_pitch_arr_.size(); i++) + { + acc_found = 0; + mm = old_pitch_arr_[i]; + mm.transpose(d); + for (int j=0; ((j < no_of_acc) && (acc_found == 0)); j++) + { + if (pitch_arr_[j].notename_i_ == mm.notename_i_) + { + if (mm.accidental_i_ == 0) + { + // remove new accidental + pitch_arr_.del(j); + no_of_acc--; + acc_found = 1; + } + else + { + // change new accidental + pitch_arr_[j].accidental_i_ = mm.accidental_i_; + acc_found = 1; + } + } + } + if (acc_found == 0) + { + // add transposed old accidental + pitch_arr_.push(mm); + } + } } } -IMPLEMENT_STATIC_NAME(Key_change_req); + void Key_change_req::squash_octaves() { - for (int i=0; i < melodic_p_arr_.size(); i++) { - melodic_p_arr_[i]->octave_i_ = 0; + for (int i=0; i < pitch_arr_.size(); i++) + { + pitch_arr_[i].octave_i_ = 0; } } void Key_change_req::do_print() const { - for (int i=0; i < melodic_p_arr_.size(); i++) { - melodic_p_arr_[i]->print(); +#ifndef NPRINT + for (int i=0; i < pitch_arr_.size(); i++) + { + pitch_arr_[i].print(); } +#endif } Key_change_req::Key_change_req() { - minor_b_ = false; - multi_octave_b_= false; + modality_i_ = 0; + ordinary_key_b_= false; } -Key_change_req::Key_change_req(Key_change_req const&c) + + +Break_req::Break_req () { - for (int i=0; i < c.melodic_p_arr_.size(); i++) - melodic_p_arr_.push( c.melodic_p_arr_[i]->clone()->melodic() ); - minor_b_ = c.minor_b_; - multi_octave_b_ = c.multi_octave_b_; + penalty_i_ = 0; } -Key_change_req::~Key_change_req() +Mark_req::Mark_req (String s) { - for (int i=0; i < melodic_p_arr_.size(); i++) - delete melodic_p_arr_[i]; + str_ = s; +} + +void +Mark_req::do_print () const +{ + DOUT << str_; } int Key_change_req::flats_i() { - int flats_i = 0; - for ( int i = 0; i < melodic_p_arr_.size(); i++ ) { - Melodic_req* mel_l = melodic_p_arr_[i]->melodic(); - assert( mel_l ); - if ( mel_l->accidental_i_ < 0 ) - flats_i -= mel_l->accidental_i_; - } - return flats_i; + int flats_i = 0; + for (int i = 0; i < pitch_arr_.size(); i++) + { + if (pitch_arr_[i].accidental_i_ < 0) + flats_i -= pitch_arr_[i].accidental_i_; + } + return flats_i; } -int -Key_change_req::minor_b() +bool +Key_change_req::minor_b() const { - return minor_b_; + return modality_i_ == 3; } int Key_change_req::sharps_i() { - int sharps_i = 0; - for ( int i = 0; i < melodic_p_arr_.size(); i++ ) { - Melodic_req* mel_l = melodic_p_arr_[i]->melodic(); - assert( mel_l ); - if ( mel_l->accidental_i_ > 0 ) - sharps_i+= mel_l->accidental_i_; - } - return sharps_i; + int sharps_i = 0; + for (int i = 0; i < pitch_arr_.size(); i++) + { + if (pitch_arr_[i].accidental_i_ > 0) + sharps_i += pitch_arr_[i].accidental_i_; + } + return sharps_i; } -