source file of the GNU LilyPond music typesetter
- (c) 1997--2005 Han-Wen Nienhuys <hanwen@xs4all.nl>
+ (c) 1997--2007 Han-Wen Nienhuys <hanwen@xs4all.nl>
*/
+#include "engraver.hh"
+
#include "context.hh"
#include "directional-element-interface.hh"
-#include "engraver.hh"
+#include "duration.hh"
+#include "international.hh"
#include "item.hh"
#include "misc.hh"
#include "rhythmic-head.hh"
#include "staff-symbol-referencer.hh"
#include "stem-tremolo.hh"
#include "stem.hh"
-#include "duration.hh"
+#include "stream-event.hh"
+
+#include "translator.icc"
-/**
- Make stems upon receiving noteheads.
-*/
class Stem_engraver : public Engraver
{
Grob *stem_;
Grob *tremolo_;
- Music *rhythmic_ev_;
- Music *tremolo_ev_;
+ Stream_event *rhythmic_ev_;
+ Stream_event *tremolo_ev_;
TRANSLATOR_DECLARATIONS (Stem_engraver);
protected:
void make_stem (Grob_info);
+ DECLARE_TRANSLATOR_LISTENER (tremolo);
DECLARE_ACKNOWLEDGER (rhythmic_head);
void stop_translation_timestep ();
- virtual bool try_music (Music *);
};
Stem_engraver::Stem_engraver ()
{
/* Announce the cause of the head as cause of the stem. The
stem needs a rhythmic structure to fit it into a beam. */
- stem_ = make_item ("Stem", gi.music_cause ()->self_scm ());
-
- /*
- we take the duration log from the Event, since the duration-log
- for a note head is always <= 2.
- */
- Music *music = gi.music_cause ();
- Duration *dur = unsmob_duration (music->get_property ("duration"));
-
- stem_->set_property ("duration-log", dur ? scm_from_int (dur->duration_log ()) : 0);
+ stem_ = make_item ("Stem", gi.grob ()->self_scm ());
if (tremolo_ev_)
{
else
context ()->set_property ("tremoloFlags", scm_from_int (requested_type));
+
+ /*
+ we take the duration log from the Event, since the duration-log
+ for a note head is always <= 2.
+ */
+ Stream_event *ev = gi.event_cause ();
+ Duration *dur = unsmob_duration (ev->get_property ("duration"));
+
int tremolo_flags = intlog2 (requested_type) - 2
- (dur->duration_log () > 2 ? dur->duration_log () - 2 : 0);
if (tremolo_flags <= 0)
if (Rhythmic_head::get_stem (gi.grob ()))
return;
- Music *cause = gi.music_cause ();
+ Stream_event *cause = gi.event_cause ();
if (!cause)
return;
Duration *d = unsmob_duration (cause->get_property ("duration"));
if (Stem::duration_log (stem_) != d->duration_log ())
{
// FIXME:
- gi.music_cause ()->origin ()->warning (_f ("adding note head to incompatible stem (type = %d)",
+ gi.event_cause ()->origin ()->warning (_f ("adding note head to incompatible stem (type = %d)",
1 << Stem::duration_log (stem_)));
- gi.music_cause ()->origin ()->warning (_f ("maybe input should specify polyphonic voices"));
+ gi.event_cause ()->origin ()->warning (_f ("maybe input should specify polyphonic voices"));
}
Stem::add_head (stem_, gi.grob ());
tremolo_ev_ = 0;
}
-bool
-Stem_engraver::try_music (Music *m)
+IMPLEMENT_TRANSLATOR_LISTENER (Stem_engraver, tremolo);
+void
+Stem_engraver::listen_tremolo (Stream_event *ev)
{
- if (m->is_mus_type ("tremolo-event"))
- {
- tremolo_ev_ = m;
- return true;
- }
- return false;
+ ASSIGN_EVENT_ONCE (tremolo_ev_, ev);
}
-#include "translator.icc"
ADD_ACKNOWLEDGER (Stem_engraver, rhythmic_head);
+
ADD_TRANSLATOR (Stem_engraver,
+
/* doc */ "Create stems and single-stem tremolos. It also works together with "
"the beam engraver for overriding beaming.",
- /* create */ "Stem StemTremolo",
- /* accept */ "tremolo-event",
- /* read */ "tremoloFlags stemLeftBeamCount stemRightBeamCount",
+
+ /* create */
+ "Stem "
+ "StemTremolo ",
+
+ /* read */
+ "tremoloFlags "
+ "stemLeftBeamCount "
+ "stemRightBeamCount ",
+
/* write */ "");