import javax.sound.midi.*;
+import javax.swing.*;
import java.io.*;
/* UPDATES
public class Moosique {
private static MooGUI gui;
- private static MooSequence seq;
+ private static Sequence seq;
private static Sequencer sequencer = null;
private static Synthesizer synthesizer = null;
- private static Receiver receiver = null;
private static MidiChannel[] channels;
- private static String file;
+ private static String filename;
private static long position;
/*
* Starts the application.
*/
public static void main (String[] args) {
- seq = new MooSequence();
- gui = new MooGUI(seq);
-
+ System.out.println("Moosique version 1.0");
// Acquires MIDI devices and connects them.
try {
sequencer = MidiSystem.getSequencer();
synthesizer.open();
sequencer.getTransmitter().setReceiver(synthesizer.getReceiver());
} catch (MidiUnavailableException e) {
+ System.out.println("Unable to initialize MIDI devices.");
quit();
}
+ //If a filename is given as the command-line argument, attempts to load a sequence from the file.
+ try {
+ if (args.length == 1) {
+ if (!load(args[0])) seq = new Sequence(Sequence.PPQ, 96);
+ } else {
+ // Otherwise creates a new empty one.
+ seq = new Sequence(Sequence.PPQ, 96);
+ }
+ } catch (InvalidMidiDataException e) {}
+
+ // Sets up channels and GUI.
channels = synthesizer.getChannels();
+ gui = new MooGUI();
}
/*
* Returns a pointer to the current sequence.
* @return the current sequence
*/
- public static MooSequence getSequence() {
+ public static Sequence getSequence() {
return seq;
}
* Starts playback of the current sequence.
*/
public static void play() {
- sequencer.setSequence(seq.getSequence());
+ try {
+ sequencer.setSequence(seq);
+ } catch (InvalidMidiDataException e) {}
sequencer.setTickPosition(position);
sequencer.start();
}
* Loads the MooSequence in the given file.
* @param filename the filename to use
*/
- public static void load(String filename) throws IOException {
- file = filename;
- seq = new MooSequence(MidiSystem.getSequence(new File(filename)));
+ public static boolean load(String file) {
+ // Loads sequence from file
+ filename = file;
+ try {
+ seq = MidiSystem.getSequence(new File(filename));
+ } catch (InvalidMidiDataException e) {
+ return false;
+ } catch (IOException e) {
+ JOptionPane.showMessageDialog(null, "File", "alert", JOptionPane.ERROR_MESSAGE);
+ return false;
+ }
+
+ // Sends sequence to GUI
+ gui.setSequence(seq);
+
+ // Searches the sequence for NoteOn events
+ Track[] tracks = seq.getTracks();
+ 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() instanceof ShortMessage) {
+ if (((ShortMessage)noteOn.getMessage()).getCommand() == 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));
+ }
+ }
+ }
+ }
+ }
+ return true;
}
/*
* @param filename the filename to use
*/
public static void saveAs(String filename) throws IOException {
- MidiSystem.write(seq.getSequence(), 1, new File(filename));
+ MidiSystem.write(seq, 1, new File(filename));
}
* Saves the current sequence to the previously given filename.
*/
public static void save() throws IOException {
- saveAs(file);
+ saveAs(filename);
}
/*