]> git.donarmstrong.com Git - lilypond.git/commitdiff
* lily/slur-quanting.cc (init_score_param): read scoring
authorHan-Wen Nienhuys <hanwen@xs4all.nl>
Sat, 28 Aug 2004 11:18:49 +0000 (11:18 +0000)
committerHan-Wen Nienhuys <hanwen@xs4all.nl>
Sat, 28 Aug 2004 11:18:49 +0000 (11:18 +0000)
parameters from slur-details property

* scm/define-grobs.scm (all-grob-descriptions): add inside-slur to
Accidental

ChangeLog
input/regression/new-slur.ly
lily/accidental.cc
lily/slur-quanting.cc
scm/define-grobs.scm
scm/slur.scm

index fb45b7e89fcb97bccf1f7e2f17969c2f094872dd..885e52087ae455618250f24679bb6a929ef7b9e1 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -6,6 +6,12 @@
 
 2004-08-28  Han-Wen Nienhuys   <hanwen@xs4all.nl>
 
+       * 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
index fa26940ab74444d3c6ca7df23f8ccf5803a4aa79..bf12cc026308f6b79dd2d02df6264a358edaa18a 100644 (file)
@@ -51,5 +51,6 @@
     s2.|
     e4( dis4)
     e4( dis4)
+    g='16( b d fis)
 }
 
index def53e5a03b091ec6fd074a0018a9259c19d2ff7..cbb0fc120276f225baa9314f048a4d6e6b6168bc 100644 (file)
@@ -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");
index 8c704e084f55574e952637d04c187cf678b63ccb..a750086ccd4e7ef757588e140d98d079f874dd2d 100644 (file)
@@ -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<Offset> base_attach,
                             Array<Slur_score> *scores);
 static Array<Slur_score> enumerate_attachments
-(Grob *me, Grob *common[], Slur_score_parameters *score_param,
+(Grob *me, Grob *common[], Slur_score_parameters*,
  Drul_array<Bound_info> extremes,
  Drul_array<Offset> base_attachment, Drul_array<Real> end_ys);
 static Drul_array<Offset> get_base_attachments
@@ -169,29 +169,59 @@ static Drul_array<Real> get_y_attachment_range
 (Spanner *sp, Grob **common, Drul_array<Bound_info> extremes,
  Drul_array<Offset> 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<Grob> 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<Real> end_ys
     = get_y_attachment_range (sp, common, extremes, base_attachment);
+  Slur_score_parameters params (me);
   Array<Slur_score> scores = enumerate_attachments (me, common, &params,
                                                    extremes, base_attachment,
                                                    end_ys);
@@ -553,7 +584,6 @@ get_base_attachments (Spanner *me,
   Link_array<Grob> columns
     = Pointer_group_interface__extract_grobs (me, (Grob *)0, "note-columns");
   Drul_array<Offset> 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)<? score_param->HEAD_ENCOMPASS_PENALTY;
+                   ? (1 / fabs (head_dy) - 1 / score_param->free_head_distance_)
+                   : score_param->head_encompass_penalty_;
+                 hd = (hd >? 0)<? score_param->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_))
                   <? 0)
                / infos.size ();
            }
@@ -988,13 +1018,13 @@ score_extra_encompass (Grob *me, Grob *common[],
 
          Real collision_demerit = 
               (Accidental_interface::has_interface (encompasses[j]))
-           ? score_param->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[],
 }
 
 
+
index 89cc2b752c5903191914b08781a8c38bcb075309..933261c0a2bbac41799a051886dae7224f97ab65 100644 (file)
     (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
        ))
 
     (PhrasingSlur
-     . (
+     . ((slur-details . ,default-slur-details)
        (print-function . ,New_slur::print)
        (thickness . 1.2)               
        (spacing-procedure . ,Spanner::set_spacing_rods)                
        ))
 
     (Slur
-     . (
+     . ((slur-details . ,default-slur-details)
        (print-function . ,New_slur::print)
        (thickness . 1.2)               
        (spacing-procedure . ,Spanner::set_spacing_rods)                
index 73e087db0f3e8483bfa3e4b892fe5415aa0c4b1e..f213bb12236efea09f633d39b83b6bf791b621c8 100644 (file)
     ))
 
 
+; 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)
+    ))