+void
+Note_performer::listen_tie (Stream_event *ev)
+{
+ script_evs_.push_back (ev);
+}
+
+void
+Note_performer::listen_articulation (Stream_event *ev)
+{
+ script_evs_.push_back (ev);
+}
+
+void
+Note_performer::listen_breathing (Stream_event *ev)
+{
+ //Shorten previous note if needed
+ SCM f = ev->get_property ("midi-length");
+ if (ly_is_procedure (f))
+ for (vsize i = 0; i < last_notes_.size (); i++)
+ {
+ //Pass midi-length the available time since the last note started,
+ //including any intervening rests. It returns how much is left for the
+ //note.
+ Moment start = last_notes_[i]->audio_column_->when ();
+ Moment available = now_mom () - start;
+ Moment len = robust_scm2moment (scm_call_2 (f, available.smobbed_copy (),
+ context ()->self_scm ()), available);
+ //Take time from the first note of the tie, since it has all the length.
+ Audio_note *tie_head = last_notes_[i]->tie_head ();
+ len += start - tie_head->audio_column_->when ();
+ if (len < tie_head->length_mom_)
+ tie_head->length_mom_ = len;
+ }
+}
+
+void
+Note_performer::boot ()
+{
+ ADD_LISTENER (Note_performer, note);
+ ADD_LISTENER (Note_performer, breathing);
+ ADD_LISTENER (Note_performer, tie);
+ ADD_LISTENER (Note_performer, articulation);
+}
+
+ADD_TRANSLATOR (Note_performer,
+ /* doc */
+ "",
+
+ /* create */
+ "",
+
+ /* read */
+ "",
+
+ /* write */
+ ""
+ );