private static MidiChannel activeChannel;
private static MidiEvent[] timeSignatures, tempoChanges;
- private static ArrayList emptyTracks;
+ private static ArrayList copyBuffer, emptyTracks;
private static Map trackMute = new HashMap();
private static Map trackSolo = new HashMap();
private static Thread player;
return channels;
}
+ /**
+ * Returns the current copy buffer.
+ * @return the current copy buffer
+ */
+ public static ArrayList getCopyBuffer() {
+ return copyBuffer;
+ }
+
/**
* Returns the current editing position of the sequencer.
* @return the tick position
activeChannel = channels[channel];
}
+ /**
+ * Sets the current copy buffer.
+ * @param the copy buffer
+ */
+ public static void setCopyBuffer(ArrayList buffer) {
+ copyBuffer = buffer;
+ }
+
/**
* Sets whether empty tracks should be drawn
* @param state true if empty tracks should be drawn
emptyTracks = new ArrayList();
trackSolo = new HashMap();
trackMute = new HashMap();
+ copyBuffer = new ArrayList();
} catch (InvalidMidiDataException e) {}
// Sends sequence to GUI.
if (gui != null) gui.setSequence(seq);
}
+
+ /**
+ * Wraps each NoteOn event in the track with its NoteOff event in a MooNote.
+ */
+ public static void convertTrack(Track track) {
+ // Searches the track for NoteOn and NoteOff events
+ ArrayList noteOns = new ArrayList(track.size() / 2);
+ ArrayList noteOffs = new ArrayList(track.size() / 2);
+ MidiEvent event;
+ for (int j = 0; j < track.size(); j++) {
+ event = track.get(j);
+ if (event.getMessage().getStatus() >= 144 &&
+ event.getMessage().getStatus() < 160) noteOns.add(event);
+ if (event.getMessage().getStatus() >= 128 &&
+ event.getMessage().getStatus() < 144) noteOffs.add(event);
+ }
+ noteOns.trimToSize();
+ noteOffs.trimToSize();
+ if (noteOns.size() == 0) emptyTracks.add(track);
+
+ // Sorts the note lists by tick position.
+ Comparator c = new MidiEventComparator();
+ Collections.sort(noteOns, c);
+ Collections.sort(noteOffs, c);
+
+ // Replaces each NoteOn event it with a MooNote containing a reference to the NoteOff event.
+ 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;
+ }
+
+ }
+ track.remove(on);
+ if (off != null) {
+ track.add(new MooNote(on, off));
+ } else {
+ track.add(new MooNote(on, new MidiEvent((ShortMessage)on.getMessage().clone(), on.getTick() + 48)));
+ }
+ iOn.remove();
+ }
+ }
/**
* Loads a MIDI sequence from the given file.
emptyTracks = new ArrayList();
trackMute = new HashMap();
trackSolo = new HashMap();
+ copyBuffer = new ArrayList();
// Searches track 0 for changes in tempo and time signature.
MidiEvent event;
// timeSignatures = ts.toArray(timeSignatures);
// tempoChanges = tc.toArray(tempoChanges);
- // Wraps each NoteOn event with its NoteOff event in a MooNote
- ArrayList noteOns, noteOffs;
+ // Converts tracks.
for (int i = 0; i < tracks.length; i++) {
- // Searches the sequence for NoteOn and NoteOff events
- noteOns = new ArrayList(tracks[i].size() / 2);
- noteOffs = new ArrayList(tracks[i].size() / 2);
- for (int j = 0; j < tracks[i].size(); j++) {
- event = tracks[i].get(j);
- if (event.getMessage().getStatus() >= 144 &&
- event.getMessage().getStatus() < 160) noteOns.add(event);
- if (event.getMessage().getStatus() >= 128 &&
- event.getMessage().getStatus() < 144) noteOffs.add(event);
- }
- noteOns.trimToSize();
- noteOffs.trimToSize();
- if (noteOns.size() == 0) emptyTracks.add(tracks[i]);
-
- // Sorts the note lists by tick position.
- Comparator c = new MidiEventComparator();
- Collections.sort(noteOns, c);
- Collections.sort(noteOffs, c);
-
- // Replaces each NoteOn event it with a MooNote containing a reference to the NoteOff event.
- 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;
- }
-
- }
- tracks[i].remove(on);
- if (off != null) {
- tracks[i].add(new MooNote(on, off));
- } else {
- tracks[i].add(new MooNote(on, new MidiEvent((ShortMessage)on.getMessage().clone(), on.getTick() + 48)));
- }
- iOn.remove();
- }
+ convertTrack(tracks[i]);
}
+
// Sends sequence to GUI and sequencer, then returns
if (gui != null) gui.setSequence(seq);
try {