- while (stop_notes.size() && stop_notes.front_idx() <= max_moment) {
- Moment stop_moment = stop_notes.front_idx();
- Melodic_req * req_l = stop_notes.get();
-
- Midi_note note(req_l, track_l_->number_i_, false);
- output_event(note, stop_moment);
+ Audio_item *ptr = items_[index_];
+ 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);