1

我正在将 TR-808 的 Soundbank 加载到 Java 中并想要播放该套件 - 问题是我无法禁用默认的 Soundbank 与鼓一起播放。仅使用 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);
}

这里有什么看不出来的吗?

编辑

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

一个人写

这里有人似乎遇到了同样的问题,默认音库与新的同时播放: http://forums.sun.com/thread.jspa?threadID= 5182082。不过,他们的“已解决”回复并没有提供太多信息。与他们的新音库的 .gm 文件的位置有关。

可悲的是,Sun 论坛的链接不再起作用(我在看你,甲骨文!)而且帖子是 2009 年的,所以它在互联网时代已经很老了,我希望这个问题已经得到解决 - 可悲的是它似乎没有。

我转而使用 Beads Project ( http://beadsproject.net ),他们还提供 Midi 支持。我的音频样本运行良好(比 Java 音频好得多!),并将在不久的将来(-ish)尝试他们的 Midi 实现。如果有人感兴趣,我可以在得到结果后立即发布此问题的更新。

4

1 回答 1

2

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

调用时:

MidiSystem.getSequencer()

Java 将把这个序列器实例与默认的合成器连接起来。这将使用低分辨率默认声音字体输出声音。当您将自定义合成器连接到音序器时,音序器会将声音发送到默认合成器和您的自定义合成器,从而创建两个声音。

另一方面,调用时:

MidiSystem.getSequencer(false)

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

于 2020-03-18T19:38:15.007 回答