JavaX MIDI - 使用自定义的音色库播放MIDI文件

3


我正在尝试为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 播放却使用了标准声音字体。我检查过 SF2 文件并确认 javax.sound.midi 库支持该字体文件(synthesizer.isSoundBankSupported(soundfont) 返回为 true)。是否有人知道我的程序出现这种行为的原因?

2个回答

3
关闭所有的发送器可以解决标准字体播放的问题,但更简单的解决方法是创建一个没有任何发送器的顺序控制器:
Sequencer sequencer = MidiSystem.getSequencer(false);

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


2

你的序列器上可能还有更多的发射器。我也遇到了这个愚蠢的问题,但我想出了以下解决方案:

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

我刚刚开始学习Java,连Midi都还没碰过。似乎很少有人从这里开始学习。我希望有更多的人能够加入进来。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接