]> ruin.nu Git - moosique.git/blobdiff - Moosique.java
nu är den klar
[moosique.git] / Moosique.java
index e72cdf560d3df1e1b2e55dbdefb6ae0aecaad323..c9ed3ae003931b43f74d9c7ad3e7609dd0ca5d0e 100644 (file)
@@ -19,12 +19,14 @@ 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 String filename, fileArg;
        private static long editPosition;
        private static boolean makeGUI = true, isEdited;
        private static Thread player;
-       public static final int RESOLUTION = 96, DEFAULT_TRACKS = 4;
+       public static final int DEFAULT_RESOLUTION = 96, DEFAULT_TRACKS = 4;
 
        /** 
         * Starts the application.
@@ -149,7 +151,7 @@ public class Moosique {
        public static void clearSequence() {
                // Creates a new sequence and sends it to the sequencer.
                try {
-                       seq = new Sequence(Sequence.PPQ, RESOLUTION, DEFAULT_TRACKS);
+                       seq = new Sequence(Sequence.PPQ, DEFAULT_RESOLUTION, DEFAULT_TRACKS);
                        sequencer.setSequence(seq);
                } catch (InvalidMidiDataException e) {}
                // Sends sequence to GUI.
@@ -187,7 +189,18 @@ public class Moosique {
                // Creates the visualization thread and starts it.
                player = new Thread () {
                        public void run() {
-                               while(sequencer.isRunning()) gui.update(sequencer.getTickPosition());
+                               while(sequencer.isRunning()) {
+                                       // Updates the GUI with the current tick position.
+                                       gui.update(sequencer.getTickPosition());
+
+                                       // Puts the thread to sleep for as long as it takes
+                                       // the sequencer to reach the next sixteenth.
+                                       try {
+                                               sleep((long)((1000 * 60 * 1) / (getTempo() * 4)));
+                                       } catch (InterruptedException e) {
+                                               Moosique.stop();
+                                       }
+                               }
                                Moosique.stop();
                        }
                };
@@ -222,6 +235,41 @@ public class Moosique {
                editPosition = ticks;
        }
 
+       /** 
+        * Returns the tempo of the current sequence.
+        * @return the tick position
+        */
+       public static int getTempo() {
+               return 120;
+               // if (tempoMsg == null) return 0;
+       }
+
+       /** 
+        * Sets the current editing position of the sequencer.
+        * @param ticks         the tick position
+        */
+       public static void setTempo(int bpm) {
+               // tempoMsg
+       }
+
+       /** 
+        * Returns the tempo of the current sequence.
+        * @return the tick position
+        */
+       public static int[] getTimeSig() {
+               int[] ts = {4, 4};
+               return ts;
+               // if (timeSigMsg == null) return 0;
+       }
+
+       /** 
+        * Sets the current editing position of the sequencer.
+        * @param ticks         the tick position
+        */
+       public static void setTimeSig(int bpm) {
+               // timeSigMsg
+       }
+
        /** 
         * Returns true if the current sequence has been edited.
         * @return the tick position
@@ -268,22 +316,31 @@ public class Moosique {
                        return false;
                }
                isEdited = false;
-               
-               // Searches the sequence for NoteOn events
+
                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) {
+// FLERA!!!                    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) {
@@ -309,6 +366,7 @@ public class Moosique {
                                }
                        }
                }
+
                // Sends sequence to GUI and sequencer, then returns
                if (gui != null) gui.setSequence(seq);
                try {
@@ -326,6 +384,7 @@ public class Moosique {
                        MidiSystem.write(seq, 1, new File(filename));
                } catch (IOException e) {}
                filename = file;
+               gui.setStatus("Saved " + file);
        }
 
        /**