From: Han-Wen Nienhuys Date: Sat, 28 Aug 2004 11:18:49 +0000 (+0000) Subject: * lily/slur-quanting.cc (init_score_param): read scoring X-Git-Tag: release/2.3.13~15 X-Git-Url: https://git.donarmstrong.com/?a=commitdiff_plain;h=c7beb546eb6b3340f481d4d030cf4cf72540c3dd;p=lilypond.git * lily/slur-quanting.cc (init_score_param): read scoring parameters from slur-details property * scm/define-grobs.scm (all-grob-descriptions): add inside-slur to Accidental --- diff --git a/ChangeLog b/ChangeLog index fb45b7e89f..885e52087a 100644 --- a/ChangeLog +++ b/ChangeLog @@ -6,6 +6,12 @@ 2004-08-28 Han-Wen Nienhuys + * lily/slur-quanting.cc (init_score_param): read scoring + parameters from slur-details property + + * scm/define-grobs.scm (all-grob-descriptions): add inside-slur to + Accidental + * Documentation/user/advanced.itely: removed. * Documentation/user/programming-interface.itely (How markups work diff --git a/input/regression/new-slur.ly b/input/regression/new-slur.ly index fa26940ab7..bf12cc0263 100644 --- a/input/regression/new-slur.ly +++ b/input/regression/new-slur.ly @@ -51,5 +51,6 @@ s2.| e4( dis4) e4( dis4) + g='16( b d fis) } diff --git a/lily/accidental.cc b/lily/accidental.cc index def53e5a03..cbb0fc1202 100644 --- a/lily/accidental.cc +++ b/lily/accidental.cc @@ -230,7 +230,10 @@ Accidental_interface::print (SCM smob) } - +/* + TODO: should move inside-slur into item? + + */ ADD_INTERFACE (Accidental_interface, "accidental-interface", "a single accidental", - "cautionary cautionary-style style tie accidentals"); + "inside-slur cautionary cautionary-style style tie accidentals"); diff --git a/lily/slur-quanting.cc b/lily/slur-quanting.cc index 8c704e084f..a750086ccd 100644 --- a/lily/slur-quanting.cc +++ b/lily/slur-quanting.cc @@ -51,22 +51,22 @@ struct Slur_score */ struct Slur_score_parameters { - int SLUR_REGION_SIZE; - Real HEAD_ENCOMPASS_PENALTY; - Real STEM_ENCOMPASS_PENALTY; - Real CLOSENESS_FACTOR; - Real EDGE_ATTRACTION_FACTOR; - Real SAME_SLOPE_PENALTY; - Real STEEPER_SLOPE_FACTOR; - Real NON_HORIZONTAL_PENALTY; - Real HEAD_STRICT_FREE_SPACE; - Real MAX_SLOPE; - Real MAX_SLOPE_FACTOR; - Real EXTRA_OBJECT_COLLISION; - Real ACCIDENTAL_COLLISION; - Real FREE_HEAD_DISTANCE; - Real EXTRA_ENCOMPASS_FREE_DISTANCE; - Slur_score_parameters (); + int slur_region_size_; + Real head_encompass_penalty_; + Real stem_encompass_penalty_; + Real closeness_factor_; + Real edge_attraction_factor_; + Real same_slope_penalty_; + Real steeper_slope_factor_; + Real non_horizontal_penalty_; + Real head_strict_free_space_; + Real max_slope_; + Real max_slope_factor_; + Real extra_object_collision_; + Real accidental_collision_; + Real free_head_distance_; + Real extra_encompass_free_distance_; + Slur_score_parameters (Grob*); }; /* @@ -160,7 +160,7 @@ static void generate_curves (Grob *me, Drul_array base_attach, Array *scores); static Array enumerate_attachments -(Grob *me, Grob *common[], Slur_score_parameters *score_param, +(Grob *me, Grob *common[], Slur_score_parameters*, Drul_array extremes, Drul_array base_attachment, Drul_array end_ys); static Drul_array get_base_attachments @@ -169,29 +169,59 @@ static Drul_array get_y_attachment_range (Spanner *sp, Grob **common, Drul_array extremes, Drul_array base_attachment); + +Real +get_detail (SCM alist, SCM sym) +{ + SCM entry = scm_assq (sym, alist); + return robust_scm2double (ly_c_pair_p (entry) + ? ly_cdr (entry) + : SCM_EOL, + 0.0); +} + void -init_score_param (Slur_score_parameters *score_param) +init_score_param (Grob *me, + Slur_score_parameters *score_param) { - score_param->SLUR_REGION_SIZE = 5; - score_param->HEAD_ENCOMPASS_PENALTY = 1000.0; - score_param->STEM_ENCOMPASS_PENALTY = 30.0; - score_param->CLOSENESS_FACTOR = 10; - score_param->EDGE_ATTRACTION_FACTOR = 4; - score_param->SAME_SLOPE_PENALTY = 20; - score_param->STEEPER_SLOPE_FACTOR = 50; - score_param->NON_HORIZONTAL_PENALTY = 15; - score_param->HEAD_STRICT_FREE_SPACE = 0.2; - score_param->MAX_SLOPE = 1.1; - score_param->MAX_SLOPE_FACTOR = 10; - score_param->FREE_HEAD_DISTANCE = 0.3; - score_param->EXTRA_OBJECT_COLLISION = 50; - score_param->ACCIDENTAL_COLLISION = 3; - score_param->EXTRA_ENCOMPASS_FREE_DISTANCE = 0.5; + SCM details = me->get_property ("slur-details"); + + score_param->slur_region_size_ + = (int) get_detail (details, ly_symbol2scm ("slur-region-size")); + score_param->head_encompass_penalty_ + = get_detail (details, ly_symbol2scm ("head-encompass-penalty")); + score_param->stem_encompass_penalty_ + = get_detail (details, ly_symbol2scm ("stem-encompass-penalty")); + score_param->closeness_factor_ + = get_detail (details, ly_symbol2scm ("closeness-factor")); + score_param->edge_attraction_factor_ + = get_detail (details, ly_symbol2scm ("edge-attraction-factor")); + score_param->same_slope_penalty_ + = get_detail (details, ly_symbol2scm ("same-slope-penalty")); + score_param->steeper_slope_factor_ + = get_detail (details, ly_symbol2scm ("steeper-slope-factor")); + score_param->non_horizontal_penalty_ + = get_detail (details, ly_symbol2scm ("non-horizontal-penalty")); + score_param->head_strict_free_space_ + = get_detail (details, ly_symbol2scm ("head-strict-free-space")); + score_param->max_slope_ + = get_detail (details, ly_symbol2scm ("max-slope")); + score_param->max_slope_factor_ + = get_detail (details, ly_symbol2scm ("max-slope-factor")); + score_param->free_head_distance_ + = get_detail (details, ly_symbol2scm ("free-head-distance")); + score_param->extra_object_collision_ + = get_detail (details, ly_symbol2scm ("extra-object-collision")); + score_param->accidental_collision_ + = get_detail (details, ly_symbol2scm ("accidental-collision")); + score_param->extra_encompass_free_distance_ + = get_detail (details, ly_symbol2scm ("extra-encompass-free-distance")); } -Slur_score_parameters::Slur_score_parameters() + +Slur_score_parameters::Slur_score_parameters(Grob *me) { - init_score_param (this); + init_score_param (me, this); } /* HDIR indicates the direction for the slur. */ @@ -410,7 +440,7 @@ set_end_points (Grob *me) { Link_array columns = Pointer_group_interface__extract_grobs (me, (Grob *) 0, "note-columns"); - Slur_score_parameters params; + if (columns.is_empty ()) { me->suicide (); @@ -439,6 +469,7 @@ set_end_points (Grob *me) = get_base_attachments (sp, common, extremes); Drul_array end_ys = get_y_attachment_range (sp, common, extremes, base_attachment); + Slur_score_parameters params (me); Array scores = enumerate_attachments (me, common, ¶ms, extremes, base_attachment, end_ys); @@ -553,7 +584,6 @@ get_base_attachments (Spanner *me, Link_array columns = Pointer_group_interface__extract_grobs (me, (Grob *)0, "note-columns"); Drul_array base_attachment; - Slur_score_parameters params; Real staff_space = Staff_symbol_referencer::staff_space ((Grob *) me); Direction dir = get_grob_direction (me); Direction d = LEFT; @@ -741,7 +771,7 @@ enumerate_attachments (Grob *me, Grob *common[], Offset dz; dz = os[RIGHT] - os[LEFT]; if (dz[X_AXIS] < minimum_length - || fabs (dz[Y_AXIS] / dz[X_AXIS]) > score_param->MAX_SLOPE + || fabs (dz[Y_AXIS] / dz[X_AXIS]) > score_param->max_slope_ ) { do @@ -823,13 +853,13 @@ score_encompass (Grob *me, Grob *common[], { Real head_dy = (y - infos[j].head_); if (dir * head_dy < 0) - demerit += score_param->HEAD_ENCOMPASS_PENALTY; + demerit += score_param->head_encompass_penalty_; else { Real hd = (head_dy) - ? (1 / fabs (head_dy) - 1 / score_param->FREE_HEAD_DISTANCE) - : score_param->HEAD_ENCOMPASS_PENALTY; - hd = (hd >? 0)HEAD_ENCOMPASS_PENALTY; + ? (1 / fabs (head_dy) - 1 / score_param->free_head_distance_) + : score_param->head_encompass_penalty_; + hd = (hd >? 0)head_encompass_penalty_; demerit += hd; } @@ -837,7 +867,7 @@ score_encompass (Grob *me, Grob *common[], if (dir * (y - infos[j].stem_) < 0) { - Real stem_dem =score_param->STEM_ENCOMPASS_PENALTY ; + Real stem_dem =score_param->stem_encompass_penalty_ ; if ((l_edge && dir == UP) || (r_edge && dir == DOWN)) stem_dem /= 5; @@ -851,9 +881,9 @@ score_encompass (Grob *me, Grob *common[], ext.add_point (infos[j].head_); // ? - demerit += -score_param->CLOSENESS_FACTOR + demerit += -score_param->closeness_factor_ * (dir - * (y - (ext[dir] + dir * score_param->FREE_HEAD_DISTANCE)) + * (y - (ext[dir] + dir * score_param->free_head_distance_)) ACCIDENTAL_COLLISION - : score_param->EXTRA_OBJECT_COLLISION; + ? score_param->accidental_collision_ + : score_param->extra_object_collision_; Real dist = yexts[j].distance (y); demerit += - fabs (0 >? (score_param->EXTRA_ENCOMPASS_FREE_DISTANCE - dist)) / - score_param->EXTRA_ENCOMPASS_FREE_DISTANCE * collision_demerit; + fabs (0 >? (score_param->extra_encompass_free_distance_ - dist)) / + score_param->extra_encompass_free_distance_ * collision_demerit; } #if DEBUG_SLUR_QUANTING (*scores)[i].score_card_ += to_string ("X%.2f", demerit); @@ -1021,7 +1051,7 @@ score_edges (Grob *me, Grob *common[], Real y = scores->elem (i).attachment_[d][Y_AXIS]; Real dy = fabs (y - base_attach[d][Y_AXIS]); - Real factor = score_param->EDGE_ATTRACTION_FACTOR; + Real factor = score_param->edge_attraction_factor_; Real demerit = factor * dy; if (extremes[d].stem_ && extremes[d].stem_dir_ == dir @@ -1073,31 +1103,31 @@ score_slopes (Grob *me, Grob *common[], Real demerit = 0.0; demerit += ((fabs (slur_dy / slur_dz[X_AXIS]) - - score_param->MAX_SLOPE) >? 0) - * score_param->MAX_SLOPE_FACTOR; + - score_param->max_slope_) >? 0) + * score_param->max_slope_factor_; /* 0.2: account for staffline offset. */ Real max_dy = (fabs (dy) + 0.2); if (has_beams) max_dy += 1.0; - demerit += score_param->STEEPER_SLOPE_FACTOR + demerit += score_param->steeper_slope_factor_ * ((fabs (slur_dy) -max_dy) >? 0); demerit += ((fabs (slur_dy/slur_dz[X_AXIS]) - - score_param->MAX_SLOPE) >? 0) - * score_param->MAX_SLOPE_FACTOR; + - score_param->max_slope_) >? 0) + * score_param->max_slope_factor_; if (sign (dy) == 0 && sign (slur_dy) != 0) - demerit += score_param->NON_HORIZONTAL_PENALTY; + demerit += score_param->non_horizontal_penalty_; if (sign (dy) && sign (slur_dy) && sign (slur_dy) != sign (dy)) demerit += has_beams - ? score_param->SAME_SLOPE_PENALTY / 10 - : score_param->SAME_SLOPE_PENALTY; + ? score_param->same_slope_penalty_ / 10 + : score_param->same_slope_penalty_; #if DEBUG_SLUR_QUANTING (*scores)[i].score_card_ += to_string ("S%.2f", d); @@ -1110,3 +1140,4 @@ score_slopes (Grob *me, Grob *common[], } + diff --git a/scm/define-grobs.scm b/scm/define-grobs.scm index 89cc2b752c..933261c0a2 100644 --- a/scm/define-grobs.scm +++ b/scm/define-grobs.scm @@ -17,8 +17,10 @@ (Accidental . ( (print-function . ,Accidental_interface::print) + (inside-slur . #t) (cautionary-style . parentheses) - (after-line-breaking-callback . ,Accidental_interface::after_line_breaking) (meta . ((interfaces . (item-interface accidental-interface font-interface)))) + (after-line-breaking-callback . ,Accidental_interface::after_line_breaking) (meta . ((interfaces . (item-interface accidental-interface + font-interface)))) )) (AccidentalPlacement @@ -773,7 +775,7 @@ )) (PhrasingSlur - . ( + . ((slur-details . ,default-slur-details) (print-function . ,New_slur::print) (thickness . 1.2) (spacing-procedure . ,Spanner::set_spacing_rods) @@ -885,7 +887,7 @@ )) (Slur - . ( + . ((slur-details . ,default-slur-details) (print-function . ,New_slur::print) (thickness . 1.2) (spacing-procedure . ,Spanner::set_spacing_rods) diff --git a/scm/slur.scm b/scm/slur.scm index 73e087db0f..f213bb1223 100644 --- a/scm/slur.scm +++ b/scm/slur.scm @@ -113,3 +113,21 @@ )) +; this is put into the slur-details property of Slur and PhrasingSlur +(define default-slur-details + '((slur-region-size . 5) + (head-encompass-penalty . 1000.0) + (stem-encompass-penalty . 30.0) + (closeness-factor . 10) + (edge-attraction-factor . 4) + (same-slope-penalty . 20) + (steeper-slope-factor . 50) + (non-horizontal-penalty . 15) + (head-strict-free-space . 0.2) + (max-slope . 1.1) + (max-slope-factor . 10) + (free-head-distance . 0.3) + (extra-object-collision . 50) + (accidental-collision . 3) + (extra-encompass-free-distance . 0.5) + ))