]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/auto-beam-engraver.cc
Fix issue 1641 -- Make \noBeam terminate the current autobeam
[lilypond.git] / lily / auto-beam-engraver.cc
index cfb4234383e01714a3fdfbafc7a12f67eaf215ea..66b79fe008c59b0c2612c03425c2871af991c9cd 100644 (file)
@@ -1,7 +1,7 @@
 /*
   This file is part of LilyPond, the GNU music typesetter.
 
-  Copyright (C) 1999--2010 Jan Nieuwenhuizen <janneke@gnu.org>
+  Copyright (C) 1999--2011 Jan Nieuwenhuizen <janneke@gnu.org>
 
   LilyPond is free software: you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
@@ -45,6 +45,7 @@ protected:
   DECLARE_ACKNOWLEDGER (rest);
   DECLARE_ACKNOWLEDGER (beam);
   DECLARE_ACKNOWLEDGER (bar_line);
+  DECLARE_ACKNOWLEDGER (breathing_sign);
   DECLARE_ACKNOWLEDGER (stem);
   DECLARE_TRANSLATOR_LISTENER (beam_forbid);
 
@@ -61,7 +62,7 @@ private:
   bool is_same_grace_state (Grob *e);
   void recheck_beam ();
   void typeset_beam ();
-  vector<Item*> *remove_end_stems (vsize);
+  vector<Item *> *remove_end_stems (vsize);
 
   Stream_event *forbid_;
   /*
@@ -69,7 +70,7 @@ private:
   */
   Moment shortest_mom_;
   Spanner *finished_beam_;
-  vector<Item*> *stems_;
+  vector<Item *> *stems_;
 
   int process_acknowledged_count_;
   Moment last_add_mom_;
@@ -136,8 +137,10 @@ Auto_beam_engraver::process_music ()
 
   if (forbid_)
     {
-      consider_end (measure_position (context ()), shortest_mom_);
-      junk_beam ();
+      if (stems_)
+       end_beam ();
+      else
+       junk_beam ();
     }
 }
 
@@ -146,7 +149,7 @@ Auto_beam_engraver::Auto_beam_engraver ()
   forbid_ = 0;
   process_acknowledged_count_ = 0;
   stems_ = 0;
-  shortest_mom_ = Moment (Rational (1, 8));
+  shortest_mom_ = Moment (Rational (1, 4));
   finished_beam_ = 0;
   finished_grouping_ = 0;
   grouping_ = 0;
@@ -166,7 +169,7 @@ Auto_beam_engraver::test_moment (Direction dir, Moment test_mom, Moment dur)
   return scm_call_4 (get_property ("autoBeamCheck"),
                     context ()->self_scm (),
                     scm_from_int (dir),
-                     test_mom.smobbed_copy(),
+                     test_mom.smobbed_copy (),
                     dur.smobbed_copy ())
     != SCM_BOOL_F;
 }
@@ -208,7 +211,7 @@ Auto_beam_engraver::create_beam ()
       return 0;
 
   /*
-    Can't use make_spanner_from_properties () because we have to use
+    Can't use make_spanner () because we have to use
     beam_settings_.
   */
   Spanner *beam = new Spanner (beam_settings_);
@@ -230,7 +233,7 @@ Auto_beam_engraver::begin_beam ()
       return;
     }
 
-  stems_ = new vector<Item*>;
+  stems_ = new vector<Item *>;
   grouping_ = new Beaming_pattern ();
   beaming_options_.from_context (context ());
   beam_settings_ = updated_grob_properties (context (), ly_symbol2scm ("Beam"));
@@ -252,7 +255,7 @@ Auto_beam_engraver::junk_beam ()
   grouping_ = 0;
   beam_settings_ = SCM_EOL;
 
-  shortest_mom_ = Moment (Rational (1, 8));
+  shortest_mom_ = Moment (Rational (1, 4));
 }
 
 void
@@ -276,7 +279,7 @@ Auto_beam_engraver::end_beam ()
       beam_settings_ = SCM_EOL;
     }
 
-  shortest_mom_ = Moment (Rational (1, 8));
+  shortest_mom_ = Moment (Rational (1, 4));
 }
 
 void
@@ -331,6 +334,14 @@ Auto_beam_engraver::acknowledge_bar_line (Grob_info /* info */)
     end_beam ();
 }
 
