我正在将一个TR-808的Soundbank加载到Java中并希望播放该套件 - 问题是我无法禁用与鼓一起播放的默认音库。 只使用GM声音时一切正常,但加载SoundBank时,所有内容都会被混合在一起。
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);
}
在这里看一下吗?
修改
我刚刚发现了这一点,显然我不是唯一一个遇到this问题的人:
一个人写道
这里的某人似乎遇到了同样的问题,默认的音库与新的同时播放: http://forums.sun.com/thread.jspa?threadID=5182082。 他们的“已解决”回复并没有提供太多信息。与他们的新soundbank的.gm文件的位置有关。
可悲的是,与Sun论坛的链接不再起作用了(我正在看着你,甲骨文!)而这篇帖子是从2009年开始的,所以它在互联网时代已经很老了,我希望这个问题已经存在已经解决了 - 遗憾的是,它似乎没有。
我转而使用Beads Project(http://beadsproject.net),他们也提供Midi支持。我的音频样本工作得很好(比Java Audio好得多!)并且会在近期(-ish)的未来尝试使用他们的Midi实现。如果有人有兴趣,我可以在收到结果后立即发布此问题的更新。
答案 0 :(得分:1)
根据Javadocs,这是音序器的预期行为。
呼叫时:
MidiSystem.getSequencer()
Java将将此定序器实例与默认的合成器相连。这将使用低分辨率默认声音字体输出声音。当您将自定义合成器连接到音序器时,音序器会将声音发送到默认的合成器和您的自定义合成器,从而产生两种声音。
另一方面,在致电时:
MidiSystem.getSequencer(false)
Java创建一个未连接到任何合成器的音序器。默认情况下,此音序器将不输出声音。将其连接到您创建的自定义合成器将仅输出已加载乐器的声音。