Существуют две библиотеки, которые будут использоваться для воспроизведения миди-файла с использованием SoundFont.
Midi Driver
Просто синтезатор для воспроизведения MIDI-ноты на Android. Вы можете использовать его вместе с библиотекой USB / Bluetooth-MIDI для создания приложения MIDI.
Файл SoundFont2 поддерживается.
Android MIDI Library
Эта библиотека предоставляет интерфейс для чтения, манипулирования и записи файлов MIDI. «Воспроизведение» поддерживается в качестве системы диспетчеризации событий в режиме реального времени. Эта библиотека НЕ включает фактическое воспроизведение звука или сопряжение устройства.
Для инициализации SF2-SoundBank
SF2Soundbank sf = new SF2Soundbank(getAssets().open("test.sf2"));
synth = new SoftSynthesizer();
synth.open();
synth.loadAllInstruments(sf);
synth.getChannels()[0].programChange(0);
synth.getChannels()[1].programChange(1);
recv = synth.getReceiver();
Воспроизведение нот миди из файла миди
MidiFile midiFile = new MidiFile(getAssets().open("test.mid"));
// Create a new MidiProcessor:
MidiProcessor processor = new MidiProcessor(midiFile);
// listen for all midi events:
processor.registerEventListener(new MidiEventListener() {
@Override
public void onStart(boolean fromBeginning) {
}
@Override
public void onEvent(MidiEvent event, long ms) {
if (event.getClass() == NoteOn.class) {
NoteOn noteOn = ((NoteOn) event);
try {
ShortMessage msg = new ShortMessage();
msg.setMessage(ShortMessage.NOTE_ON, channel, noteOn.getNoteValue(), noteOn.getVelocity());
recv.send(msg, ms);
} catch (InvalidMidiDataException e) {
e.printStackTrace();
}
} else if (event.getClass() == NoteOff.class) {
NoteOff noteOff = ((NoteOff) event);
try {
ShortMessage msg = new ShortMessage();
msg.setMessage(ShortMessage.NOTE_ON, channel, noteOff.getNoteValue(), noteOff.getVelocity());
recv.send(msg, ms);
} catch (InvalidMidiDataException e) {
e.printStackTrace();
}
}
}
@Override
public void onStop(boolean finished) {
}
}, MidiEvent.class);
// Start the processor:
processor.start();
Переменная для определения канала SF
private int channel = 0;