]> ruin.nu Git - moosique.git/blobdiff - Moosique.java
Fixed the file loading. Now the program finds ALL the notes.
[moosique.git] / Moosique.java
index c9ed3ae003931b43f74d9c7ad3e7609dd0ca5d0e..795772f46e9b04742b81fb4dffc72d65b3f43769 100644 (file)
@@ -19,8 +19,7 @@ public class Moosique {
        private static Synthesizer synthesizer;
        private static MidiChannel[] channels;
        private static MidiChannel activeChannel;
-       private static MetaMessage timeSigMsg;
-       private static MetaMessage[] tempoChgMsgs;
+       private static MidiEvent[] timeSignatures, tempoChanges;
 
        private static String filename, fileArg;
        private static long editPosition;
@@ -319,27 +318,90 @@ public class Moosique {
 
                Track[] tracks = seq.getTracks();
 
-               // Stores tempo and time signature.
-               MidiMessage msg;
+               // Searches track 0 for changes in tempo and time signature.
+               MidiEvent event;
                MetaMessage metaMsg;
+               ArrayList ts = new ArrayList(), tc = new ArrayList();
                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) {
-// FLERA!!!                    tempoMsg = metaMsg;
-                               } else if (metaMsg.getType() == 88) {
-                                       timeSigMsg = (MetaMessage)msg;
+                       event = tracks[0].get(i);
+                       if (event.getMessage().getStatus() == MetaMessage.META) {
+                               metaMsg = (MetaMessage)event.getMessage();
+                               switch(metaMsg.getType()) {
+                                       case 81: tc.add(event); break;
+                                       case 88: ts.add(event);
                                }
+                       }
+               }
+//             timeSignatures = ts.toArray(timeSignatures);
+//             tempoChanges = tc.toArray(tempoChanges);
 
+               // Wraps each NoteOn event with its NoteOff event in a MooNote
+               ArrayList noteOns, noteOffs;
+               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();
+                       
+                       // Sorts the note lists by tick position.
+                       Comparator c = new Comparator() {
+                               public int compare(Object o1, Object o2) {
+                                       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;
+                                       }
+                                               
+                               }
+                               tracks[i].remove(on);
+                               if (off != null) {
+                                       tracks[i].add(new MooNote(on, off));
+                               } else {
+                                       tracks[i].add(new MooNote(on));
+                               }
+                               iOn.remove();
                        }
                }
 
+       /*
+               Collections.sort(track[i].events, new Comparator() {
+                       public int compare(Object o1, Object o2) {
+                               return ((MidiEvent)o2).getTick() - ((MidiEvent)o1).getTick();
+                       }
+               });
+
                // 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++) {
                        for (int j = 0; j < tracks[i].size(); j++) {
                                noteOn = tracks[i].get(j);
@@ -366,7 +428,7 @@ public class Moosique {
                                }
                        }
                }
-
+*/
                // Sends sequence to GUI and sequencer, then returns
                if (gui != null) gui.setSequence(seq);
                try {
@@ -402,4 +464,4 @@ public class Moosique {
                if (synthesizer.isOpen()) synthesizer.close();
                System.exit(0);
        }
-}
+}
\ No newline at end of file