繁体   English   中英

JavaX MIDI - 使用自定义声音字体播放 MIDI 文件

[英]JavaX MIDI - Play MIDI file with custom 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)。
有人知道为什么我的程序会这样吗?

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

Sequencer sequencer = MidiSystem.getSequencer(false);

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM