/*
This file is part of LilyPond, the GNU music typesetter.
- Copyright (C) 1998--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
+ Copyright (C) 1998--2015 Han-Wen Nienhuys <hanwen@xs4all.nl>
LilyPond is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
}
};
-
class Tie_performer : public Performer
{
Stream_event *event_;
void start_translation_timestep ();
virtual void acknowledge_audio_element (Audio_element_info);
void process_music ();
- DECLARE_TRANSLATOR_LISTENER (tie);
+ void listen_tie (Stream_event *);
public:
TRANSLATOR_DECLARATIONS (Tie_performer);
};
-Tie_performer::Tie_performer ()
+Tie_performer::Tie_performer (Context *c)
+ : Performer (c)
{
event_ = 0;
}
-IMPLEMENT_TRANSLATOR_LISTENER (Tie_performer, tie);
void
Tie_performer::listen_tie (Stream_event *ev)
{
else
now_heads_.push_back (inf_mom);
- // Find a previous note that ties to the current note. If it exists,
+ // Find a previous note that ties to the current note. If it exists,
// remove it from the heads_to_tie vector and create the tie
list<Head_audio_event_tuple>::iterator it;
bool found = false;
Stream_event *right_mus = inf.event_;
- for (it = heads_to_tie_.begin ();
- !found && (it != heads_to_tie_.end());
- it++)
- {
- Audio_element_info et = (*it).head_;
- Audio_note *th = dynamic_cast<Audio_note *> (et.elem_);
- Stream_event *left_mus = et.event_;
-
- if (th && right_mus && left_mus
- && ly_is_equal (right_mus->get_property ("pitch"),
- left_mus->get_property ("pitch")))
- {
- found = true;
- // (*it).moment_ already stores the end of the tied note!
- Moment skip = now_mom() - (*it).end_moment_;
- an->tie_to (th, skip);
- // this invalidates the iterator, we are leaving the loop anyway
- heads_to_tie_.erase (it);
- }
- }
+ for (it = heads_to_tie_.begin ();
+ !found && (it != heads_to_tie_.end ());
+ it++)
+ {
+ Audio_element_info et = (*it).head_;
+ Audio_note *th = dynamic_cast<Audio_note *> (et.elem_);
+ Stream_event *left_mus = et.event_;
+
+ if (th && right_mus && left_mus
+ && ly_is_equal (right_mus->get_property ("pitch"),
+ left_mus->get_property ("pitch")))
+ {
+ found = true;
+ // (*it).moment_ already stores the end of the tied note!
+ Moment skip = now_mom () - (*it).end_moment_;
+ an->tie_to (th, skip);
+ it = heads_to_tie_.erase (it);
+ }
+ }
+ if (found)
+ return;
+ for (it = heads_to_tie_.begin ();
+ !found && (it != heads_to_tie_.end ());
+ it++)
+ {
+ Audio_element_info et = (*it).head_;
+ Audio_note *th = dynamic_cast<Audio_note *> (et.elem_);
+ Stream_event *left_mus = et.event_;
+
+ if (!(th && right_mus && left_mus))
+ continue;
+
+ SCM p1 = left_mus->get_property ("pitch");
+ SCM p2 = right_mus->get_property ("pitch");
+ if (unsmob<Pitch> (p1) && unsmob<Pitch> (p2)
+ && unsmob<Pitch> (p1)->tone_pitch () == unsmob<Pitch> (p2)->tone_pitch ())
+ {
+ found = true;
+ // (*it).moment_ already stores the end of the tied note!
+ Moment skip = now_mom () - (*it).end_moment_;
+ an->tie_to (th, skip);
+ it = heads_to_tie_.erase (it);
+ }
+ }
}
}
Tie_performer::start_translation_timestep ()
{
context ()->set_property ("tieMelismaBusy",
- ly_bool2scm (heads_to_tie_.size ()));
+ ly_bool2scm (heads_to_tie_.size ()));
}
// a predicate implemented as a class, used to delete all tied notes with end
Moment now;
public:
end_moment_passed (Moment mom) : now (mom) {}
- bool operator() (const Head_audio_event_tuple &value) {
+ bool operator () (const Head_audio_event_tuple &value)
+ {
return (value.end_moment_ <= now);
}
};
now_tied_heads_.clear ();
}
+void
+Tie_performer::boot ()
+{
+ ADD_LISTENER (Tie_performer, tie);
+}
+
ADD_TRANSLATOR (Tie_performer,
- /* doc */
- "Generate ties between note heads of equal pitch.",
+ /* doc */
+ "Generate ties between note heads of equal pitch.",
- /* create */
- "",
+ /* create */
+ "",
- /* read */
- "tieWaitForNote",
+ /* read */
+ "tieWaitForNote",
- /* write */
- "tieMelismaBusy"
- );
+ /* write */
+ "tieMelismaBusy"
+ );