/*
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 "music.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;
- }
- else if (m->is_mus_type ("busy-playing-event"))
+ if (now_mom ().grace_part_)
{
- return note_events_.size () && is_first_;
+ musiclen.grace_part_ = musiclen.main_part_;
+ musiclen.main_part_ = Rational (0, 1);
}
- return false;
+ note_end_mom_ = max (note_end_mom_, (now + musiclen));
+ do_nothing_until_ = Rational (0, 0);
}
/*
continue;
}
else
- {
- d = Duration (d.duration_log () + 1, 2);
- }
+ d = Duration (d.duration_log () + 1, 2);
}
if (d.duration_log () >= log_limit)
Duration note_dur;
Duration *orig = 0;
if (left_to_do_)
- {
- note_dur = find_nearest_duration (left_to_do_);
- }
+ note_dur = find_nearest_duration (left_to_do_);
else
{
orig = unsmob_duration (note_events_[0]->get_property ("duration"));
}
if (orig)
- {
- left_to_do_ = orig->get_length ();
- }
+ left_to_do_ = orig->get_length ();
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++)
+ 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];
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);
}
}
*/
if (orig
&& now_mom ().grace_part_)
- {
- left_to_do_ = Rational (0, 0);
- }
+ left_to_do_ = Rational (0, 0);
}
void
dots_.clear ();
- for (int i = scratch_note_events_.size (); i--;)
- {
- scratch_note_events_[i]->unprotect ();
- }
+ 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,
- /* descr */ "This engraver replaces "
+ /* doc */ "This engraver replaces "
"@code{Note_heads_engraver}. It plays some trickery to "
"break long notes and automatically tie them into the next measure.",
- /* creats*/ "NoteHead Dots Tie",
- /* accepts */ "busy-playing-event note-event",
- /* reads */ "middleCPosition measurePosition measureLength",
+ /* create */ "NoteHead Dots Tie",
+ /* accept */ "note-event",
+ /* read */ "middleCPosition measurePosition measureLength",
/* write */ "");