+void
+Auto_beam_engraver::acknowledge_breathing_sign (Grob_info /* info */)
+{
+  check_bar_property ();
+  if (stems_)
+    end_beam ();
+}
+
 void
 Auto_beam_engraver::acknowledge_rest (Grob_info /* info */)
 {
@@ -384,16 +395,15 @@ Auto_beam_engraver::acknowledge_stem (Grob_info info)
   if (bool (beam_start_location_.grace_part_) != bool (now.grace_part_))
     return;
 
-  Moment ev_dur = unsmob_duration (ev->get_property ("duration"))->get_length ();
-  Moment dur = Rational (1, ev_dur.den ());
+  Moment dur = unsmob_duration (ev->get_property ("duration"))->get_length ();
   Moment measure_now = measure_position (context ());
-  bool recheck_needed = 0;
+  bool recheck_needed = false;
 
   if (dur < shortest_mom_)
     {
     /* new shortest moment, so store it and set recheck_needed */
     shortest_mom_ = dur;
-    recheck_needed = 1;
+    recheck_needed = true;
     }
 
   /* end should be based on shortest_mom_, begin should be
@@ -410,7 +420,8 @@ Auto_beam_engraver::acknowledge_stem (Grob_info info)
   stems_->push_back (stem);
   last_add_mom_ = now;
   extend_mom_ = max (extend_mom_, now) + get_event_length (ev, now);
-  if (recheck_needed) recheck_beam ();
+  if (recheck_needed)
+    recheck_beam ();
 }
 
 void
@@ -423,14 +434,14 @@ Auto_beam_engraver::recheck_beam ()
     the last part of the beam
   */
   Beaming_pattern *new_grouping_ = 0;
-  vector<Item*> *new_stems_ = 0;
+  vector<Item *> *new_stems_ = 0;
   Moment temporary_shortest_mom;
   SCM temporary_beam_settings;
 
   bool found_end;
 
 
-  for (vsize i = 0; i < stems_->size () - 1; )
+  for (vsize i = 0; i < stems_->size () - 1;)
     {
       found_end = test_moment (STOP,
                                grouping_->end_moment (i),
@@ -472,17 +483,17 @@ Auto_beam_engraver::recheck_beam ()
   from stems_, and return a vector containing all of the
   removed stems
 */
-vector <Item*> *
+vector <Item *> *
 Auto_beam_engraver::remove_end_stems (vsize split_index)
 {
-  vector <Item*> *removed_stems = 0;
-  removed_stems = new vector <Item*>;
+  vector <Item *> *removed_stems = 0;
+  removed_stems = new vector <Item *>;
 
-  for (vsize j=split_index + 1; j < stems_->size (); j++)
+  for (vsize j = split_index + 1; j < stems_->size (); j++)
     removed_stems->push_back ((*stems_).at (j));
-  for (vsize j=split_index + 1; j < stems_->size (); )
+  for (vsize j = split_index + 1; j < stems_->size ();)
     stems_->pop_back ();
-  return (removed_stems);
+  return removed_stems;
 }
 
 void
@@ -496,7 +507,6 @@ Auto_beam_engraver::process_acknowledged ()
     {
       Moment measure_now = measure_position (context ());
       consider_end (measure_now, shortest_mom_);
-      consider_begin (measure_now, shortest_mom_);
     }
   else if (process_acknowledged_count_ > 1)
     {
@@ -516,25 +526,28 @@ Auto_beam_engraver::process_acknowledged ()
 ADD_ACKNOWLEDGER (Auto_beam_engraver, stem);
 ADD_ACKNOWLEDGER (Auto_beam_engraver, bar_line);
 ADD_ACKNOWLEDGER (Auto_beam_engraver, beam);
+ADD_ACKNOWLEDGER (Auto_beam_engraver, breathing_sign);
 ADD_ACKNOWLEDGER (Auto_beam_engraver, rest);
 ADD_TRANSLATOR (Auto_beam_engraver,
-               /* doc */
-               "Generate beams based on measure characteristics and observed"
-               " Stems.  Uses @code{beatLength}, @code{measureLength}, and"
-               " @code{measurePosition} to decide when to start and stop a"
-               " beam.  Overriding beaming is done through"
-               " @ref{Stem_engraver} properties @code{stemLeftBeamCount} and"
-               " @code{stemRightBeamCount}.",
-
-               /* create */
-               "Beam ",
-
-               /* read */
-               "autoBeaming "
-               "beamSettings "
-               "beatLength "
-               "subdivideBeams ",
-
-               /* write */
-               ""
-               );
+                /* doc */
+                "Generate beams based on measure characteristics and observed"
+                " Stems.  Uses @code{baseMoment}, @code{beatStructure},"
+                " @code{beamExceptions}, @code{measureLength}, and"
+                " @code{measurePosition} to decide when to start and stop a"
+                " beam.  Overriding beaming is done through"
+                " @ref{Stem_engraver} properties @code{stemLeftBeamCount} and"
+                " @code{stemRightBeamCount}.",
+
+                /* create */
+                "Beam ",
+
+                /* read */
+                "autoBeaming "
+                "baseMoment "
+                "beamExceptions "
+                "beatStructure "
+                "subdivideBeams ",
+
+                /* write */
+                ""
+                );