From d46387e3c5a15a3dbb2c42f8bf20a107a2de11ff Mon Sep 17 00:00:00 2001 From: Han-Wen Nienhuys Date: Sat, 11 Sep 2004 17:28:24 +0000 Subject: [PATCH] * input/regression/phrasing-slur.ly (Module): remove (duplicate with phrasing-slur-slur-avoid.ly) * lily/slur-scoring.cc (struct Extra_collision_info): collect parameters for extra offset. (get_bezier): add slurs mid-points for curve determination (score_extra_encompass): add slur end points for scoring. --- ChangeLog | 10 ++ input/regression/auto-beam-no-beam.ly | 2 +- .../regression/multi-measure-rest-spacing.ly | 2 +- input/regression/phrasing-slur.ly | 16 -- lily/slur-scoring.cc | 141 +++++++++++++----- scm/slur.scm | 1 + 6 files changed, 120 insertions(+), 52 deletions(-) delete mode 100644 input/regression/phrasing-slur.ly diff --git a/ChangeLog b/ChangeLog index ebb9fa93f6..7636895559 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,13 @@ +2004-09-11 Han-Wen Nienhuys + + * input/regression/phrasing-slur.ly (Module): remove (duplicate + with phrasing-slur-slur-avoid.ly) + + * lily/slur-scoring.cc (struct Extra_collision_info): collect + parameters for extra offset. + (get_bezier): add slurs mid-points for curve determination + (score_extra_encompass): add slur end points for scoring. + 2004-09-11 Matthias Neeracher * scm/framework-ps.scm (reencode-font): Handling font scaling diff --git a/input/regression/auto-beam-no-beam.ly b/input/regression/auto-beam-no-beam.ly index ac170d5505..3bc146337b 100644 --- a/input/regression/auto-beam-no-beam.ly +++ b/input/regression/auto-beam-no-beam.ly @@ -11,4 +11,4 @@ raggedright = ##t } -{ c8 c-\noBeam c c } +\relative { c8 c-\noBeam c c } diff --git a/input/regression/multi-measure-rest-spacing.ly b/input/regression/multi-measure-rest-spacing.ly index 7be7c393af..a5bb87bb08 100644 --- a/input/regression/multi-measure-rest-spacing.ly +++ b/input/regression/multi-measure-rest-spacing.ly @@ -9,7 +9,7 @@ extra spacing column is created. This should not cause problems." << \set Score.skipBars = ##t \context Staff = flute \new Voice { - << { R1*40 } { s1*0^"bla" }>> + << { R1*40 } { s1*0_"bla" }>> } >> \paper { diff --git a/input/regression/phrasing-slur.ly b/input/regression/phrasing-slur.ly deleted file mode 100644 index 77c6a57d32..0000000000 --- a/input/regression/phrasing-slur.ly +++ /dev/null @@ -1,16 +0,0 @@ - -\version "2.3.4" - -\header { -texidoc="Ordinary slurs should work well with phrasing slur." -} - -\score { - \relative c'' { - \time 6/4 c\((d e) f(e d)\) - } - \paper { - raggedright = ##t - } -} - diff --git a/lily/slur-scoring.cc b/lily/slur-scoring.cc index 0eb5259b5c..56c6306e3d 100644 --- a/lily/slur-scoring.cc +++ b/lily/slur-scoring.cc @@ -27,6 +27,28 @@ #include "warn.hh" #include "paper-column.hh" +/* + TODO: + + - curve around flag for y coordinate + + - this file is a big mess, clean it up + + + - short-cut: try a smaller region first. + + - handle non-visible stems better. + + - try to prune number of scoring criteria + + - take encompass-objects more into account when determining + slur shape + + - calculate encompass scoring directly after determining slur shape. + + - optimize. + +*/ struct Slur_score { @@ -58,7 +80,7 @@ struct Slur_score_parameters Real max_slope_factor_; Real extra_object_collision_; Real accidental_collision_; - + Real free_slur_distance_; Real free_head_distance_; Real extra_encompass_free_distance_; @@ -70,14 +92,7 @@ struct Slur_score_parameters Slur_score_parameters (Grob*); }; -/* - TODO: - - curve around flag for y coordinate - - better scoring. - - short-cut: try a smaller region first. - - handle non-visible stems better. -*/ struct Encompass_info { Real x_; @@ -233,6 +248,8 @@ init_score_param (Grob *me, = get_detail (details, ly_symbol2scm ("head-slur-distance-factor")); score_param->head_slur_distance_max_ratio_ = get_detail (details, ly_symbol2scm ("head-slur-distance-max-ratio")); + score_param->free_slur_distance_ + = get_detail (details, ly_symbol2scm ("free-slur-distance")); } @@ -982,6 +999,26 @@ score_encompass (Grob *me, Grob *common[], } } +struct Extra_collision_info +{ + Real idx_; + Box extents_; + Real penalty_; + + Extra_collision_info (Real idx, Interval x, Interval y, Real p) + { + idx_ = idx; + extents_[X_AXIS] = x; + extents_[Y_AXIS] = y; + penalty_ = p; + } + Extra_collision_info () + { + idx_ = 0.0; + penalty_ = 0.; + } +}; + void score_extra_encompass (Grob *me, Grob *common[], Slur_score_parameters *score_param, @@ -992,6 +1029,8 @@ score_extra_encompass (Grob *me, Grob *common[], (void) base_attach; (void) extremes; + Spanner *me_spanner = dynamic_cast (me); + Link_array encompasses = Pointer_group_interface__extract_grobs (me, (Grob *)0, "encompass-objects"); @@ -999,24 +1038,44 @@ score_extra_encompass (Grob *me, Grob *common[], Real lt = me->get_paper ()->get_dimension (ly_symbol2scm ("linethickness")); Real thick = robust_scm2double (me->get_property ("thickness"), 1.0) * lt; - Array xidxs; - Array yexts; - Array xexts; - + Array collision_infos; for (int i = encompasses.size (); i--; ) { if (Slur::has_interface (encompasses[i])) { - Grob * small_slur = encompasses[i]; + Spanner * small_slur = dynamic_cast (encompasses[i]); Bezier b = Slur::get_curve (small_slur); - Offset z = b.curve_point (0.5); - z += Offset (small_slur->relative_coordinate (common[X_AXIS], X_AXIS), - small_slur->relative_coordinate (common[Y_AXIS], Y_AXIS)); + Offset relative (small_slur->relative_coordinate (common[X_AXIS], X_AXIS), + small_slur->relative_coordinate (common[Y_AXIS], Y_AXIS)); - xexts.push (Interval (z[X_AXIS], z[X_AXIS])); - xidxs.push (0.0); - yexts.push (z[Y_AXIS] + thick * Interval (-0.5, 0.5)); + for (int k = 0; k < 3; k++) + { + Direction hdir = Direction (k /2 - 1); + + /* + Only take bound into account if small slur starts + together with big slur. + */ + if (hdir && small_slur->get_bound (hdir) != me_spanner->get_bound (hdir)) + continue; + + + Offset z = b.curve_point ( k / 2.0); + z += relative; + + Interval yext; + yext.set_full(); + yext[dir] = z[Y_AXIS] + dir * thick * 1.0; + + Interval xext(-1, 1); + xext = xext *(thick*2) + z[X_AXIS]; + Extra_collision_info info (k - 1.0, + xext, + yext, + score_param->extra_object_collision_); + collision_infos.push (info); + } } else { @@ -1025,9 +1084,10 @@ score_extra_encompass (Grob *me, Grob *common[], Interval ye = g->extent (common[Y_AXIS], Y_AXIS); Real xp = 0.0; - + Real penalty = score_param->extra_object_collision_; if (Accidental_interface::has_interface (g)) { + penalty = score_param->accidental_collision_; /* Begin copy accidental.cc */ bool parens = false; if (to_boolean (g->get_property ("cautionary"))) @@ -1059,16 +1119,15 @@ score_extra_encompass (Grob *me, Grob *common[], } } - xidxs.push (xp); ye.widen (thick * 0.5); - yexts.push (ye); - xexts.push (xe); + Extra_collision_info info (xp, xe, ye, penalty); + collision_infos.push (info); } } for (int i = 0; i < scores->size (); i++) { Real demerit = 0.0; - for (int j = 0; j < xidxs.size(); j++) + for (int j = 0; j < collision_infos.size(); j++) { Drul_array at = scores->elem (i).attachment_; Interval slur_wid (at[LEFT][X_AXIS], at[RIGHT][X_AXIS]); @@ -1078,15 +1137,17 @@ score_extra_encompass (Grob *me, Grob *common[], Bezier::get_other_coordinate(). */ slur_wid.widen (- 0.5 * thick); - Real x = xexts[j].linear_combination (xidxs[j]); + Real x = collision_infos[j].extents_[X_AXIS] + .linear_combination (collision_infos[j].idx_); Real y = 0.0; + if (!slur_wid.contains (x)) { Direction contains_dir = CENTER; Direction d = LEFT; do { - if (xexts[j].contains (at[d][X_AXIS])) + if (collision_infos[j].extents_[X_AXIS].contains (at[d][X_AXIS])) contains_dir = d; } while (flip (&d) != LEFT); @@ -1101,15 +1162,11 @@ score_extra_encompass (Grob *me, Grob *common[], y = scores->elem (i).curve_.get_other_coordinate (X_AXIS, x); } - Real collision_demerit = - (Accidental_interface::has_interface (encompasses[j])) - ? score_param->accidental_collision_ - : score_param->extra_object_collision_; - - Real dist = yexts[j].distance (y); + Real dist = collision_infos[j].extents_[Y_AXIS].distance (y); demerit += fabs (0 >? (score_param->extra_encompass_free_distance_ - dist)) / - score_param->extra_encompass_free_distance_ * collision_demerit; + score_param->extra_encompass_free_distance_ + * collision_infos[j].penalty_; } #if DEBUG_SLUR_QUANTING (*scores)[i].score_card_ += to_string ("X%.2f", demerit); @@ -1270,7 +1327,7 @@ get_bezier (Grob *me, = Pointer_group_interface__extract_grobs (me, (Grob *)0, "note-columns"); Direction dir = get_grob_direction (me); - Array avoid; + Array avoid; for (int i = 0; i < encompasses.size(); i++) { if (extremes[LEFT].note_column_ == encompasses[i] @@ -1283,6 +1340,22 @@ get_bezier (Grob *me, avoid.push (Offset (inf.x_, y + dir * score_param->free_head_distance_)); } + + Link_array extra_encompasses + = Pointer_group_interface__extract_grobs (me, (Grob *)0, "encompass-objects"); + for (int i = 0; i < extra_encompasses.size (); i++) + if (Slur::has_interface (extra_encompasses[i])) + { + Grob * small_slur = extra_encompasses[i]; + Bezier b = Slur::get_curve (small_slur); + + Offset z = b.curve_point (0.5); + z += Offset (small_slur->relative_coordinate (common[X_AXIS], X_AXIS), + small_slur->relative_coordinate (common[Y_AXIS], Y_AXIS)); + + z[Y_AXIS] += dir * score_param->free_slur_distance_; + avoid.push (z); + } Offset dz = attachments[RIGHT]- attachments[LEFT];; Offset dz_unit = dz; diff --git a/scm/slur.scm b/scm/slur.scm index 943e6dd61e..0213fdf738 100644 --- a/scm/slur.scm +++ b/scm/slur.scm @@ -19,6 +19,7 @@ (max-slope . 1.1) (max-slope-factor . 10) (free-head-distance . 0.3) + (free-slur-distance . 0.8) (extra-object-collision . 50) (accidental-collision . 3) (extra-encompass-free-distance . 0.3) -- 2.39.5