YES!
solution by Andrew Davison:
http://fivedots.coe.psu.ac.th/~ad/jg/ch05/index.html
does NOT work with 1.5.0_02-b09
successfully tested with 1.5.0_04-b05 and 1.6.0-ea-b45
private void initSequencer()
/* Set up the MIDI sequencer, the sequencer's meta-event
listener, and its synthesizer. */
{
try {
sequencer = obtainSequencer();
if (sequencer == null) {
System.out.println("Cannot get a sequencer");
System.exit(0);
}
sequencer.open();
// sequencer.addMetaEventListener(this);
// maybe the sequencer is not the same as the synthesizer
// so link sequencer --> synth (this is required in J2SE 1.5)
if (!(sequencer instanceof Synthesizer)) {
System.out.println("Linking the MIDI sequencer and synthesizer");
synthesizer = MidiSystem.getSynthesizer();
synthesizer.open(); // new
Receiver synthReceiver = synthesizer.getReceiver();
Transmitter seqTransmitter = sequencer.getTransmitter();
seqTransmitter.setReceiver(synthReceiver);
}
else
synthesizer = (Synthesizer) sequencer;
}
catch (MidiUnavailableException e){
System.out.println("No sequencer available");
System.exit(0);
}
} // end of initSequencer()
private Sequencer obtainSequencer()
/* This method handles a bug in J2SE 1.5.0 which retrieves
the sequencer with getSequencer() but does not allow
its volume to be changed. */
{
// return MidiSystem.getSequencer();
// okay in J2SE 1.4.2, but not in J2SE 1.5.0
MidiDevice.Info[] mdi = MidiSystem.getMidiDeviceInfo();
int seqPosn = -1;
for(int i=0; i < mdi.length; i++) {
System.out.println(mdi[i].getName());
// if (mdi[i].getName().contains("Sequencer")) {
if (mdi[i].getName().indexOf("Sequencer") != -1) {
seqPosn = i; // found the Sequencer
System.out.println(" Found Sequencer");
}
}
try {
if (seqPosn != -1)
return (Sequencer) MidiSystem.getMidiDevice( mdi[seqPosn] );
else
return null;
}
catch(MidiUnavailableException e)
{ return null; }
} // end of obtainSequencer()