86 lines
2.7 KiB
Java
86 lines
2.7 KiB
Java
|
import java.applet.Applet;
|
||
|
import java.awt.Graphics;
|
||
|
import java.io.*;
|
||
|
|
||
|
import java.net.*;
|
||
|
|
||
|
import javax.sound.midi.*;
|
||
|
import com.sun.media.sound.*;
|
||
|
import javax.sound.midi.*;
|
||
|
|
||
|
|
||
|
public class MixerMidiApplet extends Applet {
|
||
|
|
||
|
Sequencer sequencer = null;
|
||
|
Sequence mySeq = null;
|
||
|
|
||
|
@Override
|
||
|
public void start() {
|
||
|
|
||
|
//What midi file do we need to play.. ?
|
||
|
|
||
|
String filename = getParameter("MIDIFILE");
|
||
|
|
||
|
// Main code, its in a try thanks to all the calls that
|
||
|
// might theoretically go wrong.
|
||
|
try {
|
||
|
// Get a list of midi devices installed. We added our own device
|
||
|
// (well actually only a device provider) that returns a
|
||
|
// MixerSequencer. Another option would be to use the
|
||
|
// default RealtimeSequencer and then use a RMF midifile,
|
||
|
// that way the RealtimeSequencer will be using a MixerSequencer.
|
||
|
// But then we need our own MidiFileReader and return
|
||
|
// the correct MidiFile info, this is much easier :)
|
||
|
MidiDevice.Info[] infos = MidiSystem.getMidiDeviceInfo();
|
||
|
|
||
|
// infos[0] should be our MixerSequencerProvider
|
||
|
MidiDevice mixer = MidiSystem.getMidiDevice(infos[0]);
|
||
|
|
||
|
// Turn it into a sequencer
|
||
|
sequencer = (Sequencer)mixer;
|
||
|
|
||
|
// Open it
|
||
|
sequencer.open();
|
||
|
|
||
|
// Get the input stream from the midi file so we
|
||
|
// can use that in setSequencer
|
||
|
InputStream midistream = getClass().getResourceAsStream(filename);
|
||
|
|
||
|
//We need to convert the InputStream to an byteArrayInputStream
|
||
|
// to avoid 'ERROR! java.io.IOException: mark/reset not supported'
|
||
|
// exceptions
|
||
|
ByteArrayOutputStream bos = new ByteArrayOutputStream();
|
||
|
byte[] buf = new byte[1024];
|
||
|
int c;
|
||
|
while((c = midistream.read(buf)) != -1) {
|
||
|
bos.write(buf, 0, c);
|
||
|
}
|
||
|
|
||
|
ByteArrayInputStream bamidistream = new ByteArrayInputStream(bos.toByteArray());
|
||
|
|
||
|
// This will call nOpenRmfSequencer wich will the RMF SONG BlockID
|
||
|
// as our pSong->userReference
|
||
|
sequencer.setSequence(bamidistream);
|
||
|
|
||
|
// We add a controler at the first array field.
|
||
|
MyController mc = new MyController();
|
||
|
|
||
|
// This will fil the right tables, and add our newly found
|
||
|
// SONG id (in the .rmf file) where we want it.
|
||
|
sequencer.addControllerEventListener(mc, new int[] {0});
|
||
|
|
||
|
// Start playing the midi file, then find a nice
|
||
|
// 00 B0 80 00 secquence and make us happy
|
||
|
sequencer.start();
|
||
|
|
||
|
} catch (Exception ex) {
|
||
|
System.out.println("ERROR! " + ex);
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
public void run() {
|
||
|
|
||
|
}
|
||
|
|
||
|
}
|