X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fkey-item.cc;h=a3b646b0e5048710f68dbc36cd83ef394d3a86b9;hb=1b071315c1d318e46035ec8bc0b73da55a025ae8;hp=54ee56b195179f1f951e678d21b76010b3a89d15;hpb=036af34aa44a151b9e67c18e0acccaafdfae9de8;p=lilypond.git diff --git a/lily/key-item.cc b/lily/key-item.cc index 54ee56b195..a3b646b0e5 100644 --- a/lily/key-item.cc +++ b/lily/key-item.cc @@ -1,74 +1,141 @@ +/* + key-item.cc -- implement Key_item + + source file of the GNU LilyPond music typesetter + + (c) 1996, 1997--1999 Han-Wen Nienhuys + + keyplacement by Mats Bengtsson +*/ + #include "key-item.hh" #include "key.hh" #include "debug.hh" #include "molecule.hh" #include "paper-def.hh" #include "lookup.hh" -//#include "clef-reg.hh" -#include "key-reg.hh" +#include "musical-pitch.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 () +{ + multi_octave_b_ = false; + set_elt_property (breakable_scm_sym, SCM_BOOL_T); + set_c_position (0); +} + +int +Key_item::get_c_position () const +{ + // Find the c in the range -4 through 2 + int from_bottom_pos = c0_position_ + 4; + from_bottom_pos = from_bottom_pos%7; + from_bottom_pos = (from_bottom_pos + 7)%7; // Precaution to get positive. + return from_bottom_pos - 4; +} -Key_item::Key_item(int c) +void +Key_item::set_c_position (int c0) { - set_c_position(c); + c0_position_ = c0; } + void -Key_item::read(Key_register const & key_reg_r) +Key_item::add (int p, int a) { - assert(!key_reg_r.key_.multi_octave_b_); - const Array &idx_arr =key_reg_r.accidental_idx_arr_; - for (int i = 0 ; i< idx_arr.size(); i++) { - int note = idx_arr[i]; - int acc = ((Key &) key_reg_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 octaves =(abs(c0) / 7) +1 ; - c_position=(c0 + 7*octaves)%7; + 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) || - (a>0 && p>SHARP_TOP_PITCH)) { - p -= 7; /* Typeset below c_position */ + if (multi_octave_b_) + { + return p + c0_position_; } - pitch.push(p); - acc.push(a); + else { + if ((a<0 && ((p>FLAT_TOP_PITCH) || (p+get_c_position ()>4)) && (p+get_c_position ()>1)) + || + (a>0 && ((p>SHARP_TOP_PITCH) || (p+get_c_position ()>5)) && (p+get_c_position ()>2))) + { + p -= 7; /* Typeset below c_position */ + } + return p + get_c_position (); + } } - +/* + TODO + - space the `natural' signs wider + - dehair this + */ Molecule* -Key_item::brew_molecule_p()const +Key_item::do_brew_molecule_p() const { - Molecule*output = new Molecule; - Real inter = paper()->internote_f(); - - for (int i =0; i < pitch.size(); i++) { - Symbol s= paper()->lookup_l()->accidental(acc[i]); - Atom a(s); - a.translate_y((c_position + pitch[i]) * inter); - Molecule m(a); - output->add_right(m); + Molecule*output = new Molecule; + Real inter = staff_line_leading_f ()/2.0; + + int j; + if ((break_status_dir () == LEFT || break_status_dir () == CENTER) + || old_pitch_arr_.size ()) + { + 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 ()->accidental (0,false); + m.translate_axis (calculate_position(old_pitch_arr_[i], old_acc_arr_[i]) * inter, Y_AXIS); + output->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); + + output->add_at_edge (X_AXIS, RIGHT, lookup_l()->fill (Box(x,y)),0); } - Molecule m(paper()->lookup_l()->fill(Box( - Interval(0, paper()->note_width()), - Interval(0,0)))); - if ( pitch.size() ) - output->add_right(m); - return output; + + for (int i =0; i < pitch_arr_.size(); i++) + { + Molecule m =lookup_l ()->accidental (acc_arr_[i],false); + m.translate_axis (calculate_position(pitch_arr_[i], acc_arr_[i]) * inter, Y_AXIS); + output->add_at_edge (X_AXIS, RIGHT, m, 0); + } + + if (pitch_arr_.size()) + { + Molecule m (lookup_l ()->fill (Box ( + Interval (0, paper_l ()->note_width ()), + Interval (0,0)))); + + output->add_at_edge (X_AXIS, RIGHT, m,0 ); + } + return output; } -IMPLEMENT_STATIC_NAME(Key_item); -IMPLEMENT_IS_TYPE_B1(Key_item,Item); + + +