X-Git-Url: https://ruin.nu/git/?p=moosique.git;a=blobdiff_plain;f=Moosique.java;h=e03cca0749a08b9396c7e760c722bb62f698c36a;hp=91cf4ff7ddc117a62e7109224e9c66add37ef474;hb=aae2d0b4428236b4147f466b3858a34bb7ed174f;hpb=65ea2a43eb97459592d222ea00082e46343c9d8b diff --git a/Moosique.java b/Moosique.java index 91cf4ff..e03cca0 100644 --- a/Moosique.java +++ b/Moosique.java @@ -22,7 +22,7 @@ public class Moosique { private static MidiEvent[] timeSignatures, tempoChanges; private static ArrayList emptyTracks; - private static String filename, fileArg; + private static String filename; private static long editPosition; private static boolean makeGUI = true, isEdited = false, drawEmptyTracks = false; private static Thread player; @@ -35,6 +35,7 @@ public class Moosique { System.out.println("\nMoosique version 1.0\n"); // Parses command-line arguments. + String fileArg = null; for (int i = 0; i < args.length; i++) { if (args[i].equals("-n")) {makeGUI = false;} else if (fileArg == null) {fileArg = args[i];} @@ -54,7 +55,6 @@ public class Moosique { setActiveChannel(0); } catch (MidiUnavailableException e) { System.out.println("Failed, quitting."); -// System.exit(1); } System.out.println("Done"); @@ -62,7 +62,7 @@ public class Moosique { if (fileArg != null) { System.out.print("Loading MIDI sequence from " + fileArg + "..."); if (!load(fileArg)) { - System.out.println("Failed"); + System.out.println("Failed, creating new sequence"); clearSequence(); } else { System.out.println("Done"); @@ -74,7 +74,7 @@ public class Moosique { // Builds GUI, unless n-flag is set. if (makeGUI) { - System.out.print("Building GUI..."); + System.out.print("Building GUI."); try { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); } catch (Exception e) {} @@ -153,6 +153,7 @@ public class Moosique { try { seq = new Sequence(Sequence.PPQ, DEFAULT_RESOLUTION, DEFAULT_TRACKS); sequencer.setSequence(seq); + filename = null; emptyTracks = new ArrayList(); } catch (InvalidMidiDataException e) {} // Sends sequence to GUI. @@ -182,6 +183,9 @@ public class Moosique { */ public static void resume() { gui.update(0); + try { + sequencer.setSequence(seq); + } catch (InvalidMidiDataException e) {} sequencer.start(); // Disables input to volatile components @@ -190,15 +194,7 @@ public class Moosique { // Creates the visualisation thread and starts it. player = new Thread () { public void run() { - long ticksPerSixteenth = seq.getResolution()/4; - System.out.println("Ticks/16: " + ticksPerSixteenth); - long position = sequencer.getTickPosition(); while(sequencer.isRunning()) { - long pos = sequencer.getTickPosition(); - long tickDiff = pos - position; - System.out.print(" ... " + tickDiff); - position = pos; - // Updates the GUI with the current tick position. gui.update(sequencer.getTickPosition()); @@ -312,8 +308,8 @@ public class Moosique { } /** - * Shows the given message in the status bar. - * @param text the message to show + * Returns whether the given track should be drawn + * @return true if the given track should be drawn */ public static boolean shouldBeDrawn(Track track) { if (drawEmptyTracks) return true; @@ -322,8 +318,8 @@ public class Moosique { /** - * Shows the given message in the status bar. - * @param text the message to show + * Sets whether empty tracks should be drawn + * @param state true if empty tracks should be drawn */ public static void setDrawEmptyTracks(boolean state) { drawEmptyTracks = state; @@ -380,13 +376,7 @@ public class Moosique { } noteOns.trimToSize(); noteOffs.trimToSize(); - boolean isEmpty = (noteOns.size() == 0); - String text = "Track " + i + " has " + noteOns.size() + "/" + noteOffs.size() + "/" + tracks[i].size(); - if (isEmpty) { - text += " and will be removed."; - emptyTracks.add(tracks[i]); - } - System.out.println(text); + if (noteOns.size() == 0) emptyTracks.add(tracks[i]); // Sorts the note lists by tick position. Comparator c = new Comparator() { @@ -397,7 +387,7 @@ public class Moosique { Collections.sort(noteOns, c); Collections.sort(noteOffs, c); - // For each NoteOn event, finds its NoteOff event and replaces it with a MooNote. + // Replaces each NoteOn event it with a MooNote containing a reference to the NoteOff event. Iterator iOn = noteOns.iterator(), iOff; MidiEvent on, off = null, nextOff; ShortMessage onMsg, nextOffMsg; @@ -426,7 +416,6 @@ public class Moosique { iOn.remove(); } } - // Sends sequence to GUI and sequencer, then returns if (gui != null) gui.setSequence(seq); try { @@ -439,19 +428,27 @@ public class Moosique { * Saves the current sequence to the given filename * @param file the filename to use */ - public static void saveAs(String file) { + public static boolean saveAs(String file) { try { - MidiSystem.write(seq, 1, new File(filename)); - } catch (IOException e) {} - filename = file; - gui.setStatus("Saved " + file); + MidiSystem.write(seq, 1, new File(file)); + filename = file; + gui.setStatus("Saved " + file); + return true; + } catch (IOException e) { + gui.setStatus("Failed in saving " + file); + return false; + } } /** * Saves the current sequence to the previously given filename. */ - public static void save() { - saveAs(filename); + public static boolean save() { + if (filename == null) return false; + else { + saveAs(filename); + return true; + } } /**