]> ruin.nu Git - moosique.git/blobdiff - Moosique.java
no message
[moosique.git] / Moosique.java
index 32c4d375d7e43b0f7b502d0b6b25730f8b0e6771..bb90b765b69492f5d2da3a6334e507de62f46825 100644 (file)
@@ -2,7 +2,7 @@ import javax.sound.midi.*;
 import javax.swing.*;
 import java.io.*;
 
-/*
+/**
  * 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;
+       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 Sequencer sequencer = null;
-       protected static Synthesizer synthesizer = null;
-       protected static MidiChannel[] channels;
-       protected static MidiChannel activeChannel;
+       private static String filename, fileArg;
+       private static long position;
+       private static boolean makeGUI = true;
 
-       protected static String filename;
-       protected static long position;
-
-       /* 
+       /** 
         * 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,22 +54,30 @@ 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)) clearSequence();
+                       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");
+               // If n-flag is set, plays song and then exits. Otherwise builds GUI.
+               if (makeGUI) {
+                       System.out.print("Building GUI...");
+                       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.
         * @return the current sequence
         */
@@ -70,7 +85,7 @@ public class Moosique {
                return seq;
        }
 
-       /* 
+       /** 
         * Returns a pointer to the MidiChannels of the selected synthesizer.
         * @return the available MidiChannels
         */
@@ -78,7 +93,7 @@ public class Moosique {
                return channels;
        }
 
-       /* 
+       /** 
         * Returns a pointer to the currently active MidiChannel.
         * @return the active MidiChannel
         */
@@ -86,7 +101,7 @@ public class Moosique {
                return activeChannel;
        }
 
-       /* 
+       /** 
         * Sets the currently active MidiChannel.
         * @param channel       the number of the MidiChannel to activate
         */
@@ -94,45 +109,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 +152,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 +160,7 @@ public class Moosique {
                return position;
        }
 
-       /* 
+       /** 
         * Rewinds the current sequence the given number of measures.
         * @param measures      the number of measures to rewind
         */
@@ -156,7 +168,7 @@ public class Moosique {
                position = ticks;
        }
 
-       /* 
+       /** 
         * Rewinds the current sequence the given number of measures.
         * @param measures      the number of measures to rewind
         */
@@ -164,7 +176,7 @@ public class Moosique {
                position -= ticks;
        }
 
-       /* 
+       /** 
         * Fast forwards the current sequence the given number of measures.
         * @param measures      the number of measures to fast forward
         */
@@ -172,7 +184,7 @@ public class Moosique {
                position += ticks;
        }
 
-       /* 
+       /** 
         * Loads the MooSequence in the given file.
         * @param filename      the filename to use
         */
@@ -184,12 +196,15 @@ public class Moosique {
                } catch (InvalidMidiDataException e) {
                        return false;
                } catch (IOException e) {
-                       JOptionPane.showMessageDialog(null, "File", "alert", JOptionPane.ERROR_MESSAGE); 
+                       JOptionPane.showMessageDialog(null, "Error 404", "File Not Found", 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 +242,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