- 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_];
+ Moment stop_mom = note->get_length () + ptr->audio_column_->at_mom ();
+
+ 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_pitch () == note->get_pitch ())
+ {
+ if (stop_note_queue[i].key < stop_mom)
+ {
+ /* let stopnote in queue be ignored,
+ new stop note wins */
+ stop_note_queue[i].ignore_b_ = true;
+ /* don't replay start note, */
+ play_start = false;
+ break;
+ }
+ else
+ {
+ /* skip this stopnote,
+ don't play the start note */
+ delete note;
+ note = 0;
+ break;
+ }
+ }
+ }
+
+ if (note)
+ {
+ Midi_note_event e;
+ e.val = new Midi_note_off (note);
+ e.key = stop_mom;
+ stop_note_queue.insert (e);
+
+ if (play_start)
+ output_event (ptr->audio_column_->at_mom (), note);