【问题标题】:JavaX MIDI - Play MIDI file with custom soundfontJavaX MIDI - 使用自定义声音字体播放 MIDI 文件
【发布时间】:2018-12-25 12:49:46
【问题描述】:


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

【问题讨论】:

    标签: java midi javasound soundfont


    【解决方案1】:

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

    Sequencer sequencer = MidiSystem.getSequencer(false);
    

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

    【讨论】:

      【解决方案2】:

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

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-09-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多