]> ruin.nu Git - moosique.git/blobdiff - Moosique.java
Fixed some bugs
[moosique.git] / Moosique.java
index 32c4d375d7e43b0f7b502d0b6b25730f8b0e6771..5d6ed9716b569d472141910edfb0e41358c21d74 100644 (file)
@@ -1,8 +1,8 @@
 import javax.sound.midi.*;
-import javax.swing.*;
 import java.io.*;
+import javax.swing.*;
 
-/*
+/**
  * Moosique - The MIDI Tracker
  * 
  * Main class that handles initiation, IO and sound.
@@ -12,22 +12,29 @@ import java.io.*;
  
 public class Moosique {
 
-       protected static MooGUI gui;
-       protected static Sequence seq;
-
-       protected static Sequencer sequencer = null;
-       protected static Synthesizer synthesizer = null;
-       protected static MidiChannel[] channels;
-       protected static MidiChannel activeChannel;
+       private static MooGUI gui;
+       private static Sequence seq;
+       private static Sequencer sequencer;
+       private static Synthesizer synthesizer;
+       private static MidiChannel[] channels;
+       private static MidiChannel activeChannel;
 
-       protected static String filename;
-       protected static long position;
+       private static String filename, fileArg;
+       private static long position;
+       private static boolean makeGUI = true;
 
-       /* 
+       /** 
         * Starts the application.
         */
        public static void main (String[] args) {
                System.out.println("\nMoosique version 1.0\n");
+
+               // Parses command-line arguments.
+               for (int i = 0; i < args.length; i++) {
+                       if (args[i].equals("-n")) {makeGUI = false;}
+                       else if (fileArg == null) {fileArg = args[i];}
+               }
+
                // Acquires MIDI devices and connects them.
                System.out.print("Initializing MIDI devices.");
                try {
@@ -47,46 +54,77 @@ public class Moosique {
                System.out.println("Done");
 
                //If a filename is given as the command-line argument, attempts to load a sequence from the file.
-               System.out.print("Loading MIDI sequence...");
-               if (args.length == 1) {
-                       if (!load(args[0])) clearSequence();
+               if (fileArg != null) {
+                       System.out.print("Loading MIDI sequence from " + fileArg + "...");
+                       if (!load(fileArg)) {
+                               System.out.println("Failed");
+                               clearSequence();
+                       } else {
+                               System.out.println("Done");
+                       }
                } else {
                        // Otherwise creates a new empty one.
                        clearSequence();
                }
-               System.out.println("Done");
 
-               // Sets up channels and GUI.
-               System.out.print("Creating GUI...");
-               gui = new MooGUI(seq);
-               System.out.println("Done");
+               // Builds GUI, unless n-flag is set.
+               if (makeGUI) {
+                       System.out.print("Building GUI...");
+                       try {
+                               UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
+                       } catch (Exception e) {}
+                       gui = new MooGUI(seq);
+                       System.out.println("Done");
+               } else {
+                       System.out.print("Playing...");
+                       play();
+                       while (sequencer.isRunning()) {}
+                       System.out.println("Done");
+                       quit();
+               }
        }
 
-       /* 
-        * Returns a pointer to the current sequence.
+       /** 
+        * Returns the GUI.
+        * @return the GUI
+        */
+       public static MooGUI getGUI() {
+               return gui;
+       }
+
+       /** 
+        * Returns the current sequence.
         * @return the current sequence
         */
        public static Sequence getSequence() {
                return seq;
        }
 
-       /* 
-        * Returns a pointer to the MidiChannels of the selected synthesizer.
+       /** 
+        * Returns the current sequencer.
+        * @return the current sequencer
+        */
+       public static Sequencer getSequencer() {
+               return sequencer;
+       }
+
+       /** 
+        * Returns the MidiChannels of the selected synthesizer.
         * @return the available MidiChannels
         */
        public static MidiChannel[] getChannels() {
                return channels;
        }
 
-       /* 
-        * Returns a pointer to the currently active MidiChannel.
+       /** 
+        * Returns the currently active MidiChannel.
         * @return the active MidiChannel
         */
        public static MidiChannel getActiveChannel() {
                return activeChannel;
        }
 
-       /* 
+       /** 
         * Sets the currently active MidiChannel.
         * @param channel       the number of the MidiChannel to activate
         */
@@ -94,45 +132,42 @@ public class Moosique {
                activeChannel = channels[channel];
        }
 
-       /* 
+       /** 
         * Replaces the current sequence with a new one, holding three empty tracks.
         */
        public static void clearSequence() {
-               // Creates sequence.
+               // Creates a new sequence and sends it to the sequencer.
                try {
                        seq = new Sequence(Sequence.PPQ, 96, 3);
+                       sequencer.setSequence(seq);
                } catch (InvalidMidiDataException e) {}
                // Sends sequence to GUI.
                if (gui != null) gui.setSequence(seq);
-       
        }
 
-       /* 
+       /** 
         * Starts playback of the current sequence.
         */
        public static void play() {
-               try {
-                       sequencer.setSequence(seq);
-                       sequencer.setTickPosition(position);
-               } catch (InvalidMidiDataException e) {}
+               sequencer.setTickPosition(position);
                sequencer.start();
        }
 
-       /* 
+       /** 
         * Pauses playback of the current sequence.
         */
        public static void pause() {
                sequencer.stop();
        }
 
-       /* 
+       /** 
         * Resumes playback of the current sequence.
         */
        public static void resume() {
                sequencer.start();
        }
 
-       /* 
+       /** 
         * Stops playback of the current sequence.
         */
        public static void stop() {
@@ -140,7 +175,7 @@ public class Moosique {
                sequencer.setTickPosition(position);
        }
 
-       /* 
+       /** 
         * Rewinds the current sequence the given number of measures.
         * @param measures      the number of measures to rewind
         */
@@ -148,7 +183,7 @@ public class Moosique {
                return position;
        }
 
-       /* 
+       /** 
         * Rewinds the current sequence the given number of measures.
         * @param measures      the number of measures to rewind
         */
@@ -156,23 +191,23 @@ public class Moosique {
                position = ticks;
        }
 
-       /* 
+       /** 
         * Rewinds the current sequence the given number of measures.
         * @param measures      the number of measures to rewind
         */
        public static void rewind(long ticks) {
-               position -= ticks;
+               setPosition(position - ticks);
        }
 
-       /* 
+       /** 
         * Fast forwards the current sequence the given number of measures.
         * @param measures      the number of measures to fast forward
         */
        public static void forward(long ticks) {
-               position += ticks;
+               setPosition(position + ticks);
        }
 
-       /* 
+       /** 
         * Loads the MooSequence in the given file.
         * @param filename      the filename to use
         */
@@ -184,12 +219,14 @@ public class Moosique {
                } catch (InvalidMidiDataException e) {
                        return false;
                } catch (IOException e) {
-                       JOptionPane.showMessageDialog(null, "File", "alert", JOptionPane.ERROR_MESSAGE); 
                        return false;
                }
 
-               // Sends sequence to GUI
+               // Sends sequence to GUI and sequencer
                if (gui != null) gui.setSequence(seq);
+               try {
+                       sequencer.setSequence(seq);
+               } catch (InvalidMidiDataException e) {}
 
                // Searches the sequence for NoteOn events
                Track[] tracks = seq.getTracks();
@@ -227,31 +264,30 @@ public class Moosique {
                return true;
        }
 
-       /* 
+       /** 
         * Saves the current sequence to the given filename
-        * @param filename      the filename to use
+        * @param file  the filename to use
         */
-       public static void saveAs(String filename) throws IOException {
-               MidiSystem.write(seq, 1, new File(filename));
-
+       public static void saveAs(String file) {
+               try {
+                       MidiSystem.write(seq, 1, new File(filename));
+               } catch (IOException e) {}
+               filename = file;
        }
 
-       /* 
+       /** 
         * Saves the current sequence to the previously given filename.
         */
-       public static void save() throws IOException {
+       public static void save() {
                saveAs(filename);
        }
 
-       /* 
+       /** 
         * Releases all reserved devices and exits the program.
         */
        public static void quit() {
-               if (sequencer.isOpen()) {
-                       try {
-                               sequencer.open();
-                       } catch (MidiUnavailableException e) {}
-               }
+               if (sequencer.isOpen()) sequencer.close();
+               if (synthesizer.isOpen()) synthesizer.close();
                System.exit(0);
        }
 }
\ No newline at end of file