+ return (int)(((MidiEvent)o1).getTick() - ((MidiEvent)o2).getTick());
+ }
+ };
+ Collections.sort(noteOns, c);
+ Collections.sort(noteOffs, c);
+
+ // For each NoteOn event, finds its NoteOff event and replaces it with a MooNote.
+ Iterator iOn = noteOns.iterator(), iOff;
+ MidiEvent on, off = null, nextOff;
+ ShortMessage onMsg, nextOffMsg;
+ while(iOn.hasNext()) {
+ on = (MidiEvent)iOn.next();
+ onMsg = (ShortMessage)on.getMessage();
+ iOff = noteOffs.iterator();
+ while(iOff.hasNext()) {
+ nextOff = (MidiEvent)iOff.next();
+ nextOffMsg = (ShortMessage)nextOff.getMessage();
+ if(onMsg.getChannel() == nextOffMsg.getChannel() &&
+ onMsg.getData1() == nextOffMsg.getData1() &&
+ c.compare(nextOff, on) > 0) {
+ off = nextOff;
+ iOff.remove();
+ break;
+ }
+