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
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 ();
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.
*/
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));
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:
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 */
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)
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"));
end_beam ();
}
}
+ forbid_ = 0;
}
void
"stemRightBeamCount. "
,
/* creats*/ "Beam",
-/* accepts */ "",
+/* accepts */ "beam-forbid-event",
/* acks */ "stem-interface rest-interface beam-interface bar-line-interface",
/* reads */ "autoBeaming autoBeamSettings beatLength subdivideBeams",
/* write */ "");