Java Midi默认音箱与新音箱同时播放

Java Midi默认音箱与新音箱同时播放,java,midi,javasound,soundfont,Java,Midi,Javasound,Soundfont,我正在将TR-808的声库加载到Java中,并希望播放该工具包-问题是我无法禁用默认的声库,使其无法与鼓一起播放。 当只使用GM声音时,一切都可以工作,但当加载声音库时,一切都会混在一起 player = MidiSystem.getSequencer(); player.open(); seqTrans = player.getTransmitter(); synth = MidiSystem.getSynthesizer(); synthRcvr = synth.getReceiver(

我正在将TR-808的声库加载到Java中,并希望播放该工具包-问题是我无法禁用默认的声库,使其无法与鼓一起播放。 当只使用GM声音时,一切都可以工作,但当加载声音库时,一切都会混在一起

player = MidiSystem.getSequencer();
player.open();
seqTrans = player.getTransmitter();
synth   = MidiSystem.getSynthesizer();
synthRcvr = synth.getReceiver(); 
seqTrans.setReceiver(synthRcvr);  
synth.open();

File file = new File("resources/TR-808.sf2");
Soundbank soundbank = MidiSystem.getSoundbank(file);
// synth.unloadAllInstruments(synth.getDefaultSoundbank()); don't work:(
synth.loadAllInstruments(soundbank);

Sequence seq = new Sequence(Sequence.PPQ, 4);
Track track = seq.createTrack();

ShortMessage instr = new ShortMessage();
instr.setMessage(192, channel, 35, 0);
MidiEvent changeInstrument = new MidiEvent(instr, 1);
track.add(changeInstrument);

for(int i = 1; i < 30; i++){
    ShortMessage a = new ShortMessage();
    a.setMessage(144, channel, 35, 100);
    MidiEvent noteOn = new MidiEvent(a, 4+4*i);
    track.add(noteOn);
}
player=MidiSystem.getSequencer();
player.open();
seqTrans=player.getTransmiter();
synth=MidiSystem.getSynthesizer();
synthRcvr=synth.getReceiver();
seqTrans.setReceiver(synthRcvr);
synth.open();
File File=新文件(“resources/TR-808.sf2”);
Soundbank Soundbank=MidiSystem.getSoundbank(文件);
//synth.unloadAllInstruments(synth.getDefaultSoundbank());不工作:(
合成负载仪器(声库);
Sequence seq=新序列(Sequence.PPQ,4);
Track Track=seq.createTrack();
ShortMessage instr=新的ShortMessage();
仪器设置信息(192,通道,35,0);
MidiEvent changeInstrument=新的MidiEvent(instr,1);
轨迹。添加(更改仪表);
对于(int i=1;i<30;i++){
短消息a=新短消息();
a、 设置消息(144,通道,35100);
MidiEvent noteOn=新的MidiEvent(a,4+4*i);
track.add(noteOn);
}
这里有什么好看的吗

编辑

我刚刚发现了这个,显然我不是唯一有问题的人:

一个人写

这里似乎有人也有同样的问题,默认的声音库与新的声音库同时播放: . 不过,他们的“已解决”回复并没有提供太多信息。这与他们新soundbank的.gm文件的位置有关

可悲的是,Sun论坛的链接不再有效(我在看你,Oracle!),这篇文章是2009年发布的,所以在互联网时代它已经很老了,我希望这个问题已经解决了——可悲的是,它似乎没有解决


我转而使用Beads项目(),他们也提供Midi支持。我的音频样本工作得非常好(比Java音频好得多!),我将在不久的将来尝试他们的Midi实现未来。如果有人感兴趣,我可以在得到结果后立即发布此问题的更新。

根据Javadocs,这是sequencer的预期行为

打电话时:

MidiSystem.getSequencer()
MidiSystem.getSequencer(false)
Java将此sequencer实例与默认合成器连接。这将使用低分辨率默认soundfonts输出声音。当您将自定义合成器连接到sequencer时,sequencer将声音发送到默认合成器和自定义合成器,并创建两个声音

另一方面,呼叫时:

MidiSystem.getSequencer()
MidiSystem.getSequencer(false)

Java创建的音序器未连接到任何合成器。默认情况下,此音序器不会输出声音。将其连接到您创建的自定义合成器将仅输出加载乐器的声音。

您不需要记录事件吗?打击乐器不需要记录事件,但我刚刚尝试过(感谢你的建议),遗憾的是,这并没有解决问题。声音同时被触发了两次。一次是加载的银行声音,一次是默认的银行声音。太奇怪了。。