/*
completion-note-heads-engraver.cc -- Completion_heads_engraver
- (c) 1997--2005 Han-Wen Nienhuys <hanwen@cs.uu.nl>
+ (c) 1997--2006 Han-Wen Nienhuys <hanwen@xs4all.nl>
*/
#include <cctype>
+using namespace std;
-#include "rhythmic-head.hh"
-#include "output-def.hh"
-#include "music.hh"
-#include "dots.hh"
#include "dot-column.hh"
-#include "staff-symbol-referencer.hh"
+#include "dots.hh"
+#include "duration.hh"
+#include "global-context.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 "global-context.hh"
-#include "duration.hh"
-#include "pitch.hh"
+#include "warn.hh"
+
+#include "translator.icc"
/*
TODO: make matching rest engraver.
class Completion_heads_engraver : public Engraver
{
- Link_array<Item> notes_;
- Link_array<Item> prev_notes_;
- Link_array<Grob> ties_;
+ vector<Item*> notes_;
+ vector<Item*> prev_notes_;
+ vector<Grob*> ties_;
- Link_array<Item> dots_;
- Link_array<Music> note_events_;
- Link_array<Music> scratch_note_events_;
+ vector<Item*> dots_;
+ vector<Stream_event*> note_events_;
+ vector<Stream_event*> 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;
}
-bool
-Completion_heads_engraver::try_music (Music *m)
+IMPLEMENT_TRANSLATOR_LISTENER (Completion_heads_engraver, note);
+void
+Completion_heads_engraver::listen_note (Stream_event *ev)
{
- if (m->is_mus_type ("note-event"))
- {
- note_events_.push (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);
+ note_events_.push_back (ev);
+
+ is_first_ = true;
+ Moment musiclen = get_event_length (ev);
+ Moment now = now_mom ();
- return true;
+ if (now_mom ().grace_part_)
+ {
+ musiclen.grace_part_ = musiclen.main_part_;
+ musiclen.main_part_ = Rational (0, 1);
}
- else if (m->is_mus_type ("busy-playing-event"))
- return note_events_.size () && is_first_;
- return false;
+ note_end_mom_ = max (note_end_mom_, (now + musiclen));
+ do_nothing_until_ = Rational (0, 0);
}
/*
if (orig && note_dur.get_length () != orig->get_length ())
{
if (!scratch_note_events_.size ())
- for (int i = 0; i < note_events_.size (); i++)
+ for (vsize i = 0; i < note_events_.size (); i++)
{
- Music *m = note_events_[i]->clone ();
- scratch_note_events_.push (m);
+ Stream_event *m = note_events_[i]->clone ();
+ scratch_note_events_.push_back (m);
}
}
-
- for (int i = 0;
- left_to_do_ && i < note_events_.size (); i++)
+ else
+ {
+ for (vsize i = 0; i < note_events_.size (); i++)
+ {
+ Stream_event *c = note_events_[i]->clone ();
+ scratch_note_events_.push_back (c);
+ }
+ }
+
+ for (vsize i = 0; left_to_do_ && i < note_events_.size (); i++)
{
- Music *event = note_events_[i];
+ Stream_event *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);
- /*
- 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_property ("dot-count", scm_from_int (dots));
d->set_parent (note, Y_AXIS);
- dots_.push (d);
+ dots_.push_back (d);
}
Pitch *pit = unsmob_pitch (event->get_property ("pitch"));
pos += scm_to_int (c0);
note->set_property ("staff-position", scm_from_int (pos));
- notes_.push (note);
+ notes_.push_back (note);
}
if (prev_notes_.size () == notes_.size ())
{
- for (int i = 0; i < notes_.size (); i++)
+ for (vsize i = 0; i < notes_.size (); i++)
{
Grob *p = make_spanner ("Tie", SCM_EOL);
- Tie::set_interface (p); // cannot remove yet!
-
Tie::set_head (p, LEFT, prev_notes_[i]);
Tie::set_head (p, RIGHT, notes_[i]);
- ties_.push (p);
+ ties_.push_back (p);
}
}
dots_.clear ();
- for (int i = scratch_note_events_.size (); i--;)
+ for (vsize i = scratch_note_events_.size (); i--;)
scratch_note_events_[i]->unprotect ();
scratch_note_events_.clear ();
{
}
-#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 */ "busy-playing-event note-event",
- /* read */ "middleCPosition measurePosition measureLength",
+ /* create */
+ "NoteHead "
+ "Dots "
+ "Tie",
+ /* read */
+ "middleCPosition "
+ "measurePosition "
+ "measureLength",
+
/* write */ "");