首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JavaX MIDI -播放带有自定义声音字体的MIDI文件

JavaX MIDI -播放带有自定义声音字体的MIDI文件
EN

Stack Overflow用户
提问于 2018-12-25 20:49:47
回答 2查看 865关注 0票数 3

我试着为一个java程序实现一个MIDI播放器。所以我开始使用javax.sound.midi库。我在那里加载我的SequencerSynthesizer

代码语言:javascript
复制
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();
}

第一秒,我可以清楚地听到我加载的soundfont,但在那之后,不知何故,midi播放了一个标准的soundfont。我检查了一下,javax.sound.midi库支持SF2文件(synthesizer.isSoundBankSupported(soundfont)返回true)。

有人知道为什么我的程序是这样的吗?

EN

回答 2

Stack Overflow用户

发布于 2020-03-19 07:36:25

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

代码语言:javascript
复制
Sequencer sequencer = MidiSystem.getSequencer(false);

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

票数 3
EN

Stack Overflow用户

发布于 2019-11-23 03:58:11

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

代码语言:javascript
复制
for(Transmitter tm: sequencer.getTransmitters())
{
    tm.close();
}
sequencer.getTransmitter().setReceiver(synthesizer.getReceiver());

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

不管怎么说,这对我来说很有效...希望它对你也有帮助!

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53922543

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档