From 46c5beb169abbc5a03bd57562cda1669640e4c72 Mon Sep 17 00:00:00 2001 From: Jan Nieuwenhuizen Date: Mon, 18 Mar 2002 23:23:50 +0100 Subject: [PATCH] patch::: 1.5.42.jcn2 2002-03-18 Jan Nieuwenhuizen * scm/grob-property-description.scm: * scm/interface-description.scm: Remove old stuff. * scm/grob-description.scm (StemTremolo): Change beam-thickness to 0.48 (previously 0.42). (Beam): Remove old stuff. * lily/stem.cc: * lily/stem-tremolo.cc: * lily/beam.cc: * scm/beam.scm: Remove old stuff. Use Beam::get_interbeam () (previously space-function). --- Generated by janneke@gnu.org, From = lilypond-1.5.42.hwn1, To = lilypond-1.5.42.jcn2 usage cd lilypond-source-dir; patch -E -p1 < lilypond-1.5.42.jcn2.diff Patches do not contain automatically generated files or (urg) empty directories, i.e., you should rerun autoconf, configure --- ChangeLog | 20 ++ VERSION | 2 +- lily/beam.cc | 380 +++++++----------------------- lily/include/beam.hh | 8 +- lily/include/stem-info.hh | 6 +- lily/stem-tremolo.cc | 22 +- lily/stem.cc | 63 +++-- scm/beam.scm | 136 +---------- scm/grob-description.scm | 22 +- scm/grob-property-description.scm | 8 - scm/interface-description.scm | 4 +- 11 files changed, 174 insertions(+), 497 deletions(-) diff --git a/ChangeLog b/ChangeLog index b3add57fb5..e0b0e21e2f 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,25 @@ +--- ../lilypond-1.5.42.hwn1/ChangeLog Mon Mar 18 16:59:27 2002 +++ b/ChangeLog Mon Mar 18 23:23:50 2002 +@@ -1,3 +1,18 @@ 2002-03-18 Jan Nieuwenhuizen + * scm/grob-property-description.scm: + * scm/interface-description.scm: Remove old stuff. + + * scm/grob-description.scm (StemTremolo): Change beam-thickness to + 0.48 (previously 0.42). + (Beam): Remove old stuff. + + * lily/stem.cc: + * lily/stem-tremolo.cc: + * lily/beam.cc: + * scm/beam.scm: Remove old stuff. Use Beam::get_interbeam () + (previously space-function). + + 2002-03-18 Han-Wen + + * lily/afm.cc (afm_bbox_to_box): make code dimension independent2002-03-18 Jan Nieuwenhuizen + * stepmake/bin/add-html-footer.py: Website title fix. 2002-03-15 Mats Bengtsson diff --git a/VERSION b/VERSION index 31aa0176e2..d4985a2899 100644 --- a/VERSION +++ b/VERSION @@ -2,7 +2,7 @@ PACKAGE_NAME=LilyPond MAJOR_VERSION=1 MINOR_VERSION=5 PATCH_LEVEL=42 -MY_PATCH_LEVEL=jcn1 +MY_PATCH_LEVEL=jcn2 # use the above to send patches: MY_PATCH_LEVEL is always empty for a # released version. diff --git a/lily/beam.cc b/lily/beam.cc index 35a09d2f37..d511651d4a 100644 --- a/lily/beam.cc +++ b/lily/beam.cc @@ -1,11 +1,11 @@ /* beam.cc -- implement Beam - + source file of the GNU LilyPond music typesetter - - (c) 1997--2002 Han-Wen Nienhuys - Jan Nieuwenhuizen - + + (c) 1997--2002 Han-Wen Nienhuys + Jan Nieuwenhuizen + */ /* @@ -47,10 +47,9 @@ static Real shrink_extra_weight (Real x) { - return fabs(x) * ((x < 0) ? 1.5 : 1.0); + return fabs (x) * ((x < 0) ? 1.5 : 1.0); } - void Beam::add_stem (Grob *me, Grob *s) { @@ -64,6 +63,22 @@ Beam::add_stem (Grob *me, Grob *s) add_bound_item (dynamic_cast (me), dynamic_cast (s)); } +Real +Beam::get_interbeam (Grob *me) +{ + Real slt = me->paper_l ()->get_var ("stafflinethickness"); + Real ss = Staff_symbol_referencer::staff_space (me); + Real thickness = gh_scm2double (me->get_grob_property ("thickness")) + * ss; + + int multiplicity = get_multiplicity (me); + Real interbeam = multiplicity < 4 + ? (2*ss + slt - thickness) / 2.0 + : (3*ss + slt - thickness) / 3.0; + + return interbeam; +} + int Beam::get_multiplicity (Grob *me) { @@ -293,7 +308,7 @@ Beam::set_stem_shorten (Grob *m) grob-properties y, dy. User may set grob-properties: y-position-hs and height-hs - (to be fixed) that override the calculated y and dy. + (to be fixed) that override the calculated y and dy. Because y and dy cannot be calculated and quanted separately, we always calculate both, then check for user override. */ @@ -324,20 +339,26 @@ struct Quant_score Real demerits; }; - -MAKE_SCHEME_CALLBACK (Beam, new_quanting, 1); +/* + TODO: + - Make all demerits customisable + - One sensible check per demerit + - Add demerits for quants per se, as to forbid a specific quant + entirely + */ +MAKE_SCHEME_CALLBACK (Beam, quanting, 1); SCM -Beam::new_quanting (SCM smob) +Beam::quanting (SCM smob) { Grob *me = unsmob_grob (smob); SCM s = me->get_grob_property ("positions"); - Real yl = gh_scm2double (gh_car(s)); - Real yr = gh_scm2double (gh_cdr(s)); + Real yl = gh_scm2double (gh_car (s)); + Real yr = gh_scm2double (gh_cdr (s)); Real ss = Staff_symbol_referencer::staff_space (me); Real thickness = gh_scm2double (me->get_grob_property ("thickness")) / ss; - Real slt = me->paper_l()->get_var ("stafflinethickness") / ss; + Real slt = me->paper_l ()->get_var ("stafflinethickness") / ss; Real straddle = 0.0; Real sit = (thickness - slt) / 2; @@ -345,7 +366,7 @@ Beam::new_quanting (SCM smob) Real hang = 1.0 - (thickness - slt) / 2; Real quants [] = {straddle, sit, inter, hang }; - int num_quants = int(sizeof(quants)/sizeof (Real)); + int num_quants = int (sizeof (quants)/sizeof (Real)); Array quantsl; Array quantsr; @@ -360,8 +381,8 @@ Beam::new_quanting (SCM smob) Array qscores; - for(int l =0; l < quantsl.size(); l++) - for(int r =0; r < quantsr.size(); r++) + for (int l =0; l < quantsl.size (); l++) + for (int r =0; r < quantsr.size (); r++) { Quant_score qs; qs.yl = quantsl[l]; @@ -372,18 +393,18 @@ Beam::new_quanting (SCM smob) } - SCM score_funcs = me->get_grob_property("quant-score-functions"); + SCM score_funcs = me->get_grob_property ("quant-score-functions"); for (SCM s = score_funcs; gh_pair_p (s); s = gh_cdr (s)) { SCM f = gh_car (s); - for (int i = qscores.size(); i--;) + for (int i = qscores.size (); i--;) { // best scores < 30; // if (qscores[i].demerits < 1000) if (qscores[i].demerits < 100) { SCM score = gh_call3 (f, - me->self_scm(), + me->self_scm (), gh_double2scm (qscores[i].yl), gh_double2scm (qscores[i].yr)); @@ -394,7 +415,7 @@ Beam::new_quanting (SCM smob) Real best = 1e6; int best_idx = -1; - for (int i = qscores.size(); i--;) + for (int i = qscores.size (); i--;) { if (qscores[i].demerits < best) { @@ -424,16 +445,16 @@ MAKE_SCHEME_CALLBACK (Beam, score_slopes_dy, 3); SCM Beam::score_slopes_dy (SCM smob, SCM syl, SCM syr) { - Grob*me = unsmob_grob(smob); + Grob*me = unsmob_grob (smob); Real yl = gh_scm2double (syl); Real yr = gh_scm2double (syr); Real dy = yr - yl; - SCM sdy = me->get_grob_property("least-squares-dy"); + SCM sdy = me->get_grob_property ("least-squares-dy"); SCM posns = me->get_grob_property ("positions"); Real dy_mus = gh_number_p (sdy) ? gh_scm2double (sdy) : 0.0; - Real dy_damp = - gh_scm2double (gh_car(posns)) + gh_scm2double (gh_cdr (posns)); + Real dy_damp = - gh_scm2double (gh_car (posns)) + gh_scm2double (gh_cdr (posns)); Real dem = 0.0; if (sign (dy_damp) != sign (dy)) @@ -441,18 +462,18 @@ Beam::score_slopes_dy (SCM smob, SCM syl, SCM syr) dem += 800; } - dem += 400* (0 >? (fabs(dy) - fabs(dy_mus))); + dem += 400* (0 >? (fabs (dy) - fabs (dy_mus))); - dem += shrink_extra_weight (fabs (dy_damp) - fabs(dy))* 10; - return gh_double2scm (dem); + dem += shrink_extra_weight (fabs (dy_damp) - fabs (dy))* 10; + return gh_double2scm (dem); } MAKE_SCHEME_CALLBACK (Beam, score_stem_lengths, 3); SCM Beam::score_stem_lengths (SCM smob, SCM syl, SCM syr) { - Grob*me = unsmob_grob(smob); + Grob*me = unsmob_grob (smob); Real yl = gh_scm2double (syl); Real yr = gh_scm2double (syr); @@ -467,17 +488,17 @@ Beam::score_stem_lengths (SCM smob, SCM syl, SCM syr) if (Stem::invisible_b (s)) continue; - Real current_y = calc_stem_y_f (me, s, Interval(yl,yr)); + Real current_y = calc_stem_y (me, s, Interval (yl, yr)); Stem_info info = Stem::calc_stem_info (s); Direction d = Directional_element_interface::get (s); - demerit_score += 500 * ( 0 >? (info.miny_f_ - d*current_y)); - demerit_score += 500 * ( 0 >? (d * current_y - info.maxy_f_)); + demerit_score += 500 * ( 0 >? (info.min_y - d * current_y)); + demerit_score += 500 * ( 0 >? (d * current_y - info.max_y)); - demerit_score += 5 * shrink_extra_weight (d * current_y - info.idealy_f_); + demerit_score += 5 * shrink_extra_weight (d * current_y - info.ideal_y); } - demerit_score *= 2.0 /stems.size(); + demerit_score *= 2.0 /stems.size (); return gh_double2scm (demerit_score); } @@ -485,7 +506,7 @@ Beam::score_stem_lengths (SCM smob, SCM syl, SCM syr) static Real my_modf (Real x) { - return x - floor(x); + return x - floor (x); } @@ -494,15 +515,15 @@ MAKE_SCHEME_CALLBACK (Beam, score_forbidden_quants, 3); SCM Beam::score_forbidden_quants (SCM smob, SCM syl, SCM syr) { - Grob*me = unsmob_grob(smob); + Grob*me = unsmob_grob (smob); Real yl = gh_scm2double (syl); Real yr = gh_scm2double (syr); Real dy = yr - yl; Real rad = Staff_symbol_referencer::staff_radius (me); Real dem = 0.0; - if (fabs (yl) < rad && fabs( my_modf(yl) - 0.5) < 1e-3) + if (fabs (yl) < rad && fabs ( my_modf (yl) - 0.5) < 1e-3) dem += 1000; - if (fabs (yr) < rad && fabs( my_modf(yr) - 0.5) < 1e-3) + if (fabs (yr) < rad && fabs ( my_modf (yr) - 0.5) < 1e-3) dem += 1000; @@ -510,32 +531,30 @@ Beam::score_forbidden_quants (SCM smob, SCM syl, SCM syr) // todo: use multiplicity of outer stems. if (multiplicity >= 2) { - Real slt = me->paper_l()->get_var("stafflinethickness"); - Real ss = Staff_symbol_referencer::staff_space(me); + Real slt = me->paper_l ()->get_var ("stafflinethickness"); + Real ss = Staff_symbol_referencer::staff_space (me); Real thickness = gh_scm2double (me->get_grob_property ("thickness")) * ss; - - Real beam_space= (2*ss + slt - 3 *thickness) / 2.0; - if (multiplicity >= 4) - { - beam_space = (3*ss + slt - 4 * thickness) /3.0; - } - + + Real interbeam = multiplicity < 4 + ? (2*ss + slt - thickness) / 2.0 + : (3*ss + slt - thickness) / 3.0; + Real straddle = 0.0; Real sit = (thickness - slt) / 2; Real inter = 0.5; Real hang = 1.0 - (thickness - slt) / 2; Direction dir = Directional_element_interface::get (me); - if (fabs (yl - dir * (beam_space + thickness)) < rad + if (fabs (yl - dir * interbeam) < rad && fabs (my_modf (yl) - inter) < 1e-3) dem += 15; - if (fabs (yr - dir * (beam_space + thickness)) < rad + if (fabs (yr - dir * interbeam) < rad && fabs (my_modf (yr) - inter) < 1e-3) dem += 15; // hmm, without Interval/Drul_array, you get ~ 4x same code... - if (fabs (yl - dir * (beam_space + thickness)) < rad + inter) + if (fabs (yl - dir * interbeam) < rad + inter) { if (dir == UP && dy <= 1e-3 && fabs (my_modf (yl) - sit) < 1e-3) @@ -546,7 +565,7 @@ Beam::score_forbidden_quants (SCM smob, SCM syl, SCM syr) dem += 15; } - if (fabs (yr - dir * (beam_space + thickness)) < rad + inter) + if (fabs (yr - dir * interbeam) < rad + inter) { if (dir == UP && dy >= 1e-3 && fabs (my_modf (yr) - sit) < 1e-3) @@ -556,10 +575,10 @@ Beam::score_forbidden_quants (SCM smob, SCM syl, SCM syr) && fabs (my_modf (yr) - hang) < 1e-3) dem += 15; } - + if (multiplicity >= 3) { - if (fabs (yl - 2 * dir * (beam_space + thickness)) < rad + inter) + if (fabs (yl - 2 * dir * interbeam) < rad + inter) { if (dir == UP && dy <= 1e-3 && fabs (my_modf (yl) - straddle) < 1e-3) @@ -570,7 +589,7 @@ Beam::score_forbidden_quants (SCM smob, SCM syl, SCM syr) dem += 15; } - if (fabs (yr - 2 * dir * (beam_space + thickness)) < rad + inter) + if (fabs (yr - 2 * dir * interbeam) < rad + inter) { if (dir == UP && dy >= 1e-3 && fabs (my_modf (yr) - straddle) < 1e-3) @@ -605,8 +624,8 @@ Beam::least_squares (SCM smob) Direction dir = Directional_element_interface::get (me); - Interval ideal (Stem::calc_stem_info (first_visible_stem (me)).idealy_f_, - Stem::calc_stem_info (last_visible_stem (me)).idealy_f_); + Interval ideal (Stem::calc_stem_info (first_visible_stem (me)).ideal_y, + Stem::calc_stem_info (last_visible_stem (me)).ideal_y); if (!ideal.delta ()) { @@ -624,7 +643,7 @@ Beam::least_squares (SCM smob) /* Make simple beam on middle line have small tilt */ if (!ideal[LEFT] && chord.delta () && count == 2) { - Direction d = (Direction)(sign (chord.delta ()) * dir); + Direction d = (Direction) (sign (chord.delta ()) * dir); pos[d] = gh_scm2double (me->get_grob_property ("thickness")) / 2 * dir; pos[-d] = - pos[d]; @@ -651,7 +670,7 @@ Beam::least_squares (SCM smob) if (Stem::invisible_b (s)) continue; ideals.push (Offset (s->relative_coordinate (0, X_AXIS) - x0, - Stem::calc_stem_info (s).idealy_f_)); + Stem::calc_stem_info (s).ideal_y)); } Real y; Real dydx; @@ -764,148 +783,6 @@ Beam::slope_damping (SCM smob) return SCM_UNSPECIFIED; } -/* Prevent interference from stafflines. */ -Interval -Beam::quantise_interval (Grob *me, Interval pos, Direction quant_dir) -{ - int multiplicity = get_multiplicity (me); - - Real staff_space = Staff_symbol_referencer::staff_space (me); - Real thick = me->paper_l ()->get_var ("stafflinethickness"); - Direction dir = Directional_element_interface::get (me); - Real dy = pos.delta (); - - Drul_array bounds; - Direction d = LEFT; - do - { - SCM proc = d == LEFT - ? me->get_grob_property ("left-position-quant-function") - : me->get_grob_property ("right-position-quant-function"); - - SCM quants = scm_apply (proc, - me->self_scm (), - scm_list_n (gh_int2scm (multiplicity), - gh_double2scm (dir), - gh_double2scm (dy), - gh_double2scm (thick / staff_space), - /* HUH? */ - SCM_EOL, - SCM_UNDEFINED)); - - Array a; - for (SCM i = quants; gh_pair_p (i); i = ly_cdr (i)) - a.push (gh_scm2double (ly_car (i))); - - if (a.size () <= 1) - return pos; - - bounds[d] = quantise_iv (a, pos[d]*dir/staff_space) * staff_space; - } - while (flip (&d) != LEFT); - - Real ady = abs (dy); - - // quant direction hints disabled for now - int q = 0;//(int)quant_dir; - - /* TODO: make smart choice, find best left/right quants pair. - - Slope should never be steeper than least_squares (before damping) - (save that value?) - Slope should never be reduced to zero. - */ - SCM s = me->get_grob_property ("least-squares-dy"); - Real lsdy = gh_number_p (s) ? gh_scm2double (s) : 0; - - // Interval qpos (0, 1000 * sign (dy)); - Interval qpos; - Real epsilon = staff_space / 10; - Direction ldir = LEFT; - do - { - Direction rdir = LEFT; - do - { - Interval i (bounds[LEFT][ldir]*dir, bounds[RIGHT][rdir]*dir); - if ((!lsdy - || (abs (i.delta ()) <= abs (lsdy) + epsilon - && sign (i.delta ()) == sign (lsdy))) - && (abs (abs (i.delta ()) - ady) - <= abs (abs (qpos.delta ()) - ady)) - && sign (i.delta ()) == sign (pos.delta ()) - && (!q - || (i[LEFT]*q >= pos[LEFT]*q && i[RIGHT]*q - >= pos[RIGHT]*q))) - qpos = i; - } - while (flip (&rdir) != LEFT); - } - while (flip (&ldir) != LEFT); - - return qpos; -} - - -/* Quantise vertical position (left and right) of beam. - Generalisation of [Ross]. */ -MAKE_SCHEME_CALLBACK (Beam, quantise_position, 1); -SCM -Beam::quantise_position (SCM smob) -{ - Grob *me = unsmob_grob (smob); - - Interval pos = ly_scm2interval (me->get_grob_property ("positions")); - Real y_shift = check_stem_length_f (me, pos); - pos += y_shift; - Real staff_space = Staff_symbol_referencer::staff_space (me); - - Direction dir = Directional_element_interface::get (me); - for (int i = 0; i < 10; i++) - { - Interval qpos = quantise_interval (me, pos, CENTER); - // how to check for uninitised interval, (inf, -inf)? - if (qpos[LEFT] < 1000) - { - y_shift = check_stem_length_f (me, qpos); - if (y_shift * dir < staff_space / 2) - { - pos = qpos; - break; - } - } - pos += ((i + 1) * ((i % 2) * -2 + 1)) * dir * staff_space / 4; - } - - - me->set_grob_property ("positions", ly_interval2scm (pos)); - set_stem_lengths (me); - -#if 0 - pos = ly_scm2interval (me->get_grob_property ("positions")); - - y_shift = check_stem_length_f (me, pos); - - Real half_space = Staff_symbol_referencer::staff_space (me) / 2; - /* HMMM */ - if (y_shift > half_space / 4) - { - pos += y_shift; - int quant_dir = 0; - /* for significantly lengthened or shortened stems, - request quanting the other way. - HMMM */ - if (abs (y_shift) > half_space / 2) - quant_dir = sign (y_shift) * Directional_element_interface::get (me); - pos = quantise_interval (me, pos, (Direction)quant_dir); - } - - me->set_grob_property ("positions", ly_interval2scm (pos)); -#endif - - return SCM_UNSPECIFIED; -} - MAKE_SCHEME_CALLBACK (Beam, end_after_line_breaking, 1); SCM Beam::end_after_line_breaking (SCM smob) @@ -921,16 +798,13 @@ Beam::end_after_line_breaking (SCM smob) in POS, and for stem S. */ Real -Beam::calc_stem_y_f (Grob *me, Item* s, Interval pos) +Beam::calc_stem_y (Grob *me, Item* s, Interval pos) { int beam_multiplicity = get_multiplicity (me); int stem_multiplicity = (Stem::flag_i (s) - 2) >? 0; - SCM space_proc = me->get_grob_property ("space-function"); - SCM space = gh_call1 (space_proc, gh_int2scm (beam_multiplicity)); - Real thick = gh_scm2double (me->get_grob_property ("thickness")); - Real interbeam_f = gh_scm2double (space); + Real interbeam = get_interbeam (me); // ugh -> use commonx Real x0 = first_visible_stem (me)->relative_coordinate (0, X_AXIS); @@ -948,91 +822,18 @@ Beam::calc_stem_y_f (Grob *me, Item* s, Interval pos) /* knee */ if (dir!= sdir) { - stem_y -= dir * (thick / 2 + (beam_multiplicity - 1) * interbeam_f); + stem_y -= dir * (thick / 2 + (beam_multiplicity - 1) * interbeam); // huh, why not for first visible? if (Staff_symbol_referencer::staff_symbol_l (s) != Staff_symbol_referencer::staff_symbol_l (last_visible_stem (me))) stem_y += Directional_element_interface::get (me) - * (beam_multiplicity - stem_multiplicity) * interbeam_f; + * (beam_multiplicity - stem_multiplicity) * interbeam; } return stem_y; } -/* Make very sure that we don't have stems that are too short. - Try our best not to have stems that are too long (think: knees). - - Optionally (testing): try to lengthen more, to reach more ideal - stem lengths */ -Real -Beam::check_stem_length_f (Grob *me, Interval pos) -{ - Real shorten = 0; - Real lengthen = 0; - Direction dir = Directional_element_interface::get (me); - - Link_array stems= - Pointer_group_interface__extract_grobs (me, (Item*)0, "stems"); - - bool knee = false; - int ideal_lengthen_count = 0; - Real ideal_lengthen = 0; - int ideal_shorten_count = 0; - Real ideal_shorten = 0; - - for (int i=0; i < stems.size (); i++) - { - Item* s = stems[i]; - if (Stem::invisible_b (s)) - continue; - - knee |= dir != Directional_element_interface::get (s); - - Real stem_y = calc_stem_y_f (me, s, pos); - - stem_y *= dir; - Stem_info info = Stem::calc_stem_info (s); - - shorten = shorten ? info.miny_f_ - stem_y; - - if (info.idealy_f_ - stem_y > 0) - { -#if 0 - ideal_lengthen += info.idealy_f_ - stem_y; - ideal_lengthen_count++; -#else - ideal_lengthen = ideal_lengthen >? info.idealy_f_ - stem_y; - ideal_lengthen_count = 1; -#endif - } - else if (info.idealy_f_ - stem_y < 0) - { -#if 0 - ideal_shorten += info.idealy_f_ - stem_y; - ideal_shorten_count++; -#else - ideal_shorten = ideal_shorten warning (_ ("weird beam vertical offset")); - - if (ideal_lengthen_count) - lengthen = (ideal_lengthen / ideal_lengthen_count) >? lengthen; - if (knee && ideal_shorten_count) - shorten = (ideal_shorten / ideal_shorten_count) use commonx if ((next - && !(next->relative_coordinate (0, X_AXIS) + && ! (next->relative_coordinate (0, X_AXIS) > here->relative_coordinate (0, X_AXIS))) || (prev - && !(prev->relative_coordinate (0, X_AXIS) + && ! (prev->relative_coordinate (0, X_AXIS) < here->relative_coordinate (0, X_AXIS)))) programming_error ("Beams are not left-to-right"); - int multiplicity = get_multiplicity (me); - - SCM space_proc = me->get_grob_property ("space-function"); - SCM space = gh_call1 (space_proc, gh_int2scm (multiplicity)); - Real thick = gh_scm2double (me->get_grob_property ("thickness")); - Real interbeam_f = gh_scm2double (space); - - Real bdy = interbeam_f; + Real bdy = get_interbeam (me); Molecule leftbeams; Molecule rightbeams; @@ -1311,7 +1105,7 @@ Beam::brew_molecule (SCM smob) String str; if (1) { - str += to_str (gh_scm2int (me->get_grob_property ("best-idx"))); + str += to_str (gh_scm2int (me->get_grob_property ("best-idx"))); str += ":"; } str += to_str (gh_scm2double (me->get_grob_property ("quant-score")), @@ -1319,7 +1113,7 @@ Beam::brew_molecule (SCM smob) SCM properties = Font_interface::font_alist_chain (me); - Molecule tm = Text_item::text2molecule (me, gh_str02scm (str.ch_C()), properties); + Molecule tm = Text_item::text2molecule (me, gh_str02scm (str.ch_C ()), properties); mol.add_at_edge (Y_AXIS, UP, tm, 5.0); } @@ -1440,7 +1234,7 @@ Beam::rest_collision_callback (SCM element_smob, SCM axis) Direction d = Stem::get_direction (stem); Real beamy = (stem->relative_coordinate (0, X_AXIS) - x0) * dydx + pos[LEFT]; - Real staff_space = Staff_symbol_referencer::staff_space (rest); + Real staff_space = Staff_symbol_referencer::staff_space (rest); Real rest_dim = rest->extent (rest, Y_AXIS)[d]*2.0 / staff_space; // refp?? diff --git a/lily/include/beam.hh b/lily/include/beam.hh index 86c539d8ff..7e217ce035 100644 --- a/lily/include/beam.hh +++ b/lily/include/beam.hh @@ -25,6 +25,7 @@ public: static void set_beaming (Grob*,Beaming_info_list *); static void set_stemlens (Grob*); static int get_multiplicity (Grob*me); + static Real get_interbeam (Grob*me); DECLARE_SCHEME_CALLBACK (brew_molecule, (SCM )); DECLARE_SCHEME_CALLBACK (before_line_breaking, (SCM )); DECLARE_SCHEME_CALLBACK (after_line_breaking, (SCM )); @@ -34,8 +35,7 @@ public: DECLARE_SCHEME_CALLBACK (least_squares, (SCM)); DECLARE_SCHEME_CALLBACK (check_concave, (SCM)); DECLARE_SCHEME_CALLBACK (slope_damping, (SCM)); - DECLARE_SCHEME_CALLBACK (quantise_position, (SCM)); - DECLARE_SCHEME_CALLBACK (new_quanting, (SCM)); + DECLARE_SCHEME_CALLBACK (quanting, (SCM)); DECLARE_SCHEME_CALLBACK (score_slopes_dy, (SCM, SCM,SCM)); DECLARE_SCHEME_CALLBACK (score_stem_lengths, (SCM, SCM,SCM)); DECLARE_SCHEME_CALLBACK (score_forbidden_quants, (SCM, SCM,SCM)); @@ -49,10 +49,8 @@ private: static void set_stem_directions (Grob*); static void consider_auto_knees (Grob*); static void set_stem_shorten (Grob*); - static Real calc_stem_y_f (Grob*, Item* s, Interval pos); - static Real check_stem_length_f (Grob*, Interval pos); + static Real calc_stem_y (Grob*, Item* s, Interval pos); static void set_stem_lengths (Grob*); - static Interval quantise_interval (Grob*, Interval pos, Direction quant_dir); static int forced_stem_count (Grob*); }; diff --git a/lily/include/stem-info.hh b/lily/include/stem-info.hh index d4496a442d..f3b15715c1 100644 --- a/lily/include/stem-info.hh +++ b/lily/include/stem-info.hh @@ -19,11 +19,11 @@ */ struct Stem_info { - Real idealy_f_; + Real ideal_y; // fixme: we're an Interval! - Real miny_f_; - Real maxy_f_; + Real min_y; + Real max_y; }; #endif // STEM_INFO_HH diff --git a/lily/stem-tremolo.cc b/lily/stem-tremolo.cc index a4389db481..597b7962f7 100644 --- a/lily/stem-tremolo.cc +++ b/lily/stem-tremolo.cc @@ -104,17 +104,13 @@ Stem_tremolo::brew_molecule (SCM smob) // huh? tremolo_flags = 1; - int mult = beam ? Beam::get_multiplicity (beam) : 0; - SCM space_proc = me->get_grob_property ("beam-space-function"); - SCM space = gh_call1 (space_proc, gh_int2scm (mult)); - Real interbeam_f = gh_scm2double (space) * ss; - + Real interbeam = beam ? Beam::get_interbeam (beam) : 0.81; Molecule mol; for (int i = 0; i < tremolo_flags; i++) { Molecule b (a); - b.translate_axis (interbeam_f * i, Y_AXIS); + b.translate_axis (interbeam * i, Y_AXIS); mol.add_molecule (b); } if (tremolo_flags) @@ -122,10 +118,13 @@ Stem_tremolo::brew_molecule (SCM smob) if (beam) { // ugh, rather calc from Stem_tremolo_req - int beams_i = Stem::beam_count (stem, RIGHT) >? Stem::beam_count (stem, LEFT); - mol.translate (Offset (stem->relative_coordinate (0, X_AXIS) - me->relative_coordinate (0, X_AXIS), - Stem::stem_end_position (stem) * ss / 2 - - Directional_element_interface::get (beam) * beams_i * interbeam_f)); + int beams_i = Stem::beam_count (stem, RIGHT) + >? Stem::beam_count (stem, LEFT); + mol.translate (Offset (stem->relative_coordinate (0, X_AXIS) + - me->relative_coordinate (0, X_AXIS), + Stem::stem_end_position (stem) * ss / 2 - + Directional_element_interface::get (beam) + * beams_i * interbeam)); } else { @@ -148,7 +147,8 @@ Stem_tremolo::brew_molecule (SCM smob) else whole_note_correction = 0; - mol.translate (Offset (stem->relative_coordinate (0, X_AXIS) - me->relative_coordinate (0, X_AXIS) + + mol.translate (Offset (stem->relative_coordinate (0, X_AXIS) + - me->relative_coordinate (0, X_AXIS) + whole_note_correction, dy)); } diff --git a/lily/stem.cc b/lily/stem.cc index 3268f31bca..615417116c 100644 --- a/lily/stem.cc +++ b/lily/stem.cc @@ -666,9 +666,9 @@ Stem::calc_stem_info (Grob*me) { Stem_info si ; - si.idealy_f_ = gh_scm2double (gh_car (scm_info)); - si.maxy_f_ = gh_scm2double (gh_cadr (scm_info)); - si.miny_f_ = gh_scm2double (gh_caddr (scm_info)); + si.ideal_y = gh_scm2double (gh_car (scm_info)); + si.max_y = gh_scm2double (gh_cadr (scm_info)); + si.min_y = gh_scm2double (gh_caddr (scm_info)); return si; } @@ -685,19 +685,16 @@ Stem::calc_stem_info (Grob*me) Real staff_space = Staff_symbol_referencer::staff_space (me); Real half_space = staff_space / 2; + int multiplicity = Beam::get_multiplicity (beam); - - - SCM space_proc = beam->get_grob_property ("space-function"); - SCM space = gh_call1 (space_proc, gh_int2scm (multiplicity)); - Real interbeam_f = gh_scm2double (space) * staff_space; + Real interbeam_f = Beam::get_interbeam (beam); Real thick = gh_scm2double (beam->get_grob_property ("thickness")); Stem_info info; - info.idealy_f_ = chord_start_f (me); + info.ideal_y = chord_start_f (me); // for simplicity, we calculate as if dir == UP - info.idealy_f_ *= beam_dir; + info.ideal_y *= beam_dir; SCM grace_prop = me->get_grob_property ("grace"); bool grace_b = to_boolean (grace_prop); @@ -725,13 +722,13 @@ Stem::calc_stem_info (Grob*me) { if (multiplicity) { - info.idealy_f_ += thick + (multiplicity - 1) * interbeam_f; + info.ideal_y += thick + (multiplicity - 1) * interbeam_f; } - info.miny_f_ = info.idealy_f_; - info.maxy_f_ = 1000; // INT_MAX; + info.min_y = info.ideal_y; + info.max_y = 1000; // INT_MAX; - info.idealy_f_ += stem_length; - info.miny_f_ += minimum_length; + info.ideal_y += stem_length; + info.min_y += minimum_length; /* lowest beam of (UP) beam must never be lower than second staffline @@ -750,8 +747,8 @@ Stem::calc_stem_info (Grob*me) staffline lowest beam of (UP) beam must never be lower than second staffline */ - info.miny_f_ = - info.miny_f_ >? 0 + info.min_y = + info.min_y >? 0 >? (- 2 * half_space - thick + (multiplicity > 0) * thick + interbeam_f * (multiplicity - 1)); @@ -760,33 +757,33 @@ Stem::calc_stem_info (Grob*me) else /* knee */ { - info.idealy_f_ -= thick; - info.maxy_f_ = info.idealy_f_; - info.miny_f_ = - 1000 ; // INT_MAX; + info.ideal_y -= thick; + info.max_y = info.ideal_y; + info.min_y = - 1000 ; // INT_MAX; - info.idealy_f_ -= stem_length; - info.maxy_f_ -= minimum_length; + info.ideal_y -= stem_length; + info.max_y -= minimum_length; } - info.idealy_f_ = (info.maxy_f_ ? info.miny_f_; + info.ideal_y = (info.max_y ? info.min_y; s = beam->get_grob_property ("shorten"); if (gh_number_p (s)) - info.idealy_f_ -= gh_scm2double (s); + info.ideal_y -= gh_scm2double (s); - Grob *common = me->common_refpoint (beam, Y_AXIS); + Grob *common = me->common_refpoint (beam, Y_AXIS); Real interstaff_f = beam_dir * - (me->relative_coordinate (common, Y_AXIS) + (me->relative_coordinate (common, Y_AXIS) - beam->relative_coordinate (common, Y_AXIS)); - - info.idealy_f_ += interstaff_f; - info.miny_f_ += interstaff_f; - info.maxy_f_ += interstaff_f ; + + info.ideal_y += interstaff_f; + info.min_y += interstaff_f; + info.max_y += interstaff_f ; me->set_grob_property ("stem-info", - scm_list_n (gh_double2scm (info.idealy_f_), - gh_double2scm (info.maxy_f_ ), - gh_double2scm (info.miny_f_), + scm_list_n (gh_double2scm (info.ideal_y), + gh_double2scm (info.max_y), + gh_double2scm (info.min_y), SCM_UNDEFINED)); return info; diff --git a/scm/beam.scm b/scm/beam.scm index 4ab5e2eb4b..f3d0de9951 100644 --- a/scm/beam.scm +++ b/scm/beam.scm @@ -6,10 +6,6 @@ ;;;; (c) 2000--2001 Jan Nieuwenhuizen ;;;; -(define (default-beam-space-function multiplicity) - (if (<= multiplicity 3) 0.816 0.844) - ) - ;; ;; width in staff space. ;; @@ -17,117 +13,21 @@ (cond ((eq? type 1) 1.98) ((eq? type 1) 1.65) ;; FIXME: check what this should be and why - (else 1.32) - )) - - -;; This is a mess : global namespace pollution. We should wait -;; till guile has proper toplevel environment support. - - -;; Beams should be prevented to conflict with the stafflines, -;; especially at small slopes -;; ---------------------------------------------------------- -;; ######## -;; ######## -;; ######## -;; --------------########------------------------------------ -;; ######## -;; -;; hang straddle sit inter hang - -;; inter seems to be a modern quirk, we don't use that - -;; two popular veritcal beam quantings -;; see params.ly: #'beam-vertical-quants - - -(define (default-beam-pos-quants beam multiplicity dy staff-line) - (let* ((beam-straddle 0) - (thick (ly-get-grob-property beam 'thickness)) - (beam-sit (/ (- thick staff-line) 2)) - (beam-hang (- 1 (/ (- thick staff-line) 2))) - (quants (list beam-hang)) - ) - - (if (or (<= multiplicity 1) (>= (abs dy) (/ staff-line 2))) - (set! quants (cons beam-sit quants))) - (if (or (<= multiplicity 2) (>= (abs dy) (/ staff-line 2))) - (set! quants (cons beam-straddle quants))) - ;; period: 1 (staff-space) - (append quants (list (+ 1 (car quants)))))) - -(define (default-left-beam-pos-quants beam multiplicity dir dy staff-line) - (default-beam-pos-quants beam multiplicity 1 staff-line)) -;; -(define (foo beam multiplicity dir dy staff-line) - (let* ((beam-straddle 0) - (thick (ly-get-grob-property beam 'thickness)) - (beam-sit (/ (- thick staff-line) 2)) - (beam-hang (- 1 (/ (- thick staff-line) 2))) - (quants '()) - ) - - (if (or (<= multiplicity 1) - (and (not (equal? dir 1)) - (not (< dy 0)))) - (set! quants (cons beam-sit quants))) - (if (or (<= multiplicity 1) - (and (not (equal? dir -1)) - (not (> dy 0)))) - (set! quants (cons beam-hang quants))) - (if (or (<= multiplicity 2) (>= (abs dy) (/ staff-line 2))) - (set! quants (cons beam-straddle quants))) - ;; period: 1 (staff-space) - (append quants (list (+ 1 (car quants)))))) - -(define (default-right-beam-pos-quants beam multiplicity dir dy staff-line) - (default-beam-pos-quants beam multiplicity 1 staff-line)) -;; -(define (foo beam multiplicity dir dy staff-line) - (let* ((beam-straddle 0) - (thick (ly-get-grob-property beam 'thickness)) - (beam-sit (/ (- thick staff-line) 2)) - (beam-hang (- 1 (/ (- thick staff-line) 2))) - (quants '()) - ) - - - (if (or (<= multiplicity 1) - (and (not (equal? dir 1)) - (not (> dy 0)))) - (set! quants (cons beam-sit quants))) - (if (or (<= multiplicity 1) - (and (not (equal? dir -1)) - (not (< dy 0)))) - (set! quants (cons beam-hang quants))) - (if (or (<= multiplicity 2) (>= (abs dy) (/ staff-line 2))) - (set! quants (cons beam-straddle quants))) - ;; period: 1 (staff-space) - (append quants (list (+ 1 (car quants)))))) - -(define (beam-traditional-pos-quants beam multiplicity dy staff-line) - (let* ((beam-straddle 0) - (thick (ly-get-grob-property beam 'thickness)) - (beam-sit (/ (- thick staff-line) 2)) - (beam-hang (- 1 (/ (- thick staff-line) 2))) - (quants '()) - ) - (if (>= dy (/ staff-line -2)) - (set! quants (cons beam-hang quants))) - (if (and (<= multiplicity 1) (<= dy (/ staff-line 2))) - (set! quants (cons beam-sit quants))) - (if (or (<= multiplicity 2) (>= (abs dy) (/ staff-line 2))) - (set! quants (cons beam-straddle quants))) - ;; period: 1 (staff-space) - (append quants (list (+ 1 (car quants)))))) - + (else 1.32))) ;; There are several ways to calculate the direction of a beam ;; ;; * majority: number count of up or down notes ;; * mean : mean centre distance of all notes ;; * median : mean centre distance weighted per note +;; +;; [Ross] states that the majority of the notes dictates the +;; direction (and not the mean of "center distance") +;; +;; But is that because it really looks better, or because he wants +;; to provide some real simple hands-on rules? +;; +;; We have our doubts, so we simply provide all sensible alternatives. (define (dir-compare up down) (sign (- up down))) @@ -147,21 +47,3 @@ (dir-compare (/ (car total) (car count)) (/ (cdr total) (cdr count))) (dir-compare (car count) (cdr count)))) - - -;; [Ross] states that the majority of the notes dictates the -;; direction (and not the mean of "center distance") -;; -;; But is that because it really looks better, or because he wants -;; to provide some real simple hands-on rules? -;; -;; We have our doubts, so we simply provide all sensible alternatives. - -;; array index multiplicity, last if index>size -;; beamed stems - - -;; TODO -;; - take #forced stems into account (now done in C++)? -;; - take staff-position of chord or beam into account - diff --git a/scm/grob-description.scm b/scm/grob-description.scm index d6e3d431a2..84e7e1860c 100644 --- a/scm/grob-description.scm +++ b/scm/grob-description.scm @@ -5,10 +5,10 @@ ;;;; (c) 1998--20.301 Han-Wen Nienhuys ;;;; Jan Nieuwenhuizen - ; distances are given in stafflinethickness (thicknesses) and - ; staffspace (distances) +;;;; distances are given in stafflinethickness (thicknesses) and +;;;; staffspace (distances) -;;; WARNING: the meta field should be the last one. +;;;; WARNING: the meta field should be the last one. ;; TODO: junk the meta field in favor of something more compact? (define all-grob-descriptions @@ -103,29 +103,26 @@ (position-callbacks . (,Beam::least_squares ,Beam::check_concave ,Beam::slope_damping - ,Beam::new_quanting + ,Beam::quanting )) (thickness . 0.48) ; in staff-space (before-line-breaking-callback . ,Beam::before_line_breaking) (after-line-breaking-callback . (,Beam::after_line_breaking ,Beam::end_after_line_breaking)) + (quant-score-functions . (,Beam::score_forbidden_quants + ,Beam::score_slopes_dy + ,Beam::score_stem_lengths + )) (neutral-direction . -1) (dir-function . ,beam-dir-majority) - (left-position-quant-function . ,default-left-beam-pos-quants) - (right-position-quant-function . ,default-right-beam-pos-quants) (beamed-stem-shorten . (1.0 0.5)) (outer-stem-length-limit . 0.2) (slope-limit . 0.2) (flag-width-function . ,default-beam-flag-width-function) - (space-function . ,default-beam-space-function) (damping . 1) (auto-knee-gap . 7) (font-name . "cmr10") - (quant-score-functions . (,Beam::score_forbidden_quants - ,Beam::score_slopes_dy - ,Beam::score_stem_lengths - )) (meta . ,(grob-description beam-interface)) )) @@ -773,8 +770,7 @@ (X-extent-callback . #f) (beam-width . 2.0) ; staff-space - (beam-thickness . 0.42) ; staff-space - (beam-space-function . ,default-beam-space-function) + (beam-thickness . 0.48) ; staff-space (meta . ,(grob-description stem-tremolo-interface )) )) diff --git a/scm/grob-property-description.scm b/scm/grob-property-description.scm index aac832b584..f10f85ab9c 100644 --- a/scm/grob-property-description.scm +++ b/scm/grob-property-description.scm @@ -67,7 +67,6 @@ In the case of alignment grobs, this should contain only one number.") (grob-property-description 'baseline-skip number? "Baseline skip to use for multiple lines of text.") (grob-property-description 'bass list? " musical-pitch, optional.") (grob-property-description 'beam ly-grob? "pointer to the beam, if applicable.") -(grob-property-description 'beam-space-function procedure? "function returning space given multiplicity.") (grob-property-description 'beam-thickness number? "thickness, measured in staffspace.") (grob-property-description 'beam-width number? "width of the tremolo sign.") (grob-property-description 'beamAuto boolean? "enable autobeaming?.") @@ -199,8 +198,6 @@ FIXME: in Tie this is a pair of grob pointers, pointing to the two heads of the .") (grob-property-description 'height number? "in staffspace.") -(grob-property-description 'height-quants procedure? "function of type (beam staff-line-thickness) -> list of quants. Default value: default-beam-dy-quants. -.") (grob-property-description 'horizontal-shift integer? "integer that identifies ranking of note-column for horizontal shifting. This is used by @ref{note-collision-interface}.") (grob-property-description 'horizontal-space number? "amount of space to add after a note (in staff-space).") (grob-property-description 'ideal-distances list? "(OBJ . (DIST . STRENGTH)) pairs.") @@ -310,8 +307,6 @@ spacing tuples: format = (SYMBOL . (TYPE . DISTANCE)), where TYPE can be minimum-space or extra-space.") (grob-property-description 'space-factor number? "Scale horizontal spacing up by this amount.") - -(grob-property-description 'space-function procedure? "function of type multiplicity -> real (in staffspace).") (grob-property-description 'spacing-procedure procedure? "procedure taking grob as argument. This is called after before-line-breaking-callback, but before the actual line breaking @@ -415,9 +410,6 @@ print only if there is no beam associated with this tuplet bracket.") (grob-property-description 'tuplet-number-visibility boolean-or-symbol? " Like @code{tuplet-bracket-visibility}, but for the number.") (grob-property-description 'type symbol? "one of: line, dashed-line or dotted-line.") -(grob-property-description 'vertical-position-quant-function procedure? " -function of type (beam multiplicity dy staff-line-thickness) -> real. Default value: default-beam-y-quants, also available: beam-traditional-y-quants. -.") (grob-property-description 'visibility-lambda procedure? "a function that takes the break direction and returns a cons of booleans containing (TRANSPARENT . EMPTY).") (grob-property-description 'when moment? "when does this column happen?.") (grob-property-description 'word-space number? "elongate left by this much (FIXME: cumbersome semantics).") diff --git a/scm/interface-description.scm b/scm/interface-description.scm index 38499a65b4..8bfbf86109 100644 --- a/scm/interface-description.scm +++ b/scm/interface-description.scm @@ -80,9 +80,7 @@ outer-stem-length-limit positions slope-limit - space-function thickness - vertical-position-quant-function ) ) @@ -712,7 +710,7 @@ position 0." (lily-interface 'stem-tremolo-interface "" - '( stem beam-width beam-thickness beam-space-function + '( stem beam-width beam-thickness )) -- 2.39.2