3


我试图为 java 程序实现一个 MIDI 播放器。所以我开始使用javax.sound.midi图书馆。我在那里加载我的Sequencer和我的Synthesizer

private void playMidiFile() {

   Soundbank soundfont = MidiSystem.getSoundbank(Util.internalFile("FluidR3_GM.sf2").getInputStream());
   Sequencer sequencer = MidiSystem.getSequencer();
   Synthesizer synthesizer = MidiSystem.getSynthesizer();

   sequencer.open();
   synthesizer.open();
   synthesizer.loadAllInstruments(soundfont);

   sequencer.getTransmitter().setReceiver(synthesizer.getReceiver());
   sequencer.setSequence(Util.internalFile("MyMusic.mid").getInputStream());

   sequencer.start();
}

第一秒钟我可以清楚地听到我加载的声音字体,但在那之后不知何故,midi 以标准声音字体播放。我检查了javax.sound.midi库支持 SF2 文件(synthesizer.isSoundBankSupported(soundfont)返回 true)。
有人知道我的程序为什么会这样吗?

4

2 回答 2

3

关闭所有发射器可以解决正在播放的标准字体,但解决问题的更简单方法是创建一个没有任何发射器的音序器:

Sequencer sequencer = MidiSystem.getSequencer(false);

将自定义合成器连接到以这种方式创建的音序器只会产生自定义声音。

于 2020-03-18T23:36:25.080 回答
2

您的音序器上可能还有更多发射器。我也遇到了这个愚蠢的问题。然后我想出了这个:

for(Transmitter tm: sequencer.getTransmitters())
{
    tm.close();
}
sequencer.getTransmitter().setReceiver(synthesizer.getReceiver());

我才刚刚开始完全使用Java,更不用说Midi了。似乎很少有人从那里开始。我希望有更多...

无论如何,它对我有用......希望它也能帮助你!

于 2019-11-22T19:58:11.427 回答