+ Find out if start_note event is needed, and do it if needed.
+*/
+void
+Midi_walker::do_start_note (Midi_note *note)
+{
+ Audio_item *ptr = items_[index_];
+ assert (note->audio_ == ptr);
+ int stop_ticks = int (moment_to_real (note->audio_->length_mom_) * Real (384 * 4))
+ + ptr->audio_column_->ticks ();
+
+ bool play_start = true;
+ for (vsize i = 0; i < stop_note_queue.size (); i++)
+ {
+ /* if this pith already in queue */
+ if (stop_note_queue[i].val->get_semitone_pitch ()
+ == note->get_semitone_pitch ())
+ {
+ if (stop_note_queue[i].key < stop_ticks)
+ {
+ /* let stopnote in queue be ignored,
+ new stop note wins */
+ stop_note_queue[i].ignore_ = true;
+
+ /* don't replay start note, */
+ play_start = false;
+ break;
+ }
+ else
+ {
+ /* skip this stopnote,
+ don't play the start note */
+ note = 0;
+ break;
+ }
+ }
+ }
+
+ if (note)
+ {
+ Midi_note_event e;
+ e.val = new Midi_note_off (note);
+
+ midi_events_.push_back (e.val);
+ e.key = int (stop_ticks);
+ stop_note_queue.insert (e);
+
+ if (play_start)
+ output_event (ptr->audio_column_->ticks (), note);
+ }
+}
+