/*
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 "event.hh"
+#include "music.hh"
#include "dots.hh"
#include "dot-column.hh"
#include "staff-symbol-referencer.hh"
#include "spanner.hh"
#include "tie.hh"
#include "global-context.hh"
+#include "duration.hh"
+#include "pitch.hh"
/*
TODO: make matching rest engraver.
longer than what's specified, than what is left to do and it should
not cross barlines.
- We copy the reqs into scratch note reqs, to make sure that we get
+ We copy the events into scratch note events, to make sure that we get
all durations exactly right.
*/
Link_array<Grob> ties_;
Link_array<Item> dots_;
- Link_array<Music> note_reqs_;
- Link_array<Music> scratch_note_reqs_;
+ Link_array<Music> note_events_;
+ Link_array<Music> scratch_note_events_;
Moment note_end_mom_;
bool is_first_;
protected:
virtual void initialize ();
- virtual void start_translation_timestep ();
- virtual bool try_music (Music *req);
- virtual void process_music ();
- virtual void stop_translation_timestep ();
+ void start_translation_timestep ();
+ virtual bool try_music (Music *event);
+ void process_music ();
+ void stop_translation_timestep ();
};
void
{
if (m->is_mus_type ("note-event"))
{
- note_reqs_.push (m);
+ note_events_.push (m);
is_first_ = true;
Moment musiclen = m->get_length ();
musiclen.grace_part_ = musiclen.main_part_;
musiclen.main_part_ = Rational (0, 1);
}
- note_end_mom_ = note_end_mom_ >? (now + musiclen);
+ 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_reqs_.size () && is_first_;
- }
+ return note_events_.size () && is_first_;
return false;
}
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_reqs_[0]->get_property ("duration"));
+ orig = unsmob_duration (note_events_[0]->get_property ("duration"));
note_dur = *orig;
}
Moment nb = next_barline_moment ();
}
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_reqs_.size ())
- for (int i = 0; i < note_reqs_.size (); i++)
+ if (!scratch_note_events_.size ())
+ for (int i = 0; i < note_events_.size (); i++)
{
- Music *m = note_reqs_[i]->clone ();
- scratch_note_reqs_.push (m);
+ Music *m = note_events_[i]->clone ();
+ scratch_note_events_.push (m);
}
}
for (int i = 0;
- left_to_do_ && i < note_reqs_.size (); i++)
+ left_to_do_ && i < note_events_.size (); i++)
{
- Music *req = note_reqs_[i];
- if (scratch_note_reqs_.size ())
+ Music *event = note_events_[i];
+ if (scratch_note_events_.size ())
{
- req = scratch_note_reqs_[i];
- SCM pits = note_reqs_[i]->get_property ("pitch");
- req->set_property ("pitch", pits);
+ event = scratch_note_events_[i];
+ SCM pits = note_events_[i]->get_property ("pitch");
+ event->set_property ("pitch", pits);
}
- req->set_property ("duration", note_dur.smobbed_copy ());
+ event->set_property ("duration", note_dur.smobbed_copy ());
- Item *note = make_item ("NoteHead", req->self_scm ());
+ Item *note = make_item ("NoteHead", event->self_scm ());
note->set_property ("duration-log",
- scm_int2num (note_dur.duration_log ()));
+ scm_from_int (note_dur.duration_log ()));
int dots = note_dur.dot_count ();
if (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_int2num (dots));
+ d->set_property ("dot-count", scm_from_int (dots));
d->set_parent (note, Y_AXIS);
dots_.push (d);
}
- Pitch *pit = unsmob_pitch (req->get_property ("pitch"));
+ Pitch *pit = unsmob_pitch (event->get_property ("pitch"));
int pos = pit->steps ();
SCM c0 = get_property ("middleCPosition");
if (scm_is_number (c0))
pos += scm_to_int (c0);
- note->set_property ("staff-position", scm_int2num (pos));
+ note->set_property ("staff-position", scm_from_int (pos));
notes_.push (note);
}
for (int 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]);
*/
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_reqs_.size (); i--;)
- {
- scm_gc_unprotect_object (scratch_note_reqs_[i]->self_scm ());
- }
+ for (int i = scratch_note_events_.size (); i--;)
+ scratch_note_events_[i]->unprotect ();
- scratch_note_reqs_.clear ();
+ scratch_note_events_.clear ();
}
void
Moment now = now_mom ();
if (note_end_mom_.main_part_ <= now.main_part_)
{
- note_reqs_.clear ();
+ note_events_.clear ();
prev_notes_.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",
- /* acks */ "",
- /* reads */ "middleCPosition measurePosition measureLength",
+ /* create */ "NoteHead Dots Tie",
+ /* accept */ "busy-playing-event note-event",
+ /* read */ "middleCPosition measurePosition measureLength",
/* write */ "");