#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"
const int MUSICAL_DIRECTION_FACTOR = 400;
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)
Grob *me = unsmob_grob (smob);
SCM s = me->get_property ("positions");
- Real yl = ly_scm2double (ly_car (s));
- Real yr = ly_scm2double (ly_cdr (s));
+ Real yl = scm_to_double (ly_car (s));
+ Real yr = scm_to_double (ly_cdr (s));
/*
Real slt = Staff_symbol_referencer::line_thickness (me) / ss;
SCM sdy = me->get_property ("least-squares-dy");
- Real dy_mus = ly_number_p (sdy) ? ly_scm2double (sdy) : 0.0;
+ Real dy_mus = scm_is_number (sdy) ? scm_to_double (sdy) : 0.0;
Real straddle = 0.0;
Real sit = (thickness - slt) / 2;
#if DEBUG_QUANTING
SCM inspect_quants = me->get_property ("inspect-quants");
- if (debug_beam_quanting_flag
- && ly_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<Real> ins = ly_scm2interval (inspect_quants);
#endif
me->set_property ("positions",
- ly_interval2scm (Drul_array<Real> (qscores[best_idx].yl,
- qscores[best_idx].yr)));
+ ly_interval2scm (Drul_array<Real> (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
dem += shrink_extra_weight (fabs (dy_damp) - fabs (dy), 1.5)
* slope_penalty;
-#if 0
- /*
- almost zero slopes look like errors in horizontal beams.
- */
- /*
- This causes too much problems, because horizontal depends on
- horizontal spacing details. These errors should be dealt with
- through concaveness. --hwn.
- */
- if (fabs (dy) > 1e-3
- && fabs (dy / dx) < ROUND_TO_ZERO_SLOPE)
- dem += ROUND_TO_ZERO_POINTS;
-#endif
-
return dem;
}
+
static Real
my_modf (Real x)
{
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);
for (Real k = - radius ;
k <= radius + BEAM_EPS; k += 1.0)
if (gap.contains (k))
- dem += extra_demerit;
+ {
+ Real dist = fabs (gap[UP]-k) <? fabs (gap[DOWN] - k);
+
+ /*
+ this parameter is tuned to grace-stem-length.ly
+ */
+ Real fixed_demerit = 0.4;
+
+ dem += extra_demerit
+ * (fixed_demerit +
+ (1-fixed_demerit) * (dist / gap.length())* 2);
+ }
}
}
while ((flip (&d))!= LEFT);