JavaX MIDI-播放具有自定义音效的MIDI文件

时间:2018-12-25 12:49:47

标签: java midi javasound soundfont


我试图为Java程序实现MIDI播放器。因此,我开始使用javax.sound.midi库。我在这里加载SequencerSynthesizer

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)。
有人知道我的程序为什么会这样吗?

2 个答案:

答案 0 :(得分:1)

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

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

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

无论如何,它为我带来了成功。希望它也能对您有所帮助!

答案 1 :(得分:0)

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

Sequencer sequencer = MidiSystem.getSequencer(false);

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