JavaX MIDI - Воспроизведение MIDI-файла с пользовательским звуковым шрифтом


Я пытался реализовать MIDI-плеер для Java-программы. Итак, я начал использовать 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();
}

Первую секунду я отчетливо слышу свой загруженный звуковой шрифт, но после этого миди как-то воспроизводится со стандартным звуковым шрифтом. Я проверил, и файл SF2 поддерживается javax.sound.midi библиотека (synthesizer.isSoundBankSupported(soundfont) возвращает истину).
Кто-нибудь знает, почему моя программа ведет себя так?

0 ответов

Закрытие всех передатчиков решает проблему стандартного воспроизводимого шрифта, но более простой способ решить эту проблему - создать секвенсор без каких-либо передатчиков:

Sequencer sequencer = MidiSystem.getSequencer(false);

Подключение пользовательского синтезатора к созданному таким образом секвенсору будет производить только обычные звуки.

У вас может быть еще несколько передатчиков на вашем секвенсоре. Я тоже столкнулся с этой дурацкой проблемой. Тогда я придумал это:

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

Я только начал играть с Java вообще, не говоря уже о Midi. Похоже, что мало кто туда идет. Я хотел, чтобы было больше...

В любом случае, это помогло мне... надеюсь, это поможет и вам!

Другие вопросы по тегам