]> git.donarmstrong.com Git - lilypond.git/commitdiff
patch::: 0.1.37.jcn2: biem pats
authorJan Nieuwenhuizen <janneke@gnu.org>
Wed, 24 Dec 1997 10:32:32 +0000 (11:32 +0100)
committerJan Nieuwenhuizen <janneke@gnu.org>
Wed, 24 Dec 1997 10:32:32 +0000 (11:32 +0100)
pl 37.jcn3
- max beam slope "compile time parameterised" and set to 0.6
  (oh, how we need runtime generated beams!)
- beam's left y-pos quantisation
- beam slopes' y-span quantisation
- stem.ly

pl 37.jcn2
- feta: fixed sizes small numerals + flageolet

14 files changed:
NEWS
VERSION
flower/include/varray.hh
init/feta16.ly
init/feta20.ly
input/stem.ly [new file with mode: 0644]
lily/abbreviation-beam.cc
lily/beam.cc
lily/include/beam.hh
lily/stem.cc
lily/tex-beam.cc
mf/feta-watzieik.mf
tex/feta16.tex
tex/feta20.tex

diff --git a/NEWS b/NEWS
index 83aca6b9b8ab64d53409c2bab1ce9c49701ae9f5..86c0b6b66076704c33444faaaa3fce2ef41cc9f8 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -1,3 +1,13 @@
+pl 37.jcn3
+       - max beam slope "compile time parameterised" and set to 0.6
+         (oh, how we need runtime generated beams!)
+       - beam's left y-pos quantisation
+       - beam slopes' y-span quantisation
+       - stem.ly
+
+pl 37.jcn2
+       - feta: fixed sizes small numerals + flageolet
+
 pl 37.jcn1
        - feta: numerals
        - feta: flageolet
diff --git a/VERSION b/VERSION
index 13c7b2006ae3b5fb49cac6701f707ed51020b584..b49f45ea53769e66964af8795c00d0073bd3eaaa 100644 (file)
--- a/VERSION
+++ b/VERSION
@@ -1,7 +1,7 @@
 TOPLEVEL_MAJOR_VERSION = 0
 TOPLEVEL_MINOR_VERSION = 1
 TOPLEVEL_PATCH_LEVEL = 37
-TOPLEVEL_MY_PATCH_LEVEL = jcn2
+TOPLEVEL_MY_PATCH_LEVEL = jcn3
 
 # use the above to send patches, always empty for released version:
 # please don't move these comments up; the patch should fail if 
index 191b9ca0b652e288d11583d5acefd9874243577d..8386c20a8cecbc33d6d6e4d8528c5cac0ef7e893 100644 (file)
@@ -11,7 +11,7 @@
 /// copy a bare (C-)array from #src# to #dest# sized  #count#
 template<class T>
 inline void arrcpy (T*dest, T*src, int count) {
-    for (int i=0; i < count ; i++)
+    for (int i_shadows_local=0; i_shadows_local < count ; i_shadows_local++)
        *dest++ = *src++;
 }
 
index 747be0a7ac42c3e19d6269aa390301010498e6ce..f47e804a36fc6afc1bf7ac136509943da6096dd3 100644 (file)
@@ -1,5 +1,5 @@
 % Creator: mf-to-table.py version 0.4
