X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fkey-item.cc;h=e6b8df7b4493e1f14fea0f5f2df3e7c5d41775f3;hb=07dc00d6c83be5b05f5ec16f1ed36b1cf41b885c;hp=d80f01670dda03f6d76f5524e3708d7995004fe3;hpb=c3e003dacb5689ffe384d3a2f2d5dc2afb9439bb;p=lilypond.git diff --git a/lily/key-item.cc b/lily/key-item.cc index d80f01670d..e6b8df7b44 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 Han-Wen Nienhuys + (c) 1996--2000 Han-Wen Nienhuys keyplacement by Mats Bengtsson */ @@ -14,89 +14,125 @@ #include "molecule.hh" #include "paper-def.hh" #include "lookup.hh" - -#include "key-grav.hh" +#include "musical-pitch.hh" +#include "staff-symbol-referencer.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_elt_property ("breakable", SCM_BOOL_T); + set_elt_property ("c0-position", gh_int2scm (0)); } void -Key_item::read (Key_engraver const & key_grav_r) +Key_item::add (int p, int a) { - assert (!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); - } + pitch_arr_.push (p); + acc_arr_.push (a); } -void -Key_item::set_c_position (int c0) +void +Key_item::add_old (int p, int a) { - int from_bottom_pos = c0 + 4; // ugh - int octaves =(from_bottom_pos / 7) +1 ; - from_bottom_pos =(from_bottom_pos + 7*octaves)%7; - c_position = from_bottom_pos - 4; + old_pitch_arr_.push (p); + old_acc_arr_.push (a); } -void -Key_item::add (int p, int a) +int +Key_item::calculate_position(int p, int a) const { - 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))) + if (to_boolean (get_elt_property ("multi-octave"))) { - p -= 7; /* Typeset below c_position */ + return p + gh_scm2int (get_elt_property ("c0-position")); } - pitch.push (p); - acc.push (a); + else { + // Find the c in the range -4 through 2 + int from_bottom_pos = gh_scm2int (get_elt_property ("c0-position")) + 4; + from_bottom_pos = from_bottom_pos%7; + from_bottom_pos = (from_bottom_pos + 7)%7; // Precaution to get positive. + int c0 = from_bottom_pos - 4; + + + if ((a<0 && ((p>FLAT_TOP_PITCH) || (p+c0>4)) && (p+c0>1)) + || + (a>0 && ((p>SHARP_TOP_PITCH) || (p+c0>5)) && (p+c0>2))) + { + p -= 7; /* Typeset below c_position */ + } + /* Provide for the four cases in which there's a glitch */ + /* it's a hack, but probably not worth */ + /* the effort of finding a nicer solution. dl. */ + if (c0==2 && a>0 && p==3) + p -= 7; + if (c0==-3 && a>0 && p==-1) + p += 7; + if (c0==-4 && a<0 && p==-1) + p += 7; + if (c0==-2 && a<0 && p==-3) + p += 7; + + return p + c0; + } } - -Molecule* -Key_item::brew_molecule_p() const +/* + TODO + - space the `natural' signs wider + - dehair this + */ +Molecule +Key_item::do_brew_molecule() const { - Molecule*output = new Molecule; - Real inter = paper()->internote_f (); + Molecule mol; + + Staff_symbol_referencer_interface si (this); + Real inter = si.staff_space ()/2.0; - for (int i =0; i < pitch.size(); i++) + int j; + if ((break_status_dir () == LEFT || break_status_dir () == CENTER) + || old_pitch_arr_.size ()) { - Atom a =paper()->lookup_l ()->accidental (acc[i]); - a.translate_axis ((c_position + pitch[i]) * inter, Y_AXIS); - Molecule m (a); - output->add_at_edge (X_AXIS, RIGHT, m); + for (int i =0; i < old_pitch_arr_.size(); i++) + { + for (j =0; (j < pitch_arr_.size()) + && (old_pitch_arr_[i] != pitch_arr_[j]); j++) + ; + + if (j == pitch_arr_.size() + || (old_pitch_arr_[i] == pitch_arr_[j] + && old_acc_arr_[i] != acc_arr_[j])) + { + Molecule m =lookup_l ()->afm_find ("accidentals-0"); + + m.translate_axis (calculate_position(old_pitch_arr_[i], old_acc_arr_[i]) * inter, Y_AXIS); + mol.add_at_edge (X_AXIS, RIGHT, m,0); + } + } + + /* + Add half a space between cancellation and key sig. + + As suggested by [Ross], p.148. + */ + Interval x(0, inter); + Interval y(0,0); + + mol.add_at_edge (X_AXIS, RIGHT, lookup_l()->blank (Box(x,y)),0); } - if (pitch.size()) + + for (int i =0; i < pitch_arr_.size(); i++) { - Molecule m (paper()->lookup_l ()->fill (Box ( - Interval (0, paper()->note_width ()), - Interval (0,0)))); - - output->add_at_edge (X_AXIS, RIGHT, m); + Molecule m = lookup_l ()->afm_find ("accidentals-" + to_str (acc_arr_[i])); + m.translate_axis (calculate_position(pitch_arr_[i], acc_arr_[i]) * inter, Y_AXIS); + mol.add_at_edge (X_AXIS, RIGHT, m, 0); } - return output; + + return mol; } -IMPLEMENT_IS_TYPE_B1(Key_item,Item); -void -Key_item::do_pre_processing() -{ - if (default_b_) - { - transparent_b_ = (break_status_i() != 1); - set_empty (transparent_b_); - } -} + +