X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fbeam-quanting.cc;h=c329bafcc505eb03dee17434b59f0383439cd000;hb=faaee71fb44c8e1040239797aad336f4e46c2c21;hp=c752512a76d3586a4bbd92d00300d171ef28b8b7;hpb=947454c5cc430a9627262de4f25274a64789d3c2;p=lilypond.git diff --git a/lily/beam-quanting.cc b/lily/beam-quanting.cc index c752512a76..c329bafcc5 100644 --- a/lily/beam-quanting.cc +++ b/lily/beam-quanting.cc @@ -19,7 +19,7 @@ #include "staff-symbol-referencer.hh" #include "beam.hh" #include "stem.hh" -#include "paper-def.hh" +#include "output-def.hh" #include "group-interface.hh" #include "align-interface.hh" @@ -40,8 +40,6 @@ const int IDEAL_SLOPE_FACTOR = 10; const Real ROUND_TO_ZERO_SLOPE = 0.02; const int ROUND_TO_ZERO_POINTS = 4; -extern bool debug_beam_quanting_flag; - static Real shrink_extra_weight (Real x, Real fac) { @@ -96,8 +94,8 @@ Beam::quanting (SCM smob) Grob *me = unsmob_grob (smob); SCM s = me->get_property ("positions"); - Real yl = gh_scm2double (gh_car (s)); - Real yr = gh_scm2double (gh_cdr (s)); + Real yl = scm_to_double (ly_car (s)); + Real yr = scm_to_double (ly_cdr (s)); /* @@ -110,7 +108,7 @@ Beam::quanting (SCM smob) Real slt = Staff_symbol_referencer::line_thickness (me) / ss; SCM sdy = me->get_property ("least-squares-dy"); - Real dy_mus = gh_number_p (sdy) ? gh_scm2double (sdy) : 0.0; + Real dy_mus = ly_c_number_p (sdy) ? scm_to_double (sdy) : 0.0; Real straddle = 0.0; Real sit = (thickness - slt) / 2; @@ -281,8 +279,8 @@ Beam::quanting (SCM smob) #if DEBUG_QUANTING SCM inspect_quants = me->get_property ("inspect-quants"); - if (debug_beam_quanting_flag - && gh_pair_p (inspect_quants)) + if (to_boolean (me->get_paper ()->lookup_variable (ly_symbol2scm ("debug-beam-quanting"))) + && ly_c_pair_p (inspect_quants)) { Drul_array ins = ly_scm2interval (inspect_quants); @@ -304,16 +302,16 @@ Beam::quanting (SCM smob) #endif me->set_property ("positions", - ly_interval2scm (Drul_array (qscores[best_idx].yl, - qscores[best_idx].yr))); + ly_interval2scm (Drul_array (qscores[best_idx].yl, + qscores[best_idx].yr))); #if DEBUG_QUANTING - if (debug_beam_quanting_flag) + if (to_boolean (me->get_paper ()->lookup_variable (ly_symbol2scm ("debug-beam-quanting")))) { qscores[best_idx].score_card_ += to_string ("i%d", best_idx); // debug quanting me->set_property ("quant-score", - scm_makfrom0str (qscores[best_idx].score_card_.to_str0 ())); + scm_makfrom0str (qscores[best_idx].score_card_.to_str0 ())); } #endif @@ -453,31 +451,24 @@ Beam::score_forbidden_quants (Real yl, Real yr, Real extra_demerit = SECONDARY_BEAM_DEMERIT / (beam_counts[LEFT] >? beam_counts[RIGHT]); - /* - Inside the staff, inter quants are forbidden. - */ - Real dem = 0.0; Direction d = LEFT; - do - { - if (fabs (y[d]) <= (radius + 0.5) && fabs (my_modf (y[d]) - 0.5) < BEAM_EPS) - dem += INTER_QUANT_PENALTY; - } - while ((flip (&d))!= LEFT); - + Real dem = 0.0; + do { for (int j = 1; j <= beam_counts[d]; j++) { - /* - see if the outer staffline falls in a beam-gap - - This test is too weak; we should really check all lines. - */ Direction stem_dir = dirs[d]; - Real gap1 = y[d] - stem_dir * ((j-1) * beam_translation + thickness / 2 - slt/2 ); - Real gap2 = y[d] - stem_dir * (j * beam_translation - thickness / 2 + slt/2); + + /* + The 2.2 factor is to provide a little leniency for + borderline cases. If we do 2.0, then the upper outer line + will be in the gap of the (2,sit) quant, leading to a + false demerit. + */ + Real gap1 = y[d] - stem_dir * ((j-1) * beam_translation + thickness / 2 - slt/2.2 ); + Real gap2 = y[d] - stem_dir * (j * beam_translation - thickness / 2 + slt/2.2); Interval gap; gap.add_point (gap1); @@ -486,7 +477,18 @@ Beam::score_forbidden_quants (Real yl, Real yr, for (Real k = - radius ; k <= radius + BEAM_EPS; k += 1.0) if (gap.contains (k)) - dem += extra_demerit; + { + Real dist = fabs (gap[UP]-k)