* Creates a MooNote of the given pitch, velocity and length in the current track.
*/
public MooNote (int pitch, int velocity, int length) {
- // MidiEvent(MidiMessage message, long tick)
noteOnMsg = new ShortMessage();
noteOffMsg = new ShortMessage();
noteOnMsg.setMessage(ShortMessage.NOTE_ON, pitch, velocity);
noteOffMsg.setMessage(ShortMessage.NOTE_OFF, pitch, velocity);
// noteOnTime = ???;
noteOffTime = noteOnTime + length;
- noteOnEvent = new MidiEvent(noteOnMsg, noteOnTime)
- noteOffEvent = new MidiEvent(noteOffMsg, noteOffTime)
+ noteOnEvent = new MidiEvent(noteOnMsg, noteOnTime);
+ noteOffEvent = new MidiEvent(noteOffMsg, noteOffTime);
}
/*
* Sets the pitch of the current note.
- + @param pitch the pitch of the note (0-127)
+ * @param pitch the pitch of the note (0-127)
*/
public void setPitch(int pitch) {
noteOnMsg.setMessage(ShortMessage.NOTE_ON, pitch, noteOnMsg.getData2());
import javax.sound.midi.*;
import java.util.*;
+/* UPDATES
+ Added MooSequence(Sequence seq) constructor.
+*/
+
/*
* Functional representation of a MIDI sequence.
*
private ArrayList tracks;
+ /*
+ * Creates a MooSequence from the given Sequence.
+ */
+ public MooSequence(Sequence seq) {
+
+ }
+
/*
* Creates a MooSequence with three tracks.
*/
- public MooSequence () {
+ public MooSequence() {
tracks = new ArrayList();
addTrack(0);
}
* @return a Sequence
*/
public Sequence getSequence() {
-
+ Sequence seq = new Sequence(Sequencer.PPQ, 96, tracks.size());
+ Track t;
+ for (int i = 0; i < tracks.size(); i++) {
+ t = tracks.get(i);
+ for (int j = 0; j < t.notes.size(); j++) {
+ t.add(t.notes.get(j).getNoteOnEvent());
+ t.add(t.notes.get(j).getNoteOffEvent()); }
+ }
+ }
}
/*
import javax.sound.midi.*;
import java.io.*;
-// Import external MIDIFileReader and MIDIFileWriter
+
+/* UPDATES
+ Killed superfluous exportMIDI method.
+ Added public static void quit()
+ Removed Sequence seq property.
+ Changed forward(int measures) and rewind(int measures) to forward(long ticks) and rewind(long ticks).
+ Added public static long getPosition()
+ Added public static void setPosition(long ticks)
+ Added public static void resume()
+*/
/*
* Moosique - The MIDI Tracker
public class Moosique {
private static MooGUI gui;
- private static MooSequence mooSeq;
- private static Sequence seq;
+ private static MooSequence seq;
+
private static Sequencer sequencer = null;
- private static String filename;
- private static int position;
+ private static Synthesizer synthesizer = null;
+ private static Receiver receiver = null;
+ private static MidiChannel[] channels;
+
+ private static String file;
+ private static long position;
/*
* Starts the application.
*/
public static void main (String[] args) {
- // Creates song and GUI
seq = new MooSequence();
- gui = new MooGUI(mooSeq);
+ gui = new MooGUI(seq);
- // Initializes MIDI sequencer
+ // Acquires MIDI devices and connects them.
try {
sequencer = MidiSystem.getSequencer();
sequencer.open();
+ synthesizer = MidiSystem.getSynthesizer();
+ synthesizer.open();
+ sequencer.getTransmitter().setReceiver(synthesizer.getReceiver());
} catch (MidiUnavailableException e) {
- System.exit(0);
+ quit();
}
+
+ channels = synthesizer.getChannels();
}
/*
* @return the current sequence
*/
public static MooSequence getSequence() {
- return mooSeq;
+ return seq;
}
/*
* Starts playback of the current sequence.
*/
public static void play() {
- seq = mooSeq.getSequence();
- sequencer.setSequence(seq);
+ sequencer.setSequence(seq.getSequence());
+ 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();
}
/*
*/
public static void stop() {
sequencer.stop();
+ sequencer.setTickPosition(position);
}
/*
* Rewinds the current sequence the given number of measures.
* @param measures the number of measures to rewind
*/
- public static void rewind(int measures) {
-
+ public static long getPosition() {
+ return position;
+ }
+
+ /*
+ * Rewinds the current sequence the given number of measures.
+ * @param measures the number of measures to rewind
+ */
+ public static void setPosition(long ticks) {
+ 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;
}
/*
* Fast forwards the current sequence the given number of measures.
* @param measures the number of measures to fast forward
*/
- public static void forward(int measures) {
-
+ public static void forward(long ticks) {
+ position += ticks;
}
/*
* @param filename the filename to use
*/
public static void load(String filename) throws IOException {
-
+ file = filename;
+ seq = new MooSequence(MidiSystem.getSequence(new File(filename)));
}
/*
* @param filename the filename to use
*/
public static void saveAs(String filename) throws IOException {
-
+ MidiSystem.write(seq.getSequence(), 1, new File(filename));
+
}
/*
* Saves the current sequence to the previously given filename.
*/
public static void save() throws IOException {
-
+ saveAs(file);
}
/*
- * Exports the current sequence to a standard MIDI file.
- * @param filename the filename to use
+ * Releases all reserved devices and exits the program.
*/
- public static void exportMIDI(String filename) throws IOException {
-
+ public static void quit() {
+ if (sequencer.isOpen()) {
+ try {
+ sequencer.open();
+ } catch (MidiUnavailableException e) {}
+ }
+ System.exit(0);
}
}
\ No newline at end of file