source file of the GNU LilyPond music typesetter
- (c) 1996, 1997--1998 Han-Wen Nienhuys <hanwen@cs.uu.nl>
+ (c) 1996, 1997--1999 Han-Wen Nienhuys <hanwen@cs.uu.nl>
keyplacement by Mats Bengtsson
*/
#include "molecule.hh"
#include "paper-def.hh"
#include "lookup.hh"
-
-#include "key-engraver.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 ()
{
- breakable_b_ =true;
- default_b_ = false;
+ set_elt_property ("breakable", SCM_BOOL_T);
set_c_position (0);
}
-void
-Key_item::read (Key_engraver const & key_grav_r)
-{
- multi_octave_b_ = key_grav_r.key_.multi_octave_b_;
- const Array<Musical_pitch> &idx_arr = key_grav_r.accidental_idx_arr_;
- for (int i = 0; i < idx_arr.size(); i++)
- {
- 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<Musical_pitch> &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
+Key_item::get_c_position () const
{
- c0_position = c0;
// Find the c in the range -4 through 2
- int from_bottom_pos = c0 + 4;
+ 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.
- c_position = from_bottom_pos - 4;
+ return from_bottom_pos - 4;
}
-void
-Key_item::add (int p, int a)
+void
+Key_item::set_c_position (int c0)
{
- pitch.push (p);
- acc.push (a);
+ c0_position_ = c0;
}
+
void
-Key_item::add (const Musical_pitch& pitch_r)
+Key_item::add (int p, int a)
{
- pitch.push (pitch_r.steps());
- acc.push (pitch_r.accidental_i_);
+ pitch_arr_.push (p);
+ acc_arr_.push (a);
}
void
Key_item::add_old (int p, int a)
{
- old_pitch.push (p);
- old_acc.push (a);
+ old_pitch_arr_.push (p);
+ old_acc_arr_.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_)
+ if (to_boolean (get_elt_property ("multi-octave")))
{
- return p + c0_position;
+ return p + c0_position_;
}
else {
- if ((a<0 && ((p>FLAT_TOP_PITCH) || (p+c_position>4)) && (p+c_position>1))
+ if ((a<0 && ((p>FLAT_TOP_PITCH) || (p+get_c_position ()>4)) && (p+get_c_position ()>1))
||
- (a>0 && ((p>SHARP_TOP_PITCH) || (p+c_position>5)) && (p+c_position>2)))
+ (a>0 && ((p>SHARP_TOP_PITCH) || (p+get_c_position ()>5)) && (p+get_c_position ()>2)))
{
p -= 7; /* Typeset below c_position */
}
- return p + 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 (get_c_position ()==2 && a>0 && p==3)
+ p -= 7;
+ if (get_c_position ()==-3 && a>0 && p==-1)
+ p += 7;
+ if (get_c_position ()==-4 && a<0 && p==-1)
+ p += 7;
+ if (get_c_position ()==-2 && a<0 && p==-3)
+ p += 7;
+ return p + get_c_position ();
}
}
/*
- TODO space the `natural' signs wider
+ 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 ();
+
+ Staff_symbol_referencer_interface si (this);
+ Real inter = si.staff_space ()/2.0;
int j;
- if ((break_status_dir_ == LEFT || break_status_dir_ == CENTER)
- || old_pitch.size ())
+ if ((break_status_dir () == LEFT || break_status_dir () == CENTER)
+ || old_pitch_arr_.size ())
{
- for (int i =0; i < old_pitch.size(); i++)
+ for (int i =0; i < old_pitch_arr_.size(); i++)
{
- for (j =0; (j < pitch.size()) && (old_pitch[i] != pitch[j]); j++)
+ for (j =0; (j < pitch_arr_.size())
+ && (old_pitch_arr_[i] != pitch_arr_[j]); j++)
;
- if (j == pitch.size()
- || (old_pitch[i] == pitch[j] && old_acc[i] != acc[j]))
+ if (j == pitch_arr_.size()
+ || (old_pitch_arr_[i] == pitch_arr_[j]
+ && old_acc_arr_[i] != acc_arr_[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);
+ Molecule m =lookup_l ()->afm_find ("accidentals-0");
+
+ 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);
}
}
Interval x(0, inter);
Interval y(0,0);
- output->add_at_edge (X_AXIS, RIGHT, lookup_l()->fill (Box(x,y)));
+ output->add_at_edge (X_AXIS, RIGHT, lookup_l()->fill (Box(x,y)),0);
}
- for (int i =0; i < pitch.size(); i++)
- {
- 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())
+ for (int i =0; i < pitch_arr_.size(); i++)
{
- Molecule m (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);
+ output->add_at_edge (X_AXIS, RIGHT, m, 0);
}
+
return output;
}
-IMPLEMENT_IS_TYPE_B1(Key_item,Item);
-void
-Key_item::do_pre_processing()
-{
- if (default_b_)
- {
- transparent_b_ = (break_status_dir() != RIGHT);
- set_empty (transparent_b_);
- }
-}
+
+