#include <cctype>
using namespace std;
-#include "dot-column.hh"
+#include "rhythmic-head.hh"
+#include "output-def.hh"
+#include "music.hh"
#include "dots.hh"
-#include "duration.hh"
-#include "global-context.hh"
+#include "dot-column.hh"
+#include "staff-symbol-referencer.hh"
#include "item.hh"
-#include "output-def.hh"
-#include "pitch.hh"
-#include "rhythmic-head.hh"
#include "score-engraver.hh"
+#include "warn.hh"
#include "spanner.hh"
-#include "staff-symbol-referencer.hh"
-#include "stream-event.hh"
#include "tie.hh"
-#include "warn.hh"
-
-#include "translator.icc"
+#include "global-context.hh"
+#include "duration.hh"
+#include "pitch.hh"
/*
TODO: make matching rest engraver.
vector<Grob*> ties_;
vector<Item*> dots_;
- vector<Stream_event*> note_events_;
- vector<Stream_event*> scratch_note_events_;
+ vector<Music*> note_events_;
+ vector<Music*> scratch_note_events_;
Moment note_end_mom_;
bool is_first_;
protected:
virtual void initialize ();
void start_translation_timestep ();
+ virtual bool try_music (Music *event);
void process_music ();
void stop_translation_timestep ();
- DECLARE_TRANSLATOR_LISTENER (note);
};
void
is_first_ = false;
}
-IMPLEMENT_TRANSLATOR_LISTENER (Completion_heads_engraver, note);
-void
-Completion_heads_engraver::listen_note (Stream_event *ev)
+bool
+Completion_heads_engraver::try_music (Music *m)
{
- note_events_.push_back (ev);
-
- is_first_ = true;
- Moment musiclen = get_event_length (ev);
- Moment now = now_mom ();
-
- if (now_mom ().grace_part_)
+ if (m->is_mus_type ("note-event"))
{
- musiclen.grace_part_ = musiclen.main_part_;
- musiclen.main_part_ = Rational (0, 1);
+ note_events_.push_back (m);
+
+ is_first_ = true;
+ Moment musiclen = m->get_length ();
+ Moment now = now_mom ();
+
+ if (now_mom ().grace_part_)
+ {
+ musiclen.grace_part_ = musiclen.main_part_;
+ musiclen.main_part_ = Rational (0, 1);
+ }
+ note_end_mom_ = max (note_end_mom_, (now + musiclen));
+ do_nothing_until_ = Rational (0, 0);
+
+ return true;
}
+ else if (m->is_mus_type ("busy-playing-event"))
+ return note_events_.size () && is_first_;
- note_end_mom_ = max (note_end_mom_, (now + musiclen));
- do_nothing_until_ = Rational (0, 0);
+ return false;
}
/*
if (!scratch_note_events_.size ())
for (vsize i = 0; i < note_events_.size (); i++)
{
- Stream_event *m = note_events_[i]->clone ();
+ Music *m = note_events_[i]->clone ();
scratch_note_events_.push_back (m);
}
}
for (vsize i = 0; left_to_do_ && i < note_events_.size (); i++)
{
- Stream_event *event = note_events_[i];
+ Music *event = note_events_[i];
if (scratch_note_events_.size ())
{
event = scratch_note_events_[i];
Item *d = make_item ("Dots", SCM_EOL);
Rhythmic_head::set_dots (note, d);
- d->set_property ("dot-count", scm_from_int (dots));
+ /*
+ measly attempt to save an eeny-weenie bit of memory.
+ */
+ if (dots != scm_to_int (d->get_property ("dot-count")))
+ d->set_property ("dot-count", scm_from_int (dots));
d->set_parent (note, Y_AXIS);
dots_.push_back (d);
{
}
+#include "translator.icc"
+
ADD_TRANSLATOR (Completion_heads_engraver,
/* doc */ "This engraver replaces "
"@code{Note_heads_engraver}. It plays some trickery to "
"break long notes and automatically tie them into the next measure.",
- /* create */
- "NoteHead "
- "Dots "
- "Tie",
-
- /* accept */ "note-event",
- /* read */
- "middleCPosition "
- "measurePosition "
- "measureLength",
-
+ /* create */ "NoteHead Dots Tie",
+ /* accept */ "busy-playing-event note-event",
+ /* read */ "middleCPosition measurePosition measureLength",
/* write */ "");