]> ruin.nu Git - moosique.git/blobdiff - Moosique.java
*** empty log message ***
[moosique.git] / Moosique.java
index c7ea53fcc01703130d09cf33c4a722c57ab40ac6..df94b478e464f79277871e4d95d80265b03da463 100644 (file)
@@ -21,8 +21,10 @@ public class Moosique {
        private static MidiChannel activeChannel;
 
        private static String filename, fileArg;
-       private static long position;
-       private static boolean makeGUI = true;
+       private static long editPosition;
+       private static boolean makeGUI = true, isEdited;
+       private static Thread player;
+       public static final int RESOLUTION = 96, DEFAULT_TRACKS = 4;
 
        /** 
         * Starts the application.
@@ -50,7 +52,7 @@ public class Moosique {
                        setActiveChannel(0);
                } catch (MidiUnavailableException e) {
                        System.out.println("Failed, quitting.");
-                       System.exit(1);
+//                     System.exit(1);
                }
                System.out.println("Done");
 
@@ -117,6 +119,14 @@ public class Moosique {
                return channels;
        }
 
+       /** 
+        * Returns the MidiChannels of the selected synthesizer.
+        * @return the available MidiChannels
+        */
+       public static MidiChannel getChannel(int i) {
+               return channels[i];
+       }
+
        /** 
         * Returns the currently active MidiChannel.
         * @return the active MidiChannel
@@ -139,7 +149,7 @@ public class Moosique {
        public static void clearSequence() {
                // Creates a new sequence and sends it to the sequencer.
                try {
-                       seq = new Sequence(Sequence.PPQ, 96, 3);
+                       seq = new Sequence(Sequence.PPQ, RESOLUTION, DEFAULT_TRACKS);
                        sequencer.setSequence(seq);
                } catch (InvalidMidiDataException e) {}
                // Sends sequence to GUI.
@@ -150,46 +160,81 @@ public class Moosique {
         * Starts playback of the current sequence.
         */
        public static void play() {
-               sequencer.setTickPosition(position);
-               sequencer.start();
+               sequencer.setTickPosition(editPosition);
+               resume();
        }
 
        /** 
         * Pauses playback of the current sequence.
         */
        public static void pause() {
-               sequencer.stop();
+               if (sequencer.isRunning()) {
+                       sequencer.stop();
+               }
+               if (player != null) player.interrupt();
        }
 
        /** 
         * Resumes playback of the current sequence.
         */
        public static void resume() {
+               gui.update(0);
                sequencer.start();
+
+               // Disables input to volatile components
+               // gui.disable();
+
+               // Creates the visualization thread and starts it.
+               player = new Thread () {
+                       public void run() {
+                               while(sequencer.isRunning()) gui.update(sequencer.getTickPosition());
+                               Moosique.stop();
+                       }
+               };
+               player.start();
        }
 
        /** 
         * Stops playback of the current sequence.
         */
        public static void stop() {
-               sequencer.stop();
-               sequencer.setTickPosition(position);
+               if (sequencer.isRunning()) {
+                       sequencer.stop();
+               }
+               sequencer.setTickPosition(editPosition);
+               if (player != null) player.interrupt();
+               gui.update((long)0);
        }
 
        /** 
-        * Rewinds the current sequence the given number of measures.
-        * @param measures      the number of measures to rewind
+        * Returns the current editing position of the sequencer.
+        * @return the tick position
         */
        public static long getPosition() {
-               return position;
+               return editPosition;
        }
 
        /** 
-        * Rewinds the current sequence the given number of measures.
-        * @param measures      the number of measures to rewind
+        * Sets the current editing position of the sequencer.
+        * @param ticks         the tick position
         */
        public static void setPosition(long ticks) {
-               position = ticks;
+               editPosition = ticks;
+       }
+
+       /** 
+        * Returns true if the current sequence has been edited.
+        * @return the tick position
+        */
+       public static boolean isEdited() {
+               return isEdited;
+       }
+
+       /** 
+        * Sets the current sequence as edited, which implies prompts when loading a new sequence.
+        */
+       public static void setEdited() {
+               isEdited = true;
        }
 
        /** 
@@ -197,7 +242,7 @@ public class Moosique {
         * @param measures      the number of measures to rewind
         */
        public static void rewind(long ticks) {
-               setPosition(position - ticks);
+               editPosition -= ticks;
        }
 
        /** 
@@ -205,7 +250,7 @@ public class Moosique {
         * @param measures      the number of measures to fast forward
         */
        public static void forward(long ticks) {
-               setPosition(position + ticks);
+               editPosition += ticks;
        }
 
        /** 
@@ -222,13 +267,8 @@ public class Moosique {
                } catch (IOException e) {
                        return false;
                }
-
-               // Sends sequence to GUI and sequencer
-               if (gui != null) gui.setSequence(seq);
-               try {
-                       sequencer.setSequence(seq);
-               } catch (InvalidMidiDataException e) {}
-
+               isEdited = false;
+               
                // Searches the sequence for NoteOn events
                Track[] tracks = seq.getTracks();
                MidiEvent noteOn, noteOff = null, nextEvent;
@@ -269,6 +309,11 @@ public class Moosique {
                                }
                        }
                }
+               // Sends sequence to GUI and sequencer, then returns
+               if (gui != null) gui.setSequence(seq);
+               try {
+                       sequencer.setSequence(seq);
+               } catch (InvalidMidiDataException e) {}
                return true;
        }