-% Automatically generated on Sat Dec 13 20:07:15 1997
+% Automatically generated on Wed Dec 24 11:21:35 1997
 % Do not edit
 % input from out/feta16.log
 % name=\symboltables {
index 84dc1d2f2f5148cdbc1f76d7931b36f9aa61bbe2..ea735f4cb7a0e528d0de8798b9884ecb42cead31 100644 (file)
@@ -1,13 +1,13 @@
 % Creator: mf-to-table.py version 0.4
-% Automatically generated on Sat Dec 13 20:07:39 1997
+% Automatically generated on Wed Dec 24 11:21:40 1997
 % Do not edit
 % input from out/feta20.log
 % name=\symboltables {
     "rests"     = \table {
-        "0"    "\\wholerest"   -0.00\pt        7.50\pt -3.13\pt        0.00\pt 
-        "1"    "\\halfrest"    -0.00\pt        7.50\pt -0.00\pt        3.13\pt 
-        "0o"   "\\outsidewholerest"    -3.13\pt        10.62\pt        -3.13\pt        0.50\pt 
-        "1o"   "\\outsidehalfrest"     -3.13\pt        10.62\pt        -0.50\pt        3.13\pt 
+        "0"    "\\wholerest"   -0.00\pt        7.50\pt -3.12\pt        0.00\pt 
+        "1"    "\\halfrest"    -0.00\pt        7.50\pt -0.00\pt        3.12\pt 
+        "0o"   "\\outsidewholerest"    -3.12\pt        10.62\pt        -3.12\pt        0.50\pt 
+        "1o"   "\\outsidehalfrest"     -3.12\pt        10.62\pt        -0.50\pt        3.12\pt 
         "2"    "\\quartrest"   -0.00\pt        5.40\pt 3.75\pt 18.00\pt        
         "3"    "\\eighthrest"  -0.00\pt        6.67\pt 5.00\pt 14.21\pt        
         "4"    "\\sixteenthrest"       -0.00\pt        7.76\pt -0.00\pt        14.21\pt        
@@ -23,7 +23,7 @@
         "2"    "\\sharpsharp"  -0.00\pt        5.00\pt -2.50\pt        2.50\pt 
         }
     "dots"      = \table {
-        "dot"  "\\dot" -0.00\pt        2.25\pt -1.13\pt        1.13\pt 
+        "dot"  "\\dot" -0.00\pt        2.25\pt -1.12\pt        1.12\pt 
         "repeatcolon"  "\\repeatcolon" -0.00\pt        2.25\pt -2.50\pt        2.50\pt 
         }
     "balls"     = \table {
diff --git a/input/stem.ly b/input/stem.ly
new file mode 100644 (file)
index 0000000..5442943
--- /dev/null
@@ -0,0 +1,48 @@
+\header{
+title= "Stems and Beams";
+subtitle = "proofsheet"; 
+enteredby =     "jcn";
+copyright =     "public domain";
+TestedFeatures =        "This file tests the length of stems and placement 
+of beams";
+       
+}
+
+\version "0.1.7";
+
+beamintervals = \melodic{
+               \meter 7/4;
+               \stemup;
+               \octave c';
+               [ c8 d ] [ c e ] [ c f ] [ c g ] [ c a ] [ c b ] [ c c' ] |
+               [ c 'b ] [ c 'a ] [ c 'g ] [ c 'f ] [ c 'e ] [ c 'd ] [ c 'c ] |
+               \octave c'';
+               [ c 'b ] [ c 'a ] [ c 'g ] [ c 'f ] [ c 'e ] [ c 'd ] [ c 'c ] |
+               \stemdown;
+               \octave c''';
+               [ c 'b ] [ c 'a ] [ c 'g ] [ c 'f ] [ c 'e ] [ c 'd ] [ c 'c ] |
+               \octave c'';
+               [ c 'b ] [ c 'a ] [ c 'g ] [ c 'f ] [ c 'e ] [ c 'd ] [ c 'c ] |
+               [ c d ] [ c e ] [ c f ] [ c g ] [ c a ] [ c b ] [ c c' ] |
+       }
+
+\score{
+       \melodic{ 
+               \octave c';
+               \stemup;
+               \meter 17/4;
+               'g4 'a 'b c d e f g a b c' d' e' f' g' a' b' |
+               \stemdown
+               b' a' g' f' e' d' c' b a g f e d c 'b 'a 'g |
+               \beamintervals;
+               \transpose d \beamintervals;
+               \transpose e \beamintervals;
+               \transpose f \beamintervals;
+               \transpose g \beamintervals;
+               \transpose a \beamintervals;
+               \transpose b \beamintervals;
+       }
+       \paper{
+               gourlay_maxmeasures = 2.;
+       }
+}
index ac36ae99d026d8caae9e17f6632475a5e7cebed4..d9a4e5bac8b2bc6c252a32575bfd0eacb9545b73 100644 (file)
@@ -51,7 +51,7 @@ Abbreviation_beam::brew_molecule_p () const
 
       Molecule sb = stem_beams (i, next, prev);
       Real  x = i->hpos_f ()-x0;
-      sb.translate (Offset (x, (x * slope  + left_pos)* inter_f));
+      sb.translate (Offset (x, (x * slope_f  + left_y)* inter_f));
       mol_p->add (sb);
     }
   mol_p->translate_axis (x0 - spanned_drul_[LEFT]->absolute_coordinate (X_AXIS), X_AXIS);
index 268499b1b0fa21b7898800b37846c42bc14a3796..e714950ec6ac9cbe7f6b263189df129598b268bf 100644 (file)
 #include "lookup.hh"
 #include "grouping.hh"
 #include "stem-info.hh"
+#include "main.hh"  // experimental features
 
 
-IMPLEMENT_IS_TYPE_B1(Beam, Spanner);
+IMPLEMENT_IS_TYPE_B1 (Beam, Spanner);
 
-Beam::Beam()
+const int MINIMUM_STEMLEN = 5;
+
+Beam::Beam ()
 {
-  slope = 0;
-  left_pos = 0.0;
+  slope_f = 0;
+  left_y = 0.0;
 }
 
 void
@@ -53,80 +56,78 @@ Beam::add (Stem*s)
 }
 
 Molecule*
-Beam::brew_molecule_p() const
+Beam::brew_molecule_p () const
 {
   Molecule *mol_p = new Molecule;
-  // huh? inter-what
-  //    Real inter_f = paper()->interbeam_f ();
-  Real inter_f = paper()->internote_f ();
-  Real x0 = stems[0]->hpos_f();
-  for (int j=0; j <stems.size(); j++)
+  Real inter_f = paper ()->internote_f ();
+  Real x0 = stems[0]->hpos_f ();
+  for (int j=0; j <stems.size (); j++)
     {
       Stem *i = stems[j];
       Stem * prev = (j > 0)? stems[j-1] : 0;
-      Stem * next = (j < stems.size()-1) ? stems[j+1] :0;
+      Stem * next = (j < stems.size ()-1) ? stems[j+1] :0;
 
       Molecule sb = stem_beams (i, next, prev);
-      Real  x = i->hpos_f()-x0;
-      sb.translate (Offset (x, (x * slope  + left_pos)* inter_f));
+      Real  x = i->hpos_f ()-x0;
+      sb.translate (Offset (x, (x * slope_f  + left_y)* inter_f));
       mol_p->add (sb);
     }
-  mol_p->translate_axis (x0 - spanned_drul_[LEFT]->absolute_coordinate(X_AXIS), X_AXIS);
+  mol_p->translate_axis (x0 - spanned_drul_[LEFT]->absolute_coordinate (X_AXIS), X_AXIS);
   return mol_p;
 }
 
 Offset
-Beam::center() const
+Beam::center () const
 {
-  Real w=(paper()->note_width () + width ().length ())/2.0;
-  return Offset (w, (left_pos + w* slope)*paper()->internote_f ());
+  Real w= (paper ()->note_width () + width ().length ())/2.0;
+  return Offset (w, (left_y + w* slope_f)*paper ()->internote_f ());
 }
 
 void
-Beam::do_pre_processing()
+Beam::do_pre_processing ()
 {
   if (!dir_)
-    set_default_dir();
+    set_default_dir ();
 }
 
 void
-Beam::do_print() const
+Beam::do_print () const
 {
 #ifndef NPRINT
-  DOUT << "slope " <<slope << "left ypos " << left_pos;
-  Spanner::do_print();
+  DOUT << "slope_f " <<slope_f << "left ypos " << left_y;
+  Spanner::do_print ();
 #endif
 }
 
 void
-Beam::do_post_processing()
+Beam::do_post_processing ()
 {
-  if (stems.size() < 2)
+  if (stems.size () < 2)
     {
-      warning (_("Beam with less than 2 stems"));
+      warning (_ ("Beam with less than 2 stems"));
       transparent_b_ = true;
       return ;
     }
-  solve_slope();
-  set_stemlens();
+  solve_slope ();
+  set_stemlens ();
 }
 
 void
 Beam::do_substitute_dependent (Score_elem*o,Score_elem*n)
 {
-  if (o->is_type_b (Stem::static_name()))
-      stems.substitute ((Stem*)o->item(),  n?(Stem*) n->item ():0);
+  if (o->is_type_b (Stem::static_name ()))
+      stems.substitute ((Stem*)o->item (),  n? (Stem*) n->item ():0);
 }
 
 Interval
-Beam::do_width() const
+Beam::do_width () const
 {
-  return Interval (stems[0]->hpos_f(),
-                  stems.top()->hpos_f ());
+  return Interval (stems[0]->hpos_f (),
+                  stems.top ()->hpos_f ());
 }
 
 void
-Beam::set_default_dir()
+Beam::set_default_dir ()
 {
   Drul_array<int> total;
   total[UP]  = total[DOWN] = 0;
@@ -134,12 +135,12 @@ Beam::set_default_dir()
   count[UP]  = count[DOWN] = 0;
   Direction d = DOWN;
   
-  for (int i=0; i <stems.size(); i++)
+  for (int i=0; i <stems.size (); i++)
     do {
       Stem *s = stems[i];
       int current = s->dir_ 
        ? (1 + d * s->dir_)/2
-       : s->get_center_distance(Direction(-d));
+       : s->get_center_distance (Direction (-d));
 
       if (current)
        {
@@ -159,7 +160,7 @@ Beam::set_default_dir()
          */
   dir_ = (total[UP] * count[DOWN] > total[DOWN] * count[UP]) ? UP : DOWN;
 
-  for (int i=0; i <stems.size(); i++)
+  for (int i=0; i <stems.size (); i++)
     {
       Stem *sl = stems[i];
       sl->dir_ = dir_;
@@ -169,102 +170,272 @@ Beam::set_default_dir()
 /*
   should use minimum energy formulation (cf linespacing)
 
-  [todo]
-  the y of the (start) of the beam should be quantisized,
-  so that no stafflines appear just in between two beam-flags
-
 */
 void
-Beam::solve_slope()
+Beam::solve_slope ()
 {
   Array<Stem_info> sinfo;
-  for (int j=0; j <stems.size(); j++)
+  for (int j=0; j <stems.size (); j++)
     {
       Stem *i = stems[j];
 
-      i->set_default_extents();
-      if (i->invisible_b())
+      i->set_default_extents ();
+      if (i->invisible_b ())
        continue;
 
       Stem_info info (i);
       sinfo.push (info);
     }
-  if (! sinfo.size())
-    slope = left_pos = 0;
-  else if (sinfo.size() == 1)
+  if (! sinfo.size ())
+    slope_f = left_y = 0;
+  else if (sinfo.size () == 1)
     {
-      slope = 0;
-      left_pos = sinfo[0].idealy_f_;
+      slope_f = 0;
+      left_y = sinfo[0].idealy_f_;
     }
   else
     {
 
       Real leftx = sinfo[0].x;
       Least_squares l;
-      for (int i=0; i < sinfo.size(); i++)
+      for (int i=0; i < sinfo.size (); i++)
        {
          sinfo[i].x -= leftx;
          l.input.push (Offset (sinfo[i].x, sinfo[i].idealy_f_));
        }
 
-      l.minimise (slope, left_pos);
+      l.minimise (slope_f, left_y);
     }
 
   Real dy = 0.0;
-  for (int i=0; i < sinfo.size(); i++)
+  for (int i=0; i < sinfo.size (); i++)
     {
-      Real y = sinfo[i].x * slope + left_pos;
+      Real y = sinfo[i].x * slope_f + left_y;
       Real my = sinfo[i].miny_f_;
 
       if (my - y > dy)
        dy = my -y;
     }
-  left_pos += dy;
-  left_pos *= dir_;
+  left_y += dy;
+  left_y *= dir_;
 
-  slope *= dir_;
+  slope_f *= dir_;
 
   /*
-    This neat trick is by Werner Lemberg, damped = tanh (slope) corresponds
+    This neat trick is by Werner Lemberg, damped = tanh (slope_f) corresponds
     with some tables in [Wanske]
     */
-  slope = 0.6 * tanh (slope);
+  slope_f = 0.6 * tanh (slope_f);
+
+  quantise_yspan ();
 
-  // ugh
-  Real sl = slope*paper()->internote_f ();
-  paper()->lookup_l ()->beam (sl, 20 PT);
-  slope = sl /paper()->internote_f ();
+  // y-values traditionally use internote dimension: therefore slope = (y/in)/x
+  // but mf and beam-lookup use PT dimension for y (as used for x-values)
+  // ugh --- there goes our simplified but careful quantisation
+  Real sl = slope_f * paper ()->internote_f ();
+  paper ()->lookup_l ()->beam (sl, 20 PT);
+  slope_f = sl / paper ()->internote_f ();
 }
 
 void
-Beam::set_stemlens()
+Beam::quantise_yspan ()
 {
+  /*
+    [Ross] (simplification of)
+    Try to set slope_f complying with y-span of:
+      - zero
+      - beam_thickness / 2 + staffline_thickness / 2
+      - beam_thickness + staffline_thickness
+    + n * interline
+    */
+  Real interline_f = paper ()->interline_f ();
+  Real internote_f = interline_f / 2;
+  Real staffline_thickness = paper ()->rule_thickness ();
+  Real beam_thickness = 0.48 * (interline_f - staffline_thickness);
+
+  const int QUANTS = 3;
+  Real qdy[QUANTS] = {
+    0,
+    beam_thickness / 2 + staffline_thickness / 2,
+    beam_thickness + staffline_thickness
+  };
+
+  Real xspan_f = stems.top ()->hpos_f () - stems[0]->hpos_f ();
+  // y-values traditionally use internote dimension: therefore slope = (y/in)/x
+  Real yspan_f = xspan_f * abs (slope_f * internote_f);
+  int yspan_i = (int)(yspan_f / interline_f);
+  Real q = (yspan_f / interline_f - yspan_i) * interline_f;
+  int i = 0;
+  for (; i < QUANTS - 1; i++)
+    if ((q >= qdy[i]) && (q <= qdy[i + 1]))
+      {
+       if (q - qdy[i] < qdy[i + 1] - q)
+         break;
+       else
+       { 
+         i++;
+         break;
+       }
+      }
+  q = qdy[i];
+
+  yspan_f = (Real)yspan_i * interline_f + q;
+  // y-values traditionally use internote dimension: therefore slope = (y/in)/x
+  slope_f = yspan_f / xspan_f / internote_f * sign (slope_f);
+}
+
+void
+Beam::quantise_left_y (Beam::Pos pos, bool extend_b)
+{
+  /*
+   quantising left y should suffice, as slope is quantised too
+   if extend then stems must not get shorter
+   */
+
+  Real interline_f = paper ()->interline_f ();
+  Real internote_f = interline_f / 2;
+  Real staffline_thickness = paper ()->rule_thickness ();
+  Real beam_thickness = 0.48 * (interline_f - staffline_thickness);
+
+  const int QUANTS = 6;
+  Real qy[QUANTS] = {
+    -staffline_thickness,
+    beam_thickness / 2,
+    beam_thickness + staffline_thickness / 2,
+    interline_f / 2 + beam_thickness / 2 + staffline_thickness / 2,
+    interline_f - staffline_thickness,
+    interline_f + beam_thickness / 2,
+  };
   /* 
-     should check for visibility of stem..
+   ugh, using i triggers gcc 2.7.2.1 internal compiler error (far down):
+   for (int i = 0; i < QUANTS; i++)
    */
-  Real x0 = stems[0]->hpos_f();
-  for (int j=0; j <stems.size(); j++)
+  for (int ii = 0; ii < QUANTS; ii++)
+    qy[ii] -= beam_thickness / 2;
+  Pos qpos[QUANTS] = {
+    HANG,
+    STRADDLE,
+    SIT,
+    INTER,
+    HANG,
+    STRADDLE
+  };
+
+  // y-values traditionally use internote dimension
+  Real y = left_y * internote_f;
+  int y_i = (int)floor(y / interline_f);
+  y = (y / interline_f - y_i) * interline_f;
+
+  if (y < 0)
+    for (int ii = 0; ii < QUANTS; ii++)
+      qy[ii] -= interline_f;
+
+  int lower_i = 0;
+  int i = 0;
+  for (; i < QUANTS; i++)
     {
-      Stem *s = stems[j];
+      if (qy[i] > y)
+       break;
+      // found if lower_i is allowed, and nearer (from below) y than new pos
+      if ((pos & qpos[lower_i]) && (y - qy[lower_i] < y - qy[i]))
+        break;
+      // if new pos is allowed or old pos isn't: assign new pos
+      if ((pos & qpos[i]) || !(pos & qpos[lower_i]))
+       lower_i = i;
+    }
 
-      Real x =  s->hpos_f()-x0;
-      s->set_stemend (left_pos + slope * x);
+  int upper_i = QUANTS - 1;
+  for (i = QUANTS - 1; i >= 0; i--)
+    {
+      if (qy[i] < y)
+       break;
+      // found if upper_i is allowed, and nearer (from above) y than new pos
+      if ((pos & qpos[upper_i]) && (qy[upper_i] - y < qy[i] - y))
+        break;
+      // if new pos is allowed or old pos isn't: assign new pos
+      if ((pos & qpos[i]) || !(pos & qpos[upper_i]))
+       upper_i = i;
     }
+
+  // y-values traditionally use internote dimension
+  Real upper_y = (qy[upper_i] + interline_f * y_i) / internote_f;
+  Real lower_y = (qy[lower_i] + interline_f * y_i) / internote_f;
+
+  if (extend_b)
+    left_y = (dir_ > 0 ? upper_y : lower_y);
+  else
+    left_y = (upper_y - left_y < y - lower_y ? upper_y : lower_y);
+}
+
+void
+Beam::set_stemlens ()
+{
+  Real x0 = stems[0]->hpos_f ();
+  Real dy = 0;
+
+  Real interline_f = paper ()->interline_f ();
+  Real internote_f = interline_f / 2;
+  Real staffline_thickness = paper ()->rule_thickness ();
+  Real beam_thickness = 0.48 * (interline_f - staffline_thickness);
+  Real xspan_f = stems.top ()->hpos_f () - stems[0]->hpos_f ();
+  /*
+   ugh, y values are in "internote" dimension
+   */
+  Real yspan_f = xspan_f * abs (slope_f * internote_f);
+  int yspan_i = (int)(yspan_f / interline_f);
+
+  Pos left_pos = NONE;
+
+  if (yspan_f < staffline_thickness / 2)
+    left_pos = (Pos)(STRADDLE | SIT | HANG);
+  else
+    left_pos = (Pos) (sign (slope_f) > 0 ? STRADDLE | HANG 
+      : SIT | STRADDLE);
+
+  /* 
+   ugh, slope currently mangled by availability mf chars...
+   be more generous regarding beam position between stafflines
+   */
+  Real q = (yspan_f / interline_f - yspan_i) * interline_f;
+  if (q < interline_f / 3 - beam_thickness / 2)
+    left_pos = (Pos) (left_pos | INTER);
+
+  if (stems[0]->beams_right_i_ > 1)
+    left_pos = (Pos)(left_pos & (STRADDLE | INTER));
+
+  // ugh, rounding problems!
+  const Real EPSILON = interline_f / 10;
+  do
+    { 
+      left_y += dy * dir_;
+      quantise_left_y (left_pos, dy);
+      dy = 0;
+      for (int j=0; j < stems.size (); j++)
+       {
+         Stem *s = stems[j];
+
+         Real x = s->hpos_f () - x0;
+         s->set_stemend (left_y + slope_f * x);
+         Real y = s->stem_length_f ();
+         if (y < MINIMUM_STEMLEN)
+           dy = dy >? (MINIMUM_STEMLEN - y);
+       }
+    } while (abs (dy) > EPSILON)
 }
 
 void
 Beam::set_grouping (Rhythmic_grouping def, Rhythmic_grouping cur)
 {
-  def.OK();
-  cur.OK();
-  assert (cur.children.size() == stems.size ());
+  def.OK ();
+  cur.OK ();
+  assert (cur.children.size () == stems.size ());
 
   cur.split (def);
 
   Array<int> b;
   {
     Array<int> flags;
-    for (int j=0; j <stems.size(); j++)
+    for (int j=0; j <stems.size (); j++)
       {
        Stem *s = stems[j];
 
@@ -276,10 +447,10 @@ Beam::set_grouping (Rhythmic_grouping def, Rhythmic_grouping cur)
     b= cur.generate_beams (flags, fi);
     b.insert (0,0);
     b.push (0);
-    assert (stems.size() == b.size ()/2);
+    assert (stems.size () == b.size ()/2);
   }
 
-  for (int j=0, i=0; i < b.size() && j <stems.size (); i+= 2, j++)
+  for (int j=0, i=0; i < b.size () && j <stems.size (); i+= 2, j++)
     {
       Stem *s = stems[j];
       s->beams_left_i_ = b[i];
@@ -293,13 +464,13 @@ Beam::set_grouping (Rhythmic_grouping def, Rhythmic_grouping cur)
 Molecule
 Beam::stem_beams (Stem *here, Stem *next, Stem *prev) const
 {
-  assert (!next || next->hpos_f() > here->hpos_f ());
-  assert (!prev || prev->hpos_f() < here->hpos_f ());
-  //    Real dy=paper()->internote_f ()*2;
-  Real dy = paper()->interbeam_f ();
-  Real stemdx = paper()->rule_thickness ();
-  Real sl = slope*paper()->internote_f ();
-  paper()->lookup_l ()->beam (sl, 20 PT);
+  assert (!next || next->hpos_f () > here->hpos_f ());
+  assert (!prev || prev->hpos_f () < here->hpos_f ());
+  //    Real dy=paper ()->internote_f ()*2;
+  Real dy = paper ()->interbeam_f ();
+  Real stemdx = paper ()->rule_thickness ();
+  Real sl = slope_f*paper ()->internote_f ();
+  paper ()->lookup_l ()->beam (sl, 20 PT);
 
   Molecule leftbeams;
   Molecule rightbeams;
@@ -312,7 +483,7 @@ Beam::stem_beams (Stem *here, Stem *next, Stem *prev) const
       Real w = (here->hpos_f () - prev->hpos_f ())/4;
       Atom a;
       if (lhalfs)              // generates warnings if not
-       a =  paper()->lookup_l ()->beam (sl, w);
+       a =  paper ()->lookup_l ()->beam (sl, w);
       a.translate (Offset (-w, -w * sl));
       for (int j = 0; j  < lhalfs; j++)
        {
@@ -327,8 +498,8 @@ Beam::stem_beams (Stem *here, Stem *next, Stem *prev) const
       int rhalfs = here->beams_right_i_ - next->beams_left_i_;
       int rwholebeams = here->beams_right_i_ <? next->beams_left_i_;
 
-      Real w = next->hpos_f() - here->hpos_f ();
-      Atom a = paper()->lookup_l ()->beam (sl, w + stemdx);
+      Real w = next->hpos_f () - here->hpos_f ();
+      Atom a = paper ()->lookup_l ()->beam (sl, w + stemdx);
 
       int j = 0;
       Real gap_f = 0;
@@ -342,9 +513,9 @@ Beam::stem_beams (Stem *here, Stem *next, Stem *prev) const
              rightbeams.add (b);
            }
          // TODO: notehead widths differ for different types
-         gap_f = paper()->note_width () / 2;
+         gap_f = paper ()->note_width () / 2;
          w -= 2 * gap_f;
-         a = paper()->lookup_l ()->beam (sl, w + stemdx);
+         a = paper ()->lookup_l ()->beam (sl, w + stemdx);
        }
 
       for (; j  < rwholebeams; j++)
@@ -356,7 +527,7 @@ Beam::stem_beams (Stem *here, Stem *next, Stem *prev) const
 
       w /= 4;
       if (rhalfs)
-       a = paper()->lookup_l ()->beam (sl, w);
+       a = paper ()->lookup_l ()->beam (sl, w);
 
       for (; j  < rwholebeams + rhalfs; j++)
        {
index 5d605937c169113c4bf1299c0942295ccd46fc56..130df73d5d41f1a8e1933f867c3d6979a08fdc92 100644 (file)
   direction */
 class Beam:  public Directional_spanner {
 public:
+  enum Pos { NONE, SIT = 1, STRADDLE = 2, HANG = 4, INTER = 8 };
+
   Link_array<Stem> stems;
   /// the slope of the beam in posns / point (dimension)   
-  Real slope;
+  Real slope_f;
 
   /// position of leftmost end of beam  
-  Real left_pos;
+  Real left_y;
    
 
   /* *************** */
@@ -29,22 +31,24 @@ public:
   void add (Stem*);
 
   void set_grouping (Rhythmic_grouping def, Rhythmic_grouping current);
-  void set_stemlens();
-  SCORE_ELEM_CLONE(Beam);
+  void set_stemlens ();
+  SCORE_ELEM_CLONE (Beam);
 
 protected:
-  virtual Interval do_width() const;    
-  Offset center() const;
-  void set_default_dir();
-  virtual void do_pre_processing();
-  virtual void do_post_processing();
+  virtual Interval do_width () const;    
+  Offset center () const;
+  void set_default_dir ();
+  virtual void do_pre_processing ();
+  virtual void do_post_processing ();
   virtual void do_substitute_dependent (Score_elem*, Score_elem*);
 
   virtual void do_print() const;
 
+  virtual void quantise_left_y (Beam::Pos pos, bool extend_b);
   virtual Molecule stem_beams (Stem *here, Stem *next, Stem *prev) const;
-  virtual void solve_slope();
-  virtual Molecule*brew_molecule_p() const;
+  virtual void solve_slope ();
+  virtual void quantise_yspan ();
+  virtual Molecule*brew_molecule_p () const;
 };
 
 #endif // BEAM_HH
index 0e37c7d849a2b59a2db4c7e8823e20a92d2cb44a..9bdfd99f8029390698dcf58c833d425a63296a90 100644 (file)
@@ -84,7 +84,6 @@ Stem::stem_end_f () const
   return yextent_drul_[dir_];
 }
 
-
 void
 Stem::set_stemend (Real se)
 {
@@ -273,19 +272,19 @@ Stem::abbrev_mol () const
   Real beamdy = paper ()->interline_f () / 2;
 
   int beams_i = 0;
-  Real slope = paper ()->internote_f () / 4;
+  Real slope_f = paper ()->internote_f () / 4;
 
   if (beam_l_) {
     // huh?
-      slope = 2 * beam_l_->slope;
+      slope_f = 2 * beam_l_->slope_f;
     // ugh, rather calc from Abbreviation_req
       beams_i = beams_right_i_ >? beams_left_i_;
   }
-  paper ()->lookup_l ()->beam (slope, 20 PT);
+  paper ()->lookup_l ()->beam (slope_f, 20 PT);
 
   Molecule beams;
-  Atom a (paper ()->lookup_l ()->beam (slope, w));
-  a.translate (Offset(- w / 2, stem_end_f () - (w / 2 * slope)));
+  Atom a (paper ()->lookup_l ()->beam (slope_f, w));
+  a.translate (Offset(- w / 2, stem_end_f () - (w / 2 * slope_f)));
   
   // ugh
   if (!beams_i)
index e26b1c481de692263862a05523698e1e52b4514f..4380e8911f4a0b2c1e370849fb1713d33834648e 100644 (file)
@@ -54,15 +54,17 @@ Lookup::rule_symbol (Real height, Real width) const
 Atom
 Lookup::beam (Real &slope, Real width) const
 {
+  const Real MAX_SLOPE = 0.6;
+  const Real SLOPES = 20.0;
   int sidx = 0;
-  if (abs (slope) > 1.0)
+  if (abs (slope) > MAX_SLOPE)
     {
-      WARN << _("beam steeper than 1.0 (") << slope << ")\n";
-      slope = sign (slope);
+      WARN << _("beam too steep (") << slope << ")\n";
+      slope = sign (slope) * MAX_SLOPE;
     }
 
-  sidx = int (rint (slope *  20.0));
-  slope = sidx / 20.0;
+  sidx = int (rint (slope / MAX_SLOPE *  SLOPES));
+  slope = MAX_SLOPE * sidx / SLOPES;
 
   Interval xdims = (*symtables_p_)("beamslopes")->lookup ("slope").dim_[X_AXIS];
   Real min_wid = xdims[LEFT];
index b87363a983fd65da528132adc185e0d023bd9274..a3676cc41c8cef1ef1f71d139e686920513b79af 100644 (file)
@@ -11,8 +11,9 @@ define_pixels(beamheight);
 pen beam_pen;
 beam_pen:=penrazor scaled beamheight rotated 90;
 
-elem_tan:=0.05;
+max_slope:=0.6;
 slopes:=20;
+elem_tan:=max_slope/slopes;
 lengths:=6;
 elem_factor := 2;
 elem_initial_len:=2;
index 7ef33a9b589d796830ddee68791f9b512f30948e..de568a52edbb004e79b3ca1a44a08ed0001f18ea 100644 (file)
@@ -1,5 +1,5 @@
 % Creator: mf-to-table.py version 0.4
-% Automatically generated on Sat Dec 13 20:07:15 1997
+% Automatically generated on Wed Dec 24 11:21:35 1997
 % Do not edit
 % input from out/feta16.log
 % name
index fcdb256a0d3fef0906dcbe2046152f1a723300db..2e5abeb193c9e3725faaa174d76e2fcd357b62be 100644 (file)
@@ -1,5 +1,5 @@
 % Creator: mf-to-table.py version 0.4
-% Automatically generated on Sat Dec 13 20:07:39 1997
+% Automatically generated on Wed Dec 24 11:21:40 1997
 % Do not edit
 % input from out/feta20.log
 % name