]> git.donarmstrong.com Git - lilypond.git/commitdiff
* input/regression/beam-unconnected-beamlets.ly (Module): new file.
authorHan-Wen Nienhuys <hanwen@xs4all.nl>
Mon, 22 May 2006 15:23:33 +0000 (15:23 +0000)
committerHan-Wen Nienhuys <hanwen@xs4all.nl>
Mon, 22 May 2006 15:23:33 +0000 (15:23 +0000)
* lily/beam.cc (get_beam_segments): generate events for
max_connect_ case too.
(get_beam_segments): read Stem::max-beam-connect.

* lily/beam.cc (set_beaming): read clip-edges property.
(calc_direction): don't suicide for single stem.

ChangeLog
input/regression/beam-unconnected-beamlets.ly [new file with mode: 0644]
lily/beam.cc
lily/include/beam.hh
scm/define-grob-properties.scm

index af201e791bbc9aef23fb2a2692f161a21cf0d238..e82fb007e87a3d7fd83c9eac5cce074e23da6b7b 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,11 @@
 2006-05-22  Han-Wen Nienhuys  <hanwen@lilypond.org>
 
+       * input/regression/beam-unconnected-beamlets.ly (Module): new file.
+
+       * lily/beam.cc (get_beam_segments): generate events for
+       max_connect_ case too.
+       (get_beam_segments): read Stem::max-beam-connect.
+
        * input/regression/beam-single-stem.ly: new file.
 
        * lily/stem.cc (set_beaming): use #f as signaling value for
diff --git a/input/regression/beam-unconnected-beamlets.ly b/input/regression/beam-unconnected-beamlets.ly
new file mode 100644 (file)
index 0000000..5931fa1
--- /dev/null
@@ -0,0 +1,14 @@
+\header { texidoc = "By setting @code{max-beam-connect}, it is
+  possible to create pairs of unconnected beamlets."
+
+  }
+
+\layout {
+  ragged-right = ##t
+  }
+\version "2.9.6"
+
+\relative c'' {
+  \override Stem #'max-beam-connect = #1
+  c16[ c16]
+}
index 497957b465b9a101a04e91a5ebff19e6b1d28776..cf5e7c296c4728858a2499ba401f2b89a928f8d4 100644 (file)
@@ -52,6 +52,7 @@
 
 Beam_stem_segment::Beam_stem_segment ()
 {
+  max_connect_ = 1000;         // infinity
   stem_ = 0;
   width_ = 0.0;
   stem_x_ = 0.0;
@@ -128,10 +129,9 @@ Beam::calc_direction (SCM smob)
   /* Beams with less than 2 two stems don't make much sense, but could happen
      when you do
 
-     [r8 c8 r8].
+     r8[ c8 r8]
 
-     For a beam that  only has one stem, we try to do some disappearance magic:
-     we revert the flag, and move on to The Eternal Engraving Fields. */
+  */
 
   Direction dir = CENTER;
 
@@ -347,6 +347,8 @@ Beam::get_beam_segments (Grob *me_grob, Grob **common)
              seg.width_ = stem_width;
              seg.stem_index_ = i;
              seg.dir_ = d;
+             seg.max_connect_ = robust_scm2int (stem->get_property ("max-beam-connect"), 1000);
+             
              Direction stem_dir = get_grob_direction (stem);
              
              seg.gapped_
@@ -369,7 +371,8 @@ Beam::get_beam_segments (Grob *me_grob, Grob **common)
       vector_sort (segs, default_compare);
 
       Beam_segment current;
-      current.vertical_count_ = (*i).first;
+
+      int vertical_count =  (*i).first;
       for (vsize j = 0; j < segs.size (); j++)
        {
          /*
@@ -382,12 +385,14 @@ Beam::get_beam_segments (Grob *me_grob, Grob **common)
                                         j == segs.size() - 1 && event_dir==RIGHT);
              Drul_array<bool> inside (j > 0, j < segs.size()-1);
              bool event = on_bound[event_dir]
-               || abs (segs[j].rank_ - segs[j+event_dir].rank_) > 1;
+               || abs (segs[j].rank_ - segs[j+event_dir].rank_) > 1
+               || (abs (vertical_count) >= segs[j].max_connect_
+                   || abs (vertical_count) >= segs[j + event_dir].max_connect_);
              
              if (!event)
                continue;
 
-             current.vertical_count_ = (*i).first;
+             current.vertical_count_ = vertical_count;
              current.horizontal_[event_dir] = segs[j].stem_x_;
              if (segs[j].dir_ == event_dir)
                {
@@ -422,7 +427,6 @@ Beam::get_beam_segments (Grob *me_grob, Grob **common)
 
              if (event_dir == RIGHT)
                {
-                 current.vertical_count_ = (*i).first;
                  segments.push_back (current);
                  current = Beam_segment();
                }
index 0dbc485b53307fcc7b8cc9c33c9fdffd3980b9e1..f20556a69673eb667750a1daf4b294d632030c04 100644 (file)
@@ -40,7 +40,6 @@ struct Beam_quant_parameters
   void fill (Grob *him);
 };
 
-
 struct Beam_segment
 {
   int vertical_count_;
@@ -51,6 +50,7 @@ struct Beam_segment
 struct Beam_stem_segment 
 {
   Beam_stem_segment ();
+
   Grob *stem_;
   Real width_;
   Real stem_x_;
@@ -58,6 +58,8 @@ struct Beam_stem_segment
   int stem_index_;
   bool gapped_;
   Direction dir_;
+  int max_connect_;
+  
 };
 
 
index 5bcffdd929f3cacebdcdf844a30fd8e9959f0b9f..09d7187b5cd2b3c3f69cdd485931d6f6c63d9beb 100644 (file)
@@ -276,6 +276,8 @@ column is the start of a system.")
      (line-positions ,list? "Vertical positions of staff lines.")
      (line-thickness ,number? "The thickness of the tie/slur contour.")
      (long-text ,markup? "Text markup.  See @usermanref{Text markup}.")
+     (max-beam-connect ,integer? "Maximum number of beams to connect
+to beams from this stem. Further beams are typeset as beamlets.")
      (measure-length ,ly:moment? "Length of a
 measure. Used in some spacing situations.")