Аппаратный MIDI Out для воспроизведения на Java?

Я делаю простое приложение для воспроизведения MIDI-файлов на Java.
Я использую javax.sound.midi библиотека.

Я могу правильно извлечь свое устройство MIDI Out (кабель USB-MIDI).

Но при воспроизведении последовательности она всегда воспроизводится в синтезаторе звука по умолчанию, который является воспроизведением General Midi (Soundfont) основной операционной системы.

Проблема, с которой я столкнулся, - это изменение MIDI Out по умолчанию.

Когда я выполню

Receiver MidiOutReceiver; //instantiated earlier
Sequencer MidiOutSequencer = MidiSystem.getSequencer();
MidiOutSequencer.open();
MidiOutSequencer.start();

Я слышу воспроизведение MIDI-последовательности из динамиков.

После обращения к документации

3.10.
"Java Sound Sequencer" неявно подключен к синтезатору по умолчанию, 
3.5.
В вашей программе вы можете получить экземпляр Synthesizer самостоятельно и подключиться 
это для секвенсора, явно использующего пару передатчик / приемник. 
Итак, вы знаете, какой синтезатор используется. 
Если вы получили секвенсор, который предварительно подключен к синтезатору,
Вы можете узнать синтезатор, используя метод getTransmitters().
Но нет упоминания о том, как явно использовать эту пару передатчик / приемник и создать экземпляр объекта Sequencer с новым синтезатором по умолчанию.

У меня есть правильный передатчик и приемник. Но они не играют вне MIDI.

Также, когда я пытаюсь

MidiSystem.getTransmitter().setReceiver(MidiOutReceiver);

Кажется, это ничего не меняет.

Как явно использовать эту пару приемник / передатчик с синтезатором, чтобы секвенсор по умолчанию использовал мой порт MIDI-выхода?

1 ответ

Решение

Я упустил что-то простое. По умолчанию Sequencer вернулся MidiSystem.getSequencer(); имеет передатчик, который в свою очередь имеет setReceiver() способ добавить устройство MIDI Out. Но у вас должно быть правильное устройство MIDI Out. Я выбрал не то устройство случайно.

Итак, сначала правильное устройство вывода выбирается, просматривая DeviceInfos массив, выбирая правильное устройство, затем устанавливая Sequencer с правильным Receiver,

MidiDevice.Info[] MidiDeviceInfos = MidiSystem.getMidiDeviceInfo();
//find the suitable device number here, based on some criteria
MidiDevice MidiOutDevice = MidiSystem.getMidiDevice(MidiDeviceInfos[DEVICE_NUMBER]);
Receiver MidiOutReceiver = MidiOutDevice.getReceiver();
Sequencer MidiOutSequencer = MidiSystem.getSequencer();
//Add the new MIDI out device here.
MidiOutSequencer.getTransmitter().setReceiver(MidiOutReceiver);
MidiOutSequencer.open();

Теперь вы можете open() файл и play() это, но так как устройство MIDI Out по умолчанию также используется, вы также можете услышать звуки MIDI General /Soundfont. Это сначала сбило меня с толку, но теперь MIDI-устройство также будет отправлять открытую последовательность из вашего добавленного Receiver,

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