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. Похоже, что мало кто туда идет. Я хотел, чтобы было больше...
В любом случае, это помогло мне... надеюсь, это поможет и вам!