+pl 14.hwn1jcn1
+ - chord-name uses scm members
+ - bfs: knee with different mults, interstaff knee, auto-knee
+
pl 14.hwn1
- specialize duration.cc for lily, move out of lib/
- stem cleanup
MAJOR_VERSION=1
MINOR_VERSION=3
PATCH_LEVEL=14
-MY_PATCH_LEVEL=hwn1
+MY_PATCH_LEVEL=hwn1jcn1
# use the above to send patches: MY_PATCH_LEVEL is always empty for a
# released version.
--- /dev/null
+
+\score {
+ \notes \context PianoStaff <
+ \context Staff = "up" {
+ \autochange Staff \relative c' {
+ [c8 e'] [c' c,,]
+ \stemdown
+ c'8 c c g,
+ g8 d' d d
+ \stemup
+ b8 c d e
+ }
+ }
+ \context Staff = "down" {
+ \clef bass;
+ s1*2
+ }
+ >
+ \paper{
+ \translator{
+ \StaffContext
+ autoKneeGap = #13.0
+ autoInterstaffKneeGap = #4.0
+ }
+ }
+}
\score {
- \notes \context PianoStaff <
- \context Staff = "up" {
- \autochange Staff \relative c' {
- [c8 e'] [c' c,,]
- \stemdown
- c'8 c c g,
- g8 d' d d
- \stemup
- b8 c d e
- }
- }
- \context Staff = "down" {
- \clef bass;
- s1*2
- }
- >
+ \context Staff \notes\relative c'{
+% \property Voice.autoKneeGap = #13
+ [c8 e'] [c' c,,]
+ }
\paper{
\translator{
\StaffContext
- autoKneeGap = "13.0";
- autoInterstaffKneeGap = "4.0";
+ autoKneeGap = #13
}
}
}
#include "string.hh"
#include "proto.hh"
#include "warn.hh"
-#include "thank-you-cygnus.hh"
#include "source-file.hh"
#include "simple-file-storage.hh"
#include "string-storage.hh"
{
bool is_b = (bool)(calc_interstaff_dist (stem (i), this)
- calc_interstaff_dist (stem (i-1), this));
- int l_y = (int)(stem (i-1)->chord_start_f ())
+ int l_y = (int)(stem (i-1)->head_positions()[get_direction ()])
+ (int)calc_interstaff_dist (stem (i-1), this);
- int r_y = (int)(stem (i)->chord_start_f ())
+ int r_y = (int)(stem (i)->head_positions()[get_direction ()])
+ (int)calc_interstaff_dist (stem (i), this);
int gap_i = r_y - l_y;
{
for (int i=0; i < stem_count (); i++)
{
- int y = (int)(stem (i)->chord_start_f ())
+ int y = (int)(stem (i)->head_positions()[get_direction ()])
+ (int)calc_interstaff_dist (stem (i), this);
stem (i)->set_direction (y < knee_y ? UP : DOWN);
stem (i)->set_elt_property ("dir-forced", SCM_BOOL_T);
set_stem_length (y, dy);
y_shift = check_stem_length_f (y, dy);
- Real internote_f = paper_l ()->get_var ("interline") / 2;
- if (y_shift > internote_f / 4)
+ Staff_symbol_referencer_interface st (this);
+ Real half_space = st.staff_space () / 2;
+ if (y_shift > half_space / 4)
{
y += y_shift;
request quanting the other way.
*/
int quant_dir = 0;
- if (abs (y_shift) > internote_f / 2)
+ if (abs (y_shift) > half_space / 2)
quant_dir = sign (y_shift) * get_direction ();
y = quantise_y_f (y, dy, quant_dir);
set_stem_length (y, dy);
Real
Beam::calc_stem_y_f (Stem* s, Real y, Real dy) const
{
- Real beam_f = gh_scm2double (get_elt_property ("beam-thickness"));
- int multiplicity = get_multiplicity ();
-
+ Real thick = gh_scm2double (get_elt_property ("beam-thickness"));
+ int beam_multiplicity = get_multiplicity ();
+ int stem_multiplicity = (s->flag_i () - 2) >? 0;
- Real interbeam_f = paper_l ()->interbeam_f (multiplicity);
+ Real interbeam_f = paper_l ()->interbeam_f (beam_multiplicity);
Real x0 = first_visible_stem ()->hpos_f ();
Real dx = last_visible_stem ()->hpos_f () - x0;
Real stem_y = (s->hpos_f () - x0) / dx * dy + y;
/* knee */
if (get_direction () != s->get_direction ())
{
- stem_y -= get_direction () * (beam_f / 2
- + (multiplicity - 1) * interbeam_f);
+ stem_y -= get_direction ()
+ * (thick / 2 + (beam_multiplicity - 1 - stem_multiplicity))
+ * interbeam_f;
Staff_symbol_referencer_interface me (s);
Staff_symbol_referencer_interface last (last_visible_stem ());
if ((s != first_visible_stem ())
&& me.staff_symbol_l () != last.staff_symbol_l ())
stem_y += get_direction ()
- * (multiplicity - (s->flag_i () - 2) >? 0) * interbeam_f;
+ * (beam_multiplicity - stem_multiplicity) * interbeam_f;
}
return stem_y;
}
void
Beam::set_stem_length (Real y, Real dy)
{
- Real internote_f = paper_l ()->get_var ("interline") / 2;
+ Staff_symbol_referencer_interface st (this);
+ Real half_space = st.staff_space ()/2;
for (int i=0; i < stem_count (); i++)
{
Stem* s = stem (i);
Real stem_y = calc_stem_y_f (s, y, dy);
/* caution: stem measures in staff-positions */
- s->set_stemend ((stem_y - calc_interstaff_dist (s, this)) / internote_f);
+ s->set_stemend ((stem_y + calc_interstaff_dist (s, this)) / half_space);
}
}
[Ross] (simplification of)
Try to set dy complying with:
- zero
- - beam_f / 2 + staffline_f / 2
- - beam_f + staffline_f
- + n * interline
+ - thick / 2 + staffline_f / 2
+ - thick + staffline_f
+ + n * staff_space
TODO: get allowed-positions as scm list (aarg: from paper block)
*/
return dy;
Staff_symbol_referencer_interface st (this);
- Real interline_f = st.staff_space ();
+ Real staff_space = st.staff_space ();
Real staffline_f = paper_l ()->get_var ("stafflinethickness");
- Real beam_f = gh_scm2double (get_elt_property ("beam-thickness"));;
+ Real thick = gh_scm2double (get_elt_property ("beam-thickness"));;
Array<Real> allowed_fraction (3);
allowed_fraction[0] = 0;
- allowed_fraction[1] = (beam_f / 2 + staffline_f / 2);
- allowed_fraction[2] = (beam_f + staffline_f);
+ allowed_fraction[1] = (thick / 2 + staffline_f / 2);
+ allowed_fraction[2] = (thick + staffline_f);
- allowed_fraction.push (interline_f);
+ allowed_fraction.push (staff_space);
Interval iv = quantise_iv (allowed_fraction, abs (dy));
Real q = (abs (dy) - iv[SMALLER] <= iv[BIGGER] - abs (dy))
? iv[SMALLER]
hang straddle sit inter hang
*/
- Staff_symbol_referencer_interface sinf (this);
- Real space = sinf.staff_space ();
+ Staff_symbol_referencer_interface st (this);
+ Real staff_space = st.staff_space ();
Real staffline_f = paper_l ()->get_var ("stafflinethickness");
- Real beam_f = gh_scm2double (get_elt_property ("beam-thickness"));;
+ Real thick = gh_scm2double (get_elt_property ("beam-thickness"));;
Real straddle = 0;
- Real sit = beam_f / 2 - staffline_f / 2;
- Real hang = space - beam_f / 2 + staffline_f / 2;
+ Real sit = thick / 2 - staffline_f / 2;
+ Real hang = staff_space - thick / 2 + staffline_f / 2;
/*
Put all allowed positions into an array.
allowed_position.push (hang);
}
- allowed_position.push (space);
+ allowed_position.push (staff_space);
Real up_y = get_direction () * y;
Interval iv = quantise_iv (allowed_position, up_y);
Real interbeam_f = paper_l ()->interbeam_f (multiplicity);
- Real beam_f = gh_scm2double (get_elt_property ("beam-thickness"));;
+ Real thick = gh_scm2double (get_elt_property ("beam-thickness"));;
Real dy = interbeam_f;
Real stemdx = staffline_f;
w = w/2 <? nw_f;
Molecule a;
if (lhalfs) // generates warnings if not
- a = lookup_l ()->beam (dydx, w, beam_f);
+ a = lookup_l ()->beam (dydx, w, thick);
a.translate (Offset (-w, -w * dydx));
for (int j = 0; j < lhalfs; j++)
{
int rwholebeams= here->beam_count (RIGHT) <? next->beam_count (LEFT) ;
Real w = next->hpos_f () - here->hpos_f ();
- Molecule a = lookup_l ()->beam (dydx, w + stemdx, beam_f);
+ Molecule a = lookup_l ()->beam (dydx, w + stemdx, thick);
a.translate_axis( - stemdx/2, X_AXIS);
int j = 0;
Real gap_f = 0;
// TODO: notehead widths differ for different types
gap_f = nw_f / 2;
w -= 2 * gap_f;
- a = lookup_l ()->beam (dydx, w + stemdx, beam_f);
+ a = lookup_l ()->beam (dydx, w + stemdx, thick);
}
for (; j < rwholebeams; j++)
w = w/2 <? nw_f;
if (rhalfs)
- a = lookup_l ()->beam (dydx, w, beam_f);
+ a = lookup_l ()->beam (dydx, w, thick);
for (; j < rwholebeams + rhalfs; j++)
{
if (gh_boolean_p (chord_inversion))
find_inversion_b = gh_scm2bool (chord_inversion);
- chord_name_p_ = new Chord_name (to_chord (pitch_arr_, tonic_req_, inversion_req_, bass_req_, find_inversion_b));
+ chord_name_p_ = new Chord_name;
+ chord_name_p_->set (to_chord (pitch_arr_, tonic_req_, inversion_req_, bass_req_, find_inversion_b));
announce_element (Score_element_info (chord_name_p_, 0));
}
#include "lookup.hh"
SCM
-pitch2scm (Musical_pitch p)
+to_scm (Musical_pitch p)
{
- return gh_cons (gh_int2scm (p.notename_i_), gh_int2scm (p.accidental_i_));
+ return gh_list (gh_int2scm (p.notename_i_), gh_int2scm (p.accidental_i_), gh_int2scm (p.octave_i_), SCM_UNDEFINED);
}
-Chord_name::Chord_name (Chord const& c)
+Musical_pitch
+from_scm (SCM s)
{
- chord_ = c;
+ return Musical_pitch (gh_scm2int (gh_car (s)),
+ gh_scm2int (gh_cadr (s)),
+ gh_scm2int (gh_caddr (s)));
+}
+
+template<class T>SCM
+array_to_scm (Array<T> arr)
+{
+ SCM list = SCM_EOL;
+ for (int i = arr.size (); i--;)
+ list = gh_cons (to_scm (arr[i]), list);
+ return list;
+}
+
+/*
+ Silly templates
+ Array<T> scm_to_array (SCM s)
+ */
+template<class T>void
+scm_to_array (SCM s, Array<T>* arr)
+{
+ for (; gh_pair_p (s); s= gh_cdr (s))
+ arr->push (from_scm (gh_car (s)));
+}
+
+/*
+ ugh, move to chord-name-engraver
+
+ Hmm, why not represent complete chord as list?
+ ((tonic third fifth) (inversion bass))
+ */
+void
+Chord_name::set (Chord const& c)
+{
+ set_elt_property ("pitches", array_to_scm (c.pitch_arr_));
+ if (c.inversion_b_)
+ set_elt_property ("inversion", to_scm (c.inversion_pitch_));
+ if (c.bass_b_)
+ set_elt_property ("bass", to_scm (c.bass_pitch_));
+}
+
+SCM
+notename2scm (Musical_pitch p)
+{
+ return gh_cons (gh_int2scm (p.notename_i_), gh_int2scm (p.accidental_i_));
}
/*
Molecule
Chord_name::pitch2molecule (Musical_pitch p) const
{
- SCM name = scm_eval (gh_list (ly_symbol2scm ("user-pitch-name"), ly_quote_scm (pitch2scm (p)), SCM_UNDEFINED));
+ SCM name = scm_eval (gh_list (ly_symbol2scm ("user-pitch-name"), ly_quote_scm (notename2scm (p)), SCM_UNDEFINED));
if (name != SCM_UNSPECIFIED)
{
Chord::rebuild_transpose (&chord_type, diff_pitch (pitch_arr[0], Musical_pitch (0)), false);
for (int i= chord_type.size (); i--; )
- chord = gh_cons (pitch2scm (chord_type[i]), chord);
+ chord = gh_cons (notename2scm (chord_type[i]), chord);
SCM name = scm_eval (gh_list (ly_symbol2scm ("user-chord-name"), ly_quote_scm (chord), SCM_UNDEFINED));
if (gh_pair_p (name))
scale.push (Musical_pitch (i));
Musical_pitch tonic = pitch_arr[0];
- chord_.rebuild_transpose (&scale, tonic, true);
+ Chord::rebuild_transpose (&scale, tonic, true);
/*
Does chord include this step? -1 if flat
}
}
+/*
+ TODO:
+ fix silly to-and-fro scm conversions
+ */
Molecule*
Chord_name::do_brew_molecule_p () const
{
- Musical_pitch tonic = chord_.pitch_arr_[0];
+ Array<Musical_pitch> pitch_arr;
+ scm_to_array (get_elt_property ("pitches"), &pitch_arr);
+ Musical_pitch tonic = pitch_arr[0];
Chord_mol name;
name.tonic_mol = pitch2molecule (tonic);
maybe we should check all sub-lists of pitches, not
just full list and base triad?
*/
- if (!user_chord_name (chord_.pitch_arr_, &name))
+ if (!user_chord_name (pitch_arr, &name))
{
/*
else, check if user has listed base triad
use user base name and add banter for remaining part
*/
- if ((chord_.pitch_arr_.size () > 2)
- && user_chord_name (chord_.pitch_arr_.slice (0, 3), &name))
+ if ((pitch_arr.size () > 2)
+ && user_chord_name (pitch_arr.slice (0, 3), &name))
{
Array<Musical_pitch> base = Chord::base_arr (tonic);
- base.concat (chord_.pitch_arr_.slice (3, chord_.pitch_arr_.size ()));
+ base.concat (pitch_arr.slice (3, pitch_arr.size ()));
banter (base, &name);
}
/*
*/
else
{
- banter (chord_.pitch_arr_, &name);
+ banter (pitch_arr, &name);
}
}
- if (chord_.inversion_b_)
+ SCM s = get_elt_property ("inversion");
+ if (s != SCM_UNDEFINED)
{
name.inversion_mol = lookup_l ()->text ("", "/", paper_l ());
- // zucht const&
- Molecule mol = pitch2molecule (chord_.inversion_pitch_);
+ Molecule mol = pitch2molecule (from_scm (s));
name.inversion_mol.add_at_edge (X_AXIS, RIGHT, mol, 0);
}
- if (chord_.bass_b_)
+ s = get_elt_property ("bass");
+ if (s != SCM_UNDEFINED)
{
name.bass_mol = lookup_l ()->text ("", "/", paper_l ());
- Molecule mol = pitch2molecule (chord_.bass_pitch_);
+ Molecule mol = pitch2molecule (from_scm (s));
name.bass_mol.add_at_edge (X_AXIS, RIGHT, mol, 0);
}
bool user_chord_name (Array<Musical_pitch> pitch_arr, Chord_mol* name_p) const;
void banter (Array<Musical_pitch> pitch_arr, Chord_mol* name_p) const;
- Chord_name (Chord const& c);
-
- /*
- ugh. Junkme, I must be elt property.
- */
-
- Chord chord_;
+ void set (Chord const& c);
protected:
virtual Molecule* do_brew_molecule_p () const;
return s;
}
+#if 0
SCM
array_to_list (SCM *a , int l)
{
}
return list;
}
+#endif
SCM
ly_warning (SCM str)
if (gh_number_p (s))
info.idealy_f_ -= gh_double2scm (s);
- Real interstaff_f = beam_dir* calc_interstaff_dist (this, beam_l ());
+ Real interstaff_f = -beam_dir* calc_interstaff_dist (this, beam_l ());
info.idealy_f_ += interstaff_f;
info.miny_f_ += interstaff_f;