From: fred Date: Sun, 24 Mar 2002 20:13:11 +0000 (+0000) Subject: lilypond-1.0.1 X-Git-Tag: release/1.5.59~3015 X-Git-Url: https://git.donarmstrong.com/?a=commitdiff_plain;h=415ccc5061afd28487535ef1820a9a1f3d2edb7d;p=lilypond.git lilypond-1.0.1 --- diff --git a/lily/key-engraver.cc b/lily/key-engraver.cc new file mode 100644 index 0000000000..7772f0e718 --- /dev/null +++ b/lily/key-engraver.cc @@ -0,0 +1,187 @@ +/* + key-reg.cc -- implement Key_engraver + + source file of the GNU LilyPond music typesetter + + (c) 1997--1998 Han-Wen Nienhuys + + */ +#include "key-engraver.hh" +#include "key-item.hh" +#include "command-request.hh" +#include "local-key-engraver.hh" +#include "musical-request.hh" +#include "local-key-item.hh" +#include "bar.hh" +#include "time-description.hh" + +Key_engraver::Key_engraver () +{ + kit_p_ = 0; + do_post_move_processing (); +} + +void +Key_engraver::create_key () +{ + if (!kit_p_) + { + kit_p_ = new Key_item; + kit_p_->break_priority_i_ = -1; // ugh + announce_element (Score_element_info (kit_p_,keyreq_l_)); + kit_p_->read (*this); + } +} + +bool +Key_engraver::do_try_request (Request * req_l) +{ + Command_req* creq_l= req_l->access_Command_req (); + if (!creq_l|| !creq_l->access_Key_change_req ()) + return false; + + if (keyreq_l_) + return false; // TODO + keyreq_l_ = creq_l->access_Key_change_req (); + read_req (keyreq_l_); + return true; +} + +void +Key_engraver::acknowledge_element (Score_element_info info) +{ + Command_req * r_l = info.req_l_->access_Command_req () ; + if (r_l && r_l->access_Clef_change_req ()) + { + create_key (); + } + else if (info.elem_l_->is_type_b (Bar::static_name ()) + && accidental_idx_arr_.size ()) + { + if (!keyreq_l_) + default_key_b_ = true; + create_key (); + } + +} + +void +Key_engraver::do_process_requests () +{ + if (keyreq_l_) + { + create_key (); + } +} + +void +Key_engraver::do_pre_move_processing () +{ + if (kit_p_) + { + kit_p_->default_b_ = default_key_b_; + typeset_element (kit_p_); + kit_p_ = 0; + } +} + + +/* + TODO Slightly hairy. + */ +void +Key_engraver::read_req (Key_change_req const * r) +{ + old_accidental_idx_arr_ = accidental_idx_arr_; + key_.clear (); + Scalar prop = get_property ("specialaccidentals"); + if (prop.length_i () > 0) + { + key_.multi_octave_b_ = prop.to_bool (); + } + + accidental_idx_arr_.clear (); + + if (r->ordinary_key_b_) + { + int p; + if (r->pitch_arr_.size () < 1) + { + r->warning (_ ("No key name: assuming `C'")); + p = 0; + } + else + { + p = r->pitch_arr_[0].semitone_pitch (); + if (r->minor_b ()) + p += 3; + } + /* 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 * r->pitch_arr_[0].accidental_i_ < 0) + no_of_acc += 12 * sign (r->pitch_arr_[0].accidental_i_); + + 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; + if (key_.multi_octave_b_) + key_.set (m); + else + key_.set (m.notename_i_, m.accidental_i_); + accidental_idx_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; + if (key_.multi_octave_b_) + key_.set (m); + else + key_.set (m.notename_i_, m.accidental_i_); + accidental_idx_arr_.push (m); + + accidental = (accidental + 4) % 7 ; + } + } + } + else // Special key + { + for (int i = 0; i < r->pitch_arr_.size (); i ++) + { + Musical_pitch m_l =r->pitch_arr_[i]; + if (key_.multi_octave_b_) + key_.set (m_l); + else + key_.set (m_l.notename_i_, m_l.accidental_i_); + + accidental_idx_arr_.push (m_l); + } + } +} + +void +Key_engraver::do_post_move_processing () +{ + keyreq_l_ = 0; + default_key_b_ = false; +} + + +IMPLEMENT_IS_TYPE_B1 (Key_engraver,Engraver); +ADD_THIS_TRANSLATOR (Key_engraver); + diff --git a/lily/key-item.cc b/lily/key-item.cc index 93abfa0575..94645d20c2 100644 --- a/lily/key-item.cc +++ b/lily/key-item.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1996, 1997--1998 Han-Wen Nienhuys + (c) 1996, 1997--1998 Han-Wen Nienhuys keyplacement by Mats Bengtsson */ @@ -15,38 +15,50 @@ #include "paper-def.hh" #include "lookup.hh" -#include "key-grav.hh" +#include "key-engraver.hh" const int FLAT_TOP_PITCH=2; /* fes,ges,as and bes typeset in lower octave */ const int SHARP_TOP_PITCH=4; /* ais and bis typeset in lower octave */ -Key_item::Key_item (int c) +Key_item::Key_item () { breakable_b_ =true; default_b_ = false; - set_c_position (c); + set_c_position (0); } void Key_item::read (Key_engraver const & key_grav_r) { - assert (!key_grav_r.key_.multi_octave_b_); - const Array &idx_arr =key_grav_r.accidental_idx_arr_; + multi_octave_b_ = key_grav_r.key_.multi_octave_b_; + const Array &idx_arr = key_grav_r.accidental_idx_arr_; for (int i = 0 ; i< idx_arr.size(); i++) { - int note = idx_arr[i]; - int acc = ((Key &) key_grav_r.key_).oct (0).acc (note); - - add (note, acc); + Musical_pitch m_l =idx_arr[i]; + if (multi_octave_b_) + add (m_l); + else + add (m_l.notename_i_, m_l.accidental_i_); + } + const Array &old_idx_arr = key_grav_r.old_accidental_idx_arr_; + for (int i = 0 ; i< old_idx_arr.size(); i++) + { + Musical_pitch m_l =old_idx_arr[i]; + if (multi_octave_b_) + add_old (m_l); + else + add_old (m_l.notename_i_, m_l.accidental_i_); } } void Key_item::set_c_position (int c0) { - int from_bottom_pos = c0 + 4; // ugh - int octaves =(from_bottom_pos / 7) +1 ; - from_bottom_pos =(from_bottom_pos + 7*octaves)%7; + c0_position = c0; + // Find the c in the range -4 through 2 + int from_bottom_pos = c0 + 4; + from_bottom_pos = from_bottom_pos%7; + from_bottom_pos = (from_bottom_pos + 7)%7; // Precaution to get positive. c_position = from_bottom_pos - 4; } @@ -54,36 +66,101 @@ Key_item::set_c_position (int c0) void Key_item::add (int p, int a) { - if ((a<0 && ((p>FLAT_TOP_PITCH) || (p+c_position>4)) && (p+c_position>1)) - || - (a>0 && ((p>SHARP_TOP_PITCH) || (p+c_position>5)) && (p+c_position>2))) - { - p -= 7; /* Typeset below c_position */ - } pitch.push (p); acc.push (a); } +void +Key_item::add (const Musical_pitch& pitch_r) +{ + pitch.push (pitch_r.steps()); + acc.push (pitch_r.accidental_i_); +} + +void +Key_item::add_old (int p, int a) +{ + old_pitch.push (p); + old_acc.push (a); +} +void +Key_item::add_old (const Musical_pitch& pitch_r) +{ + old_pitch.push (pitch_r.steps()); + old_acc.push (pitch_r.accidental_i_); +} + +int +Key_item::calculate_position(int p, int a) const +{ + if (multi_octave_b_) + { + return p + c0_position; + } + else { + if ((a<0 && ((p>FLAT_TOP_PITCH) || (p+c_position>4)) && (p+c_position>1)) + || + (a>0 && ((p>SHARP_TOP_PITCH) || (p+c_position>5)) && (p+c_position>2))) + { + p -= 7; /* Typeset below c_position */ + } + return p + c_position; + } +} + +/* + TODO space the `natural' signs wider + */ Molecule* Key_item::brew_molecule_p() const { Molecule*output = new Molecule; Real inter = paper()->internote_f (); + int j; + if ((break_status_dir_ == LEFT || break_status_dir_ == CENTER) + || old_pitch.size ()) + { + for (int i =0; i < old_pitch.size(); i++) + { + for (j =0; (j < pitch.size()) && (old_pitch[i] != pitch[j]); j++) + ; + + if (j == pitch.size() + || (old_pitch[i] == pitch[j] && old_acc[i] != acc[j])) + { + Atom a =lookup_l ()->accidental (0); + a.translate_axis (calculate_position(old_pitch[i], old_acc[i]) * inter, Y_AXIS); + Molecule m (a); + output->add_at_edge (X_AXIS, RIGHT, m); + } + } + + /* + Add half a space between cancellation and key sig. + + As suggested by [Ross], p.148. + */ + Interval x(0, inter); + Interval y(0,0); + + output->add_at_edge (X_AXIS, RIGHT, lookup_l()->fill (Box(x,y))); + } + for (int i =0; i < pitch.size(); i++) { - Atom a =paper()->lookup_l ()->accidental (acc[i]); - a.translate_axis ((c_position + pitch[i]) * inter, Y_AXIS); + Atom a =lookup_l ()->accidental (acc[i]); + a.translate_axis (calculate_position(pitch[i], acc[i]) * inter, Y_AXIS); Molecule m (a); output->add_at_edge (X_AXIS, RIGHT, m); } if (pitch.size()) { - Molecule m (paper()->lookup_l ()->fill (Box ( - Interval (0, paper()->note_width ()), - Interval (0,0)))); - + Molecule m (lookup_l ()->fill (Box ( + Interval (0, paper()->note_width ()), + Interval (0,0)))); + output->add_at_edge (X_AXIS, RIGHT, m); } return output; @@ -96,7 +173,7 @@ Key_item::do_pre_processing() { if (default_b_) { - transparent_b_ = (break_status_i() != 1); + transparent_b_ = (break_status_dir() != RIGHT); set_empty (transparent_b_); } }