]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/beam.cc
patch::: 1.3.152.jcn1
[lilypond.git] / lily / beam.cc
index 2e0615baf4610425567523f377406af946f0f50c..77186ed8e26575a251c1ba26e7d5c9fbd8d0d92c 100644 (file)
 /*
   [TODO]
 
-  * shorter! (now +- 1000 lines)
-  * less hairy code
+  -* shorter! (now +- 1000 lines)
+  
+  -* less hairy code
+  
   */
 
 
@@ -135,7 +137,7 @@ Beam::get_default_dir (Grob*me)
   /*
     If dir is not determined: get default
   */
-  return to_dir (me->get_grob_property ("default-neutral-direction"));
+  return to_dir (me->get_grob_property ("neutral-direction"));
 }
 
 
@@ -495,7 +497,7 @@ Beam::user_override (SCM smob)
   SCM s = me->get_grob_property ("staff-position");
   if (gh_number_p (s))
     {
-      Real y = gh_scm2double (s) * staff_space;
+      Real y = gh_scm2double (s) * staff_space * 0.5;
       me->set_grob_property ("y", gh_double2scm (y));
     }
 
@@ -503,7 +505,7 @@ Beam::user_override (SCM smob)
   s = me->get_grob_property ("height");
   if (gh_number_p (s))
     {
-      Real dy = gh_scm2double (s) * staff_space;
+      Real dy = gh_scm2double (s) * staff_space * 0.5;
       me->set_grob_property ("dy", gh_double2scm (dy));
     }
   
@@ -751,7 +753,9 @@ Beam::set_beaming (Grob*me,Beaming_info_list *beaming)
   FIXME: clean me up.
   */
 Molecule
-Beam::stem_beams (Grob*me,Item *here, Item *next, Item *prev) 
+Beam::stem_beams (Grob*me,Item *here, Item *next, Item *prev,
+                 Real dy, Real dydx
+                 ) 
 {
   // ugh -> use commonx
   if ((next && ! (next->relative_coordinate (0, X_AXIS) > here->relative_coordinate (0, X_AXIS))) ||
@@ -770,13 +774,13 @@ Beam::stem_beams (Grob*me,Item *here, Item *next, Item *prev)
   Real bdy = interbeam_f;
   Real stemdx = staffline_f;
 
+#if 0
     // ugh -> use commonx
   Real dx = visible_stem_count (me) ?
     last_visible_stem (me)->relative_coordinate (0, X_AXIS) - first_visible_stem (me)->relative_coordinate (0, X_AXIS)
     : 0.0;
-  Real dy = gh_scm2double (me->get_grob_property ("dy"));
-  Real dydx = dy && dx ? dy/dx : 0;
-
+#endif
+  
   Molecule leftbeams;
   Molecule rightbeams;
 
@@ -794,6 +798,10 @@ Beam::stem_beams (Grob*me,Item *here, Item *next, Item *prev)
 
   Direction dir = Directional_element_interface::get (me);
   
+  /* [Tremolo] beams on whole notes may not have direction set? */
+ if (dir == CENTER)
+    dir = Directional_element_interface::get (here);
+  
   /* half beams extending to the left. */
   if (prev)
     {
@@ -840,8 +848,10 @@ Beam::stem_beams (Grob*me,Item *here, Item *next, Item *prev)
              b.translate_axis (-dir  * bdy * j, Y_AXIS);
              rightbeams.add_molecule (b);
            }
-         // TODO: notehead widths differ for different types
-         gap_f = nw_f / 2;
+         if (Stem::invisible_b (here))
+           gap_f = nw_f;
+         else
+           gap_f = nw_f / 2;
          w -= 2 * gap_f;
          a = Lookup::beam (dydx, w + stemdx, thick);
        }
@@ -849,7 +859,13 @@ Beam::stem_beams (Grob*me,Item *here, Item *next, Item *prev)
       for (; j  < rwholebeams; j++)
        {
          Molecule b (a);
-         b.translate (Offset (Stem::invisible_b (here) ? 0 : gap_f, -dir * bdy * j));
+         Real tx = 0;
+         if (Stem::invisible_b (here))
+           // ugh, see chord-tremolo.ly
+           tx = (-dir + 1) / 2 * nw_f * 1.5 + gap_f/4;
+         else
+           tx = gap_f;
+         b.translate (Offset (tx, -dir * bdy * j));
          rightbeams.add_molecule (b);
        }
 
@@ -898,10 +914,18 @@ Beam::brew_molecule (SCM smob)
       dx = stems.top ()->relative_coordinate (0, X_AXIS) - x0;
     }
   
+
+
+  /*
+    TODO: the naming of the grob properties sucks.
+   */
+  SCM dy_s = me->get_grob_property ("dy");
+  SCM y_s = me->get_grob_property ("y");
+
   
-  Real dy = gh_scm2double (me->get_grob_property ("dy"));
+  Real dy = gh_number_p (dy_s) ? gh_scm2double (dy_s) : 0.0;
   Real dydx = dy && dx ? dy/dx : 0;
-  Real y = gh_scm2double (me->get_grob_property ("y"));
+  Real y = gh_number_p (y_s) ? gh_scm2double (y_s) : 0.0;
 
 
   for (int j=0; j <stems.size (); j++)
@@ -910,7 +934,7 @@ Beam::brew_molecule (SCM smob)
       Item * prev = (j > 0)? stems[j-1] : 0;
       Item * next = (j < stems.size ()-1) ? stems[j+1] :0;
 
-      Molecule sb = stem_beams (me, i, next, prev);
+      Molecule sb = stem_beams (me, i, next, prev, dy, dydx);
       Real x = i->relative_coordinate (0, X_AXIS)-x0;
       sb.translate (Offset (x, x * dydx + y));
       mol.add_molecule (sb);