private static MidiChannel[] channels;
private static MidiChannel activeChannel;
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;
+ private static boolean makeGUI = true, isEdited = false, drawEmptyTracks = false;
private static Thread player;
public static final int DEFAULT_RESOLUTION = 96, DEFAULT_TRACKS = 4;
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];}
setActiveChannel(0);
} catch (MidiUnavailableException e) {
System.out.println("Failed, quitting.");
-// System.exit(1);
}
System.out.println("Done");
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");
// 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) {}
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.
if (gui != null) gui.setSequence(seq);
*/
public static void resume() {
gui.update(0);
+ try {
+ sequencer.setSequence(seq);
+ } catch (InvalidMidiDataException e) {}
sequencer.start();
// Disables input to volatile components
// gui.disable();
- // Creates the visualization thread and starts it.
+ // Creates the visualisation thread and starts it.
player = new Thread () {
public void run() {
while(sequencer.isRunning()) {
// 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)));
+ //sleep((long)((15000 / getTempo()) * (tickDiff / ticksPerSixteenth)));
+ sleep (10);
} catch (InterruptedException e) {
Moosique.stop();
}
* Returns the current editing position of the sequencer.
* @return the tick position
*/
- public static long getPosition() {
+ public static long getEditPosition() {
return editPosition;
}
* Sets the current editing position of the sequencer.
* @param ticks the tick position
*/
- public static void setPosition(long ticks) {
+ public static void setEditPosition(long ticks) {
editPosition = ticks;
}
editPosition += ticks;
}
+ /**
+ * 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;
+ else return (!emptyTracks.contains(track));
+ }
+
+
+ /**
+ * Sets whether empty tracks should be drawn
+ * @param state true if empty tracks should be drawn
+ */
+ public static void setDrawEmptyTracks(boolean state) {
+ drawEmptyTracks = state;
+ }
+
/**
* Loads the MooSequence in the given file.
* @param filename the filename to use
isEdited = false;
Track[] tracks = seq.getTracks();
+ emptyTracks = new ArrayList();
// Searches track 0 for changes in tempo and time signature.
MidiEvent event;
}
noteOns.trimToSize();
noteOffs.trimToSize();
+ if (noteOns.size() == 0) emptyTracks.add(tracks[i]);
// Sorts the note lists by tick position.
Comparator c = new Comparator() {
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;
iOn.remove();
}
}
-
- /*
- Collections.sort(track[i].events, new Comparator() {
- public int compare(Object o1, Object o2) {
- return ((MidiEvent)o2).getTick() - ((MidiEvent)o1).getTick();
- }
- });
-
- // Searches the sequence for NoteOn events
- MidiEvent noteOn, noteOff = null, nextEvent;
- MidiMessage nextMsg;
- ShortMessage shortMsg;
-
- for (int i = 0; i < tracks.length; i++) {
- for (int j = 0; j < tracks[i].size(); j++) {
- noteOn = tracks[i].get(j);
- if (noteOn.getMessage().getStatus() == ShortMessage.NOTE_ON) {
- // Finds the corresponding NoteOff event
- for (int k = j + 1; k < tracks[i].size(); k++) {
- nextEvent = tracks[i].get(k);
- nextMsg = nextEvent.getMessage();
- if (nextMsg instanceof ShortMessage) {
- shortMsg = (ShortMessage) nextMsg;
- if (shortMsg.getCommand() == ShortMessage.NOTE_OFF && shortMsg.getChannel() == ((ShortMessage)noteOn.getMessage()).getChannel() && shortMsg.getData1() == ((ShortMessage)noteOn.getMessage()).getData1()) {
- noteOff = nextEvent;
- break;
- }
- }
- }
- // Replaces the NoteOn event with a MooNote, if possible with the corresponding NoteOff event
- tracks[i].remove(noteOn);
- if (noteOff != null) {
- tracks[i].add(new MooNote(noteOn, noteOff));
- } else {
- tracks[i].add(new MooNote(noteOn));
- }
- }
- }
- }
-*/
// Sends sequence to GUI and sequencer, then returns
if (gui != null) gui.setSequence(seq);
try {
* 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;
+ }
}
/**