]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/auto-beam-engraver.cc
* lily/auto-beam-engraver.cc (try_music): accept and process
[lilypond.git] / lily / auto-beam-engraver.cc
index 42e3935d8de364475545a473d8ad6fff3931cadb..4156afeffa886b7426a8f02f3d163df35b6d9537 100644 (file)
@@ -3,7 +3,7 @@
   
   source file of the GNU LilyPond music typesetter
   
-  (c) 1999--2003 Jan Nieuwenhuizen <janneke@gnu.org>
+  (c) 1999--2004 Jan Nieuwenhuizen <janneke@gnu.org>
   
  */
 
 #include "item.hh"
 #include "spanner.hh"
 #include "duration.hh"
+#include "context.hh"
 
 /*
-  TODO: figure what to do in grace?
-
   TODO: documentme.
  */
 class Auto_beam_engraver : public Engraver
@@ -32,6 +31,7 @@ protected:
   virtual void stop_translation_timestep ();
   virtual void start_translation_timestep ();
   virtual void process_music ();
+  virtual bool try_music (Music*);
   virtual void finalize ();
   virtual void acknowledge_grob (Grob_info);
   virtual void process_acknowledged_grobs ();
@@ -44,9 +44,10 @@ private:
   void begin_beam ();
   void end_beam ();
   void junk_beam ();
-  bool same_grace_state_b (Grob* e);
+  bool is_same_grace_state (Grob* e);
   void typeset_beam ();
 
+  Music *forbid_;
   /*
     shortest_mom is the shortest note in the beam.
    */
@@ -82,11 +83,18 @@ Auto_beam_engraver::process_music ()
       consider_end (shortest_mom_);
       junk_beam ();
     }
+
+  if (forbid_)
+    {
+      consider_end (shortest_mom_);
+      junk_beam ();
+    }
 }
 
 
 Auto_beam_engraver::Auto_beam_engraver ()
 {
+  forbid_ = 0;
   count_ = 0;
   stems_ = 0;
   shortest_mom_ = Moment (Rational (1, 8));
@@ -96,6 +104,19 @@ Auto_beam_engraver::Auto_beam_engraver ()
   beam_settings_ = SCM_EOL;  
 }
 
+
+bool
+Auto_beam_engraver::try_music (Music*m)
+{
+  if (m->is_mus_type  ("beam-forbid-event"))
+    {
+      forbid_ = m;
+      return true;
+    }
+
+  return false;
+}
+
 /*
   Determine end moment for auto beaming (or begin moment, but mostly
   0==anywhere) In order of increasing priority:
@@ -145,6 +166,10 @@ Auto_beam_engraver::test_moment (Direction dir, Moment test_mom)
   SCM type = scm_list_n (scm_int2num (test_mom.num ()),
                      scm_int2num (test_mom.den ()), SCM_UNDEFINED);
 
+  /*
+    UGH UGH.
+    settings aren't grob-properties.
+   */
   SCM settings = get_property ("autoBeamSettings");
   
   /* first guess */
@@ -215,7 +240,8 @@ void
 Auto_beam_engraver::consider_begin (Moment test_mom)
 {
   bool on = to_boolean (get_property ("autoBeaming"));
-  if (!stems_ && on)
+  if (!stems_ && on
+      && !forbid_)
     {
       bool b = test_moment (START, test_mom);
       if (b)
@@ -274,7 +300,7 @@ Auto_beam_engraver::begin_beam ()
   
   stems_ = new Link_array<Item>;
   grouping_ = new Beaming_info_list;
-  beam_settings_ = get_property ("Beam");
+  beam_settings_ = updated_grob_properties (daddy_context_, ly_symbol2scm ("Beam"));
   
   beam_start_moment_ = now_mom ();
   beam_start_location_ = *unsmob_moment (get_property ("measurePosition"));
@@ -348,6 +374,7 @@ Auto_beam_engraver::start_translation_timestep ()
          end_beam ();
        }
     }
+  forbid_ = 0;
 }
 
 void
@@ -506,7 +533,7 @@ ENTER_DESCRIPTION (Auto_beam_engraver,
 "stemRightBeamCount. "
 ,
 /* creats*/       "Beam",
-/* accepts */     "",
+/* accepts */     "beam-forbid-event",
 /* acks  */      "stem-interface rest-interface beam-interface bar-line-interface",
 /* reads */       "autoBeaming autoBeamSettings beatLength subdivideBeams",
 /* write */       "");