+ public static boolean load(String file) {
+ // Loads sequence from file
+ filename = file;
+ try {
+ seq = MidiSystem.getSequence(new File(filename));
+ } catch (InvalidMidiDataException e) {
+ return false;
+ } catch (IOException e) {
+ return false;
+ }
+ isEdited = false;
+
+ Track[] tracks = seq.getTracks();
+
+ // Stores tempo and time signature.
+ MidiMessage msg;
+ MetaMessage metaMsg;
+ for (int i = 0; i < tracks[0].size(); i++) {
+ msg = tracks[0].get(i).getMessage();
+ if (msg.getStatus() == MetaMessage.META) {
+ metaMsg = (MetaMessage)msg;
+ if (metaMsg.getType() == 81) {
+ tempoMsg = metaMsg;
+ } else if (metaMsg.getType() == 88) {
+ timeSigMsg = (MetaMessage)msg;
+ }
+
+ }
+ }
+
+ // Searches the sequence for NoteOn events
+ MidiEvent noteOn, noteOff = null, nextEvent;
+ MidiMessage nextMsg;
+ ShortMessage shortMsg;
+ ArrayList noteOns, noteOffs;
+ for (int i = 0; i < tracks.length; i++) {
+ noteOns = new ArrayList(tracks.length);
+ /*
+ Collections.sort(track[i].events, new Comparator() {
+ public int compare(Object o1, Object o2) {
+ return ((MidiEvent)o2).getTick() - ((MidiEvent)o1).getTick();
+ }
+ });
+ */
+ for (int j = 0; j < tracks[i].size(); j++) {
+ noteOn = tracks[i].get(j);
+ if (noteOn.getMessage().getStatus() == ShortMessage.NOTE_ON) {
+ // Finds the corresponding NoteOff event
+ for (int k = j + 1; k < tracks[i].size(); k++) {
+ nextEvent = tracks[i].get(k);
+ nextMsg = nextEvent.getMessage();
+ if (nextMsg instanceof ShortMessage) {
+ shortMsg = (ShortMessage) nextMsg;
+ if (shortMsg.getCommand() == ShortMessage.NOTE_OFF && shortMsg.getChannel() == ((ShortMessage)noteOn.getMessage()).getChannel() && shortMsg.getData1() == ((ShortMessage)noteOn.getMessage()).getData1()) {
+ noteOff = nextEvent;
+ break;
+ }
+ }
+ }
+ // Replaces the NoteOn event with a MooNote, if possible with the corresponding NoteOff event
+ tracks[i].remove(noteOn);
+ if (noteOff != null) {
+ tracks[i].add(new MooNote(noteOn, noteOff));
+ } else {
+ tracks[i].add(new MooNote(noteOn));
+ }
+ }
+ }
+ }
+ // Sends sequence to GUI and sequencer, then returns
+ if (gui != null) gui.setSequence(seq);
+ try {
+ sequencer.setSequence(seq);
+ } catch (InvalidMidiDataException e) {}
+ return true;