Аппаратный 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
,