]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/beaming-pattern.cc
Merge branch 'lilypond/translation' of ssh://git.sv.gnu.org/srv/git/lilypond into...
[lilypond.git] / lily / beaming-pattern.cc
index 1841f67900f468f0bea324712ebb0103887ecd56..5e6d29ca6816049d0005587be178c919294a43c3 100644 (file)
@@ -1,5 +1,5 @@
 /*
-  beaming-info.cc -- implement Beam_rhythmic_element, Beaming_pattern
+  beaming-pattern.cc -- implement Beam_rhythmic_element, Beaming_pattern
 
   A Beaming_pattern object takes a set of stems at given moments and calculates
   the pattern of their beam. That is, it works out, for each stem, how many
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1999--2007 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 1999--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
-#include "beaming-pattern.hh"
 #include "context.hh"
+#include "beam-settings.hh"
+#include "beaming-pattern.hh"
 
 /*
   Represents a stem belonging to a beam. Sometimes (for example, if the stem
@@ -52,7 +53,7 @@ Beam_rhythmic_element::de_grace ()
 {
   if (start_moment_.grace_part_)
     {
-      start_moment_.main_part_ = start_moment_.grace_part_; 
+      start_moment_.main_part_ = start_moment_.grace_part_;
       start_moment_.grace_part_ = 0;
     }
 }
@@ -70,7 +71,7 @@ Beam_rhythmic_element::count (Direction d) const
   CENTER.
 */
 Direction
-Beaming_pattern::flag_direction (vsize i) const
+Beaming_pattern::flag_direction (Beaming_options const &options, vsize i) const
 {
   // The extremal stems shouldn't be messed with, so it's appropriate to
   // return CENTER here also.
@@ -81,6 +82,16 @@ Beaming_pattern::flag_direction (vsize i) const
   int left_count = infos_[i-1].count (RIGHT);
   int right_count = infos_[i+1].count (LEFT);
 
+  // If we are told to subdivide beams and we are next to a beat, point the
+  // beamlet away from the beat.
+  if (options.subdivide_beams_)
+    {
+      if (infos_[i].rhythmic_importance_ < 0)
+       return RIGHT;
+      else if (infos_[i+1].rhythmic_importance_ < 0)
+       return LEFT;
+    }
+
   if (count <= left_count && count <= right_count)
     return CENTER;
 
@@ -123,12 +134,12 @@ Beaming_pattern::beamify (Beaming_options const &options)
 
   for (vsize i = 1; i < infos_.size () - 1; i++)
     {
-      Direction non_flag_dir = other_dir (flag_direction (i));
+      Direction non_flag_dir = other_dir (flag_direction (options, i));
       if (non_flag_dir)
        {
          int importance = (non_flag_dir == LEFT)
            ? infos_[i].rhythmic_importance_ : infos_[i+1].rhythmic_importance_;
-         int count = (importance < 0)
+         int count = (importance < 0 && options.subdivide_beams_)
            ? 1 : min (infos_[i].count (non_flag_dir),
                       infos_[i+non_flag_dir].count (-non_flag_dir));
 
@@ -140,7 +151,7 @@ Beaming_pattern::beamify (Beaming_options const &options)
 void
 Beaming_pattern::find_rhythmic_importance (Beaming_options const &options)
 {
-  Moment measure_pos (0);  
+  Moment measure_pos (0);
   SCM grouping = options.grouping_;
   vsize i = 0;
 
@@ -233,10 +244,10 @@ Beaming_pattern::beamlet_count (int i, Direction d) const
 void
 Beaming_options::from_context (Context *context)
 {
-  grouping_ = context->get_property ("beatGrouping");
+  grouping_ = ly_beat_grouping (context->self_scm ());
   subdivide_beams_ = to_boolean (context->get_property ("subdivideBeams"));
   beat_length_ = robust_scm2moment (context->get_property ("beatLength"), Moment (1, 4));
-  measure_length_ = robust_scm2moment (context->get_property ("measureLength"), Moment (1, 4));
+  measure_length_ = robust_scm2moment (context->get_property ("measureLength"), Moment (4, 4));
 }
 
 Beaming_options::Beaming_options ()