Java Midi默认音库与新的同时播放

时间:2016-01-30 21:02:08

标签: java midi javasound soundfont

我正在将一个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实现。如果有人有兴趣,我可以在收到结果后立即发布此问题的更新。

1 个答案:

答案 0 :(得分:1)

根据Javadocs,这是音序器的预期行为。

呼叫时:

MidiSystem.getSequencer()

Java将将此定序器实例与默认的合成器相连。这将使用低分辨率默认声音字体输出声音。当您将自定义合成器连接到音序器时,音序器会将声音发送到默认的合成器和您的自定义合成器,从而产生两种声音。

另一方面,在致电时:

MidiSystem.getSequencer(false)

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