]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/beam.cc
* input/regression/key-signature-cancellation.ly (Module): new file.
[lilypond.git] / lily / beam.cc
index 130dc8f3e4882d0a4c2c1f7d317a52d0e73c448b..65e1aafe382165e15c0cec292d5718b7d97e1a03 100644 (file)
@@ -35,7 +35,7 @@ Notes:
 #include "misc.hh"
 #include "least-squares.hh"
 #include "stem.hh"
-#include "paper-def.hh"
+#include "output-def.hh"
 #include "lookup.hh"
 #include "group-interface.hh"
 #include "staff-symbol-referencer.hh"
@@ -43,8 +43,6 @@ Notes:
 #include "spanner.hh"
 #include "warn.hh"
 
-bool debug_beam_quanting_flag;
-
 
 #if DEBUG_QUANTING
 #include "text-item.hh"  // debug output.
@@ -79,10 +77,10 @@ Beam::get_beam_translation (Grob *me)
 {
   SCM func = me->get_property ("space-function");
 
-  if (gh_procedure_p (func))
+  if (ly_c_procedure_p (func))
     {
-      SCM s = gh_call2 (func, me->self_scm (), scm_int2num (get_beam_count (me)));
-      return gh_scm2double (s);
+      SCM s = scm_call_2 (func, me->self_scm (), scm_int2num (get_beam_count (me)));
+      return scm_to_double (s);
     }
   else
     {
@@ -95,7 +93,7 @@ int
 Beam::get_beam_count (Grob *me) 
 {
   int m = 0;
-  for (SCM s = me->get_property ("stems"); gh_pair_p (s); s = ly_cdr (s))
+  for (SCM s = me->get_property ("stems"); ly_c_pair_p (s); s = ly_cdr (s))
     {
       Grob *stem = unsmob_grob (ly_car (s));
       m = m >? (Stem::beam_multiplicity (stem).length () + 1);
@@ -117,11 +115,11 @@ Beam::space_function (SCM smob, SCM beam_count)
   Real line = Staff_symbol_referencer::line_thickness (me);
   Real thickness = get_thickness (me);
   
-  Real beam_translation = gh_scm2int (beam_count) < 4
+  Real beam_translation = scm_to_int (beam_count) < 4
     ? (2*staff_space + line - thickness) / 2.0
     : (3*staff_space + line - thickness) / 3.0;
   
-  return gh_double2scm (beam_translation);
+  return scm_make_real (beam_translation);
 }
 
 
@@ -155,7 +153,7 @@ Beam::before_line_breaking (SCM smob)
        {
          me->warning (_ ("removing beam with less than two stems"));
 
-         unsmob_grob (gh_car (stems))->set_property ("beam", SCM_EOL);
+         unsmob_grob (ly_car (stems))->set_property ("beam", SCM_EOL);
          me->suicide ();
 
          return SCM_UNSPECIFIED;
@@ -201,7 +199,7 @@ position_with_maximal_common_beams (SCM left_beaming, SCM right_beaming,
                                    Direction left_dir,
                                    Direction right_dir)
 {
-  Slice lslice = int_list_to_slice (gh_cdr (left_beaming));
+  Slice lslice = int_list_to_slice (ly_cdr (left_beaming));
 
   int best_count = 0;
   int best_start = 0;
@@ -209,9 +207,9 @@ position_with_maximal_common_beams (SCM left_beaming, SCM right_beaming,
        (i - lslice[left_dir])* left_dir <= 0 ; i+= left_dir) 
     {
       int count =0;
-      for ( SCM s = gh_car (right_beaming); gh_pair_p (s); s = gh_cdr (s))
+      for ( SCM s = ly_car (right_beaming); ly_c_pair_p (s); s = ly_cdr (s))
        {
-         int k = - right_dir * gh_scm2int (gh_car (s)) + i;
+         int k = - right_dir * scm_to_int (ly_car (s)) + i;
          if (scm_c_memq (scm_int2num (k), left_beaming) != SCM_BOOL_F)
            count ++;
        }
@@ -242,7 +240,7 @@ Beam::connect_beams (Grob *me)
       SCM this_beaming = this_stem->get_property ("beaming");
 
       Direction this_dir = get_grob_direction (this_stem);
-      if (gh_pair_p (last_beaming) && gh_pair_p (this_beaming))
+      if (ly_c_pair_p (last_beaming) && ly_c_pair_p (this_beaming))
        {
          int start_point = position_with_maximal_common_beams
            (last_beaming, this_beaming,
@@ -257,13 +255,13 @@ Beam::connect_beams (Grob *me)
              
              new_slice.set_empty ();
              SCM s = index_get_cell (this_beaming, d);
-             for (; gh_pair_p (s); s = gh_cdr (s))
+             for (; ly_c_pair_p (s); s = ly_cdr (s))
                {
                  int new_beam_pos =
-                   start_point - this_dir * gh_scm2int (gh_car (s));
+                   start_point - this_dir * scm_to_int (ly_car (s));
 
                  new_slice.add_point (new_beam_pos);
-                 gh_set_car_x (s, scm_int2num (new_beam_pos));
+                 scm_set_car_x (s, scm_int2num (new_beam_pos));
                }
 
 
@@ -275,22 +273,22 @@ Beam::connect_beams (Grob *me)
        }
       else
        {
-         gh_set_car_x ( this_beaming, SCM_EOL);
-         SCM s = gh_cdr (this_beaming);
-         for (; gh_pair_p (s); s = gh_cdr (s))
+         scm_set_car_x ( this_beaming, SCM_EOL);
+         SCM s = ly_cdr (this_beaming);
+         for (; ly_c_pair_p (s); s = ly_cdr (s))
            {
-             int np = - this_dir * gh_scm2int (gh_car (s));
-             gh_set_car_x (s, scm_int2num (np));
+             int np = - this_dir * scm_to_int (ly_car (s));
+             scm_set_car_x (s, scm_int2num (np));
              last_int.add_point (np);
            }
        }
 
       if (i == stems.size () -1)
        {
-         gh_set_cdr_x (this_beaming, SCM_EOL);
+         scm_set_cdr_x (this_beaming, SCM_EOL);
        }
 
-      if (scm_ilength (gh_cdr (this_beaming)) > 0)
+      if (scm_ilength (ly_cdr (this_beaming)) > 0)
        {
          last_beaming = this_beaming;
          last_dir = this_dir;
@@ -339,7 +337,7 @@ Beam::print (SCM grob)
   else
     pos= ly_scm2realdrul (posns);
 
-  scale_drul (  &pos,  Staff_symbol_referencer::staff_space (me));
+  scale_drul (&pos,  Staff_symbol_referencer::staff_space (me));
   
   Real dy = pos[RIGHT] - pos[LEFT];
   Real dydx = (dy && dx) ? dy/dx : 0;
@@ -351,10 +349,10 @@ Beam::print (SCM grob)
   Real last_xposn = -1;
   Real last_stem_width = -1 ;
 
-  Real gap_length =robust_scm2double ( me->get_property ("gap"), 0.0);
+  Real gap_length = robust_scm2double (me->get_property ("gap"), 0.0);
   
   Stencil the_beam;
-  Real lt = me->get_paper ()->get_realvar (ly_symbol2scm ("linethickness"));
+  Real lt = me->get_paper ()->get_dimension (ly_symbol2scm ("linethickness"));
   
   for (int i = 0; i<= stems.size (); i++)
     {
@@ -369,18 +367,18 @@ Beam::print (SCM grob)
        right from the left stem, and rfliebertjes pointing left from
        right stem.
        */
-      SCM left = (i>0) ? gh_cdr (last_beaming) : SCM_EOL;
-      SCM right = st ? gh_car (this_beaming) : SCM_EOL;
+      SCM left = (i > 0) ? ly_cdr (last_beaming) : SCM_EOL;
+      SCM right = st ? ly_car (this_beaming) : SCM_EOL;
 
       Array<int> full_beams;
       Array<int> lfliebertjes;
       Array<int> rfliebertjes;   
 
       for (SCM s = left;
-          gh_pair_p (s); s =gh_cdr (s))
+          ly_c_pair_p (s); s =ly_cdr (s))
        {
-         int b = gh_scm2int (gh_car (s));
-         if (scm_c_memq (gh_car (s), right) != SCM_BOOL_F)
+         int b = scm_to_int (ly_car (s));
+         if (scm_c_memq (ly_car (s), right) != SCM_BOOL_F)
            {
              full_beams.push (b);
            }
@@ -390,10 +388,10 @@ Beam::print (SCM grob)
            }
        }
       for (SCM s = right;
-          gh_pair_p (s); s =gh_cdr (s))
+          ly_c_pair_p (s); s =ly_cdr (s))
        {
-         int b = gh_scm2int (gh_car (s));
-         if (scm_c_memq (gh_car (s), left) == SCM_BOOL_F)
+         int b = scm_to_int (ly_car (s));
+         if (scm_c_memq (ly_car (s), left) == SCM_BOOL_F)
            {
              rfliebertjes.push (b);
            }
@@ -416,14 +414,14 @@ Beam::print (SCM grob)
        w += stem_width/ 2 ;
       
 
-      Real blot = me->get_paper ()->get_realvar (ly_symbol2scm ("blotdiameter"));
+      Real blot = me->get_paper ()->get_dimension (ly_symbol2scm ("blotdiameter"));
       Stencil whole = Lookup::beam (dydx, w, thick, blot);
       Stencil gapped;
 
       int gap_count = 0;
-      if (gh_number_p (me->get_property ("gap-count")))
+      if (scm_is_number (me->get_property ("gap-count")))
        {
-         gap_count = gh_scm2int (me->get_property ("gap-count"));
+         gap_count = scm_to_int (me->get_property ("gap-count"));
          gapped = Lookup::beam (dydx, w - 2 * gap_length, thick, blot);
 
          full_beams.sort (default_compare);
@@ -456,8 +454,8 @@ Beam::print (SCM grob)
              int t = Stem::duration_log (st); 
 
              SCM proc = me->get_property ("flag-width-function");
-             SCM result = gh_call1 (proc, scm_int2num (t));
-             nw_f = gh_scm2double (result);
+             SCM result = scm_call_1 (proc, scm_int2num (t));
+             nw_f = scm_to_double (result);
            }
          else
            nw_f = break_overshoot / 2;
@@ -510,8 +508,8 @@ Beam::print (SCM grob)
 
 #if (DEBUG_QUANTING)
   SCM quant_score = me->get_property ("quant-score");
-  if (debug_beam_quanting_flag
-      && gh_string_p (quant_score))
+  if (to_boolean (me->get_paper ()->lookup_variable (ly_symbol2scm ("debug-beam-quanting")))
+      && scm_is_string (quant_score))
     {
       
       /*
@@ -522,13 +520,13 @@ Beam::print (SCM grob)
       String str;
       SCM properties = Font_interface::text_font_alist_chain (me);
 
+      Direction stem_dir = stems.size() ? to_dir (stems[0]->get_property ("direction")) : UP;
+    
       Stencil tm = *unsmob_stencil (Text_item::interpret_markup
         (me->get_paper ()->self_scm (), properties, quant_score));
-      the_beam.add_at_edge (Y_AXIS, UP, tm, 5.0, 0);
+      the_beam.add_at_edge (Y_AXIS, stem_dir, tm, 1.0, 0);
     }
 #endif
-    
-  
   
   return the_beam.smobbed_copy ();
 }
@@ -548,7 +546,7 @@ Beam::get_default_dir (Grob *me)
   Link_array<Grob> stems=
        Pointer_group_interface__extract_grobs (me, (Grob*)0, "stems");
 
-  for (int i=0; i <stems.size (); i++)
+  for (int i=0; i < stems.size (); i++)
     do {
       Grob *s = stems[i];
       Direction sd = get_grob_direction (s);
@@ -564,13 +562,13 @@ Beam::get_default_dir (Grob *me)
     } while (flip (&d) != DOWN);
   
   SCM func = me->get_property ("dir-function");
-  SCM s = gh_call2 (func,
-                   gh_cons (scm_int2num (count[UP]),
+  SCM s = scm_call_2 (func,
+                   scm_cons (scm_int2num (count[UP]),
                             scm_int2num (count[DOWN])),
-                   gh_cons (scm_int2num (total[UP]),
+                   scm_cons (scm_int2num (total[UP]),
                             scm_int2num (total[DOWN])));
 
-  if (gh_number_p (s) && gh_scm2int (s))
+  if (scm_is_number (s) && scm_to_int (s))
     return to_dir (s);
   
   /* If dir is not determined: get default */
@@ -666,10 +664,10 @@ void
 Beam::consider_auto_knees (Grob* me)
 {
   SCM scm = me->get_property ("auto-knee-gap");
-  if (!gh_number_p (scm))
+  if (!scm_is_number (scm))
     return ;
 
-  Real threshold = gh_scm2double (scm);
+  Real threshold = scm_to_double (scm);
   
   Int_set gaps;
 
@@ -791,13 +789,13 @@ Beam::set_stem_shorten (Grob *me)
   
   SCM shorten_elt =
     robust_list_ref (beam_count -1, shorten_list);
-  Real shorten_f = gh_scm2double (shorten_elt) * staff_space;
+  Real shorten_f = scm_to_double (shorten_elt) * staff_space;
 
   /* your similar cute comment here */
   shorten_f *= forced_fraction;
 
   if (shorten_f)
-    me->set_property ("shorten", gh_double2scm (shorten_f));
+    me->set_property ("shorten", scm_make_real (shorten_f));
 }
 
 /*  Call list of y-dy-callbacks, that handle setting of
@@ -830,8 +828,8 @@ Beam::position_beam (Grob *me)
     {
       // one wonders if such genericity is necessary  --hwn.
       SCM callbacks = me->get_property ("position-callbacks");
-      for (SCM i = callbacks; gh_pair_p (i); i = ly_cdr (i))
-       gh_call1 (ly_car (i), me->self_scm ());
+      for (SCM i = callbacks; ly_c_pair_p (i); i = ly_cdr (i))
+       scm_call_1 (ly_car (i), me->self_scm ());
     }
 
   set_stem_lengths (me);  
@@ -914,11 +912,11 @@ Beam::least_squares (SCM smob)
 
       /*
        For broken beams this doesn't work well. In this case, the
-        slope esp. of the first part of a broken beam should predict
-        where the second part goes.
-       */
+       slope esp. of the first part of a broken beam should predict
+       where the second part goes.
+      */
       me->set_property ("least-squares-dy",
-                            gh_double2scm (pos[RIGHT] - pos[LEFT]));
+                       scm_make_real (pos[RIGHT] - pos[LEFT]));
     }
   else
     {
@@ -937,7 +935,7 @@ Beam::least_squares (SCM smob)
       minimise_least_squares (&dydx, &y, ideals);
 
       dy = dydx * dx;
-      me->set_property ("least-squares-dy", gh_double2scm (dy));
+      me->set_property ("least-squares-dy", scm_make_real (dy));
       pos = Interval (y, (y+dy));
     }
 
@@ -1101,9 +1099,9 @@ Beam::check_concave (SCM smob)
   */
   bool is_concave1 = false;
   SCM gap = me->get_property ("concaveness-gap");
-  if (gh_number_p (gap))
+  if (scm_is_number (gap))
     {
-      Real r1 = gh_scm2double (gap);
+      Real r1 = scm_to_double (gap);
       Real dy = Stem::chord_start_y (stems.top ())
        - Stem::chord_start_y (stems[0]);
 
@@ -1138,9 +1136,9 @@ Beam::check_concave (SCM smob)
   Real concaveness2 = 0;
   SCM thresh = me->get_property ("concaveness-threshold");
   Real r2 = infinity_f;
-  if (!is_concave1 && gh_number_p (thresh))
+  if (!is_concave1 && scm_is_number (thresh))
     {
-      r2 = gh_scm2double (thresh);
+      r2 = scm_to_double (thresh);
       
       Interval iv;
       iv.add_point (Stem::chord_start_y (stems[0]));
@@ -1160,11 +1158,11 @@ Beam::check_concave (SCM smob)
   if (is_concave1 || concaveness2 > r2)
     {
       Drul_array<Real> pos = ly_scm2interval (me->get_property ("positions"));
-      Real r = linear_combination (pos, 0);
+      Real r = linear_combination (pos, 0.0);
 
       r /= Staff_symbol_referencer::staff_space (me);
       me->set_property ("positions", ly_interval2scm (Drul_array<Real> (r, r)));
-      me->set_property ("least-squares-dy", gh_double2scm (0));
+      me->set_property ("least-squares-dy", scm_make_real (0));
     }
 
   return SCM_UNSPECIFIED;
@@ -1183,7 +1181,7 @@ Beam::slope_damping (SCM smob)
     return SCM_UNSPECIFIED;
 
   SCM s = me->get_property ("damping"); 
-  int damping = gh_scm2int (s);
+  int damping = scm_to_int (s);
 
   if (damping)
     {
@@ -1223,11 +1221,11 @@ where_are_the_whole_beams (SCM beaming)
 {
   Slice l; 
   
-  for ( SCM s = gh_car (beaming); gh_pair_p (s) ; s = gh_cdr (s))
+  for ( SCM s = ly_car (beaming); ly_c_pair_p (s) ; s = ly_cdr (s))
     {
-      if (scm_c_memq (gh_car (s), gh_cdr (beaming)) != SCM_BOOL_F)
+      if (scm_c_memq (ly_car (s), ly_cdr (beaming)) != SCM_BOOL_F)
        
-       l.add_point (gh_scm2int (gh_car (s)));
+       l.add_point (scm_to_int (ly_car (s)));
     }
 
   return l;
@@ -1297,8 +1295,8 @@ Beam::set_stem_lengths (Grob *me)
 
   bool gap = false;
   Real thick =0.0;
-  if (gh_number_p (me->get_property ("gap-count"))
-      &&gh_scm2int (me->get_property ("gap-count")))
+  if (scm_is_number (me->get_property ("gap-count"))
+      &&scm_to_int (me->get_property ("gap-count")))
     {
       gap = true;
       thick = get_thickness (me);
@@ -1453,26 +1451,26 @@ SCM
 Beam::rest_collision_callback (SCM element_smob, SCM axis)
 {
   Grob *rest = unsmob_grob (element_smob);
-  Axis a = (Axis) gh_scm2int (axis);
+  Axis a = (Axis) scm_to_int (axis);
 
-  if (gh_number_p (rest->get_property ("staff-position")))
-    return gh_int2scm (0);
+  if (scm_is_number (rest->get_property ("staff-position")))
+    return scm_int2num (0);
   
   assert (a == Y_AXIS);
 
   Grob *st = unsmob_grob (rest->get_property ("stem"));
   Grob *stem = st;
   if (!stem)
-    return gh_double2scm (0.0);
+    return scm_make_real (0.0);
   Grob *beam = unsmob_grob (stem->get_property ("beam"));
   if (!beam
       || !Beam::has_interface (beam)
       || !Beam::visible_stem_count (beam))
-    return gh_double2scm (0.0);
+    return scm_make_real (0.0);
 
   Drul_array<Real> pos (0, 0);
   SCM s = beam->get_property ("positions");
-  if (gh_pair_p (s) && gh_number_p (ly_car (s)))
+  if (ly_c_pair_p (s) && scm_is_number (ly_car (s)))
     pos = ly_scm2interval (s);
   Real staff_space = Staff_symbol_referencer::staff_space (rest);
 
@@ -1518,19 +1516,19 @@ Beam::rest_collision_callback (SCM element_smob, SCM axis)
       < rad)
     shift = ceil (fabs (shift)) *sign (shift);
 
-  return gh_double2scm (staff_space * shift);
+  return scm_make_real (staff_space * shift);
 }
 
 bool
 Beam::is_knee (Grob* me)
 {
   SCM k = me->get_property ("knee");
-  if (gh_boolean_p (k))
-    return gh_scm2bool (k);
+  if (scm_is_bool (k))
+    return ly_scm2bool (k);
 
   bool knee = false;
   int d = 0;
-  for (SCM s = me->get_property ("stems"); gh_pair_p (s); s = ly_cdr (s))
+  for (SCM s = me->get_property ("stems"); ly_c_pair_p (s); s = ly_cdr (s))
     {
       Direction dir = get_grob_direction (unsmob_grob (ly_car (s)));
       if (d && d != dir)
@@ -1541,7 +1539,7 @@ Beam::is_knee (Grob* me)
       d = dir;
     }
   
-  me->set_property ("knee", gh_bool2scm (knee));
+  me->set_property ("knee", ly_bool2scm (knee));
 
   return knee;
 }
@@ -1574,7 +1572,7 @@ ADD_INTERFACE (Beam, "beam-interface",
               "knee positioning-done position-callbacks concaveness-gap "
               "concaveness-threshold dir-function quant-score auto-knee-gap gap "
               "gap-count chord-tremolo beamed-stem-shorten shorten least-squares-dy "
-              "damping flag-width-function neutral-direction positions space-function "
+              "damping inspect-quants flag-width-function neutral-direction positions space-function "
               "thickness");