Как получить ответ на запрос дампа массовой настройки MIDI?

Я использую MIDI Tuning Standard, чтобы изменить настройку с концертной высоты A4 = 440 Гц на произвольные частоты настройки. Это хорошо работает на моей машине с Windows 7 и JDK 1.8.0. Но я хочу проверить раньше, доступен ли Tuning Standard.

Synthesizer synthesizer = MidiSystem.getSynthesizer();
System.out.println(synthesizer.getDeviceInfo().getName());

Распечатывает Gervill и, как описано на домашней странице Gervills, он поддерживает стандарт настройки.

Является ли синтезатор Gervill частью текущих JRE на всех платформах (Windows, Linux, Mac)? И если да, будет ли это частью надолго?

Если Gervill будет заменен другим синтезатором, который не поддерживает MIDI Tuning Standard, я хочу проверить, доступен ли он или нет.

Как проверить, доступен ли стандарт MIDI-настройки?

Моя идея состоит в том, чтобы отправить ЗАПРОС НА ОБЪЕМ ТЮНИНГА, и если я получу ответ, я уверен, что он доступен, иначе нет.

//@formatter:off
final byte[] data = new byte[] {
        (byte) 0xf0, // SysEx Header
        (byte) 0x7e, // Non-Realtime
        (byte) 0x7f, // Target Device = All Devices
        (byte) 0x08, // MIDI Tuning
        (byte) 0x00, // Bulk Tuning Dump Request
        (byte) 0x00, // preset = 0
        (byte) 0xf7, // EOX
};
//@formatter:on
SysexMessage dumpRequest = new SysexMessage(data, data.length);

Так что в спецификации сказано:

Принимающий прибор должен ответить, отправив сообщение дампа массовой настройки, описанное в следующем разделе, для указанного номера настройки.

Но мой вопрос, как я могу получить этот ответ?

Для воспроизведения нот и отправки повторной настройки я использую MIDI следующим образом:

final int PPQN = 16; // Pulses/Ticks per quarter note
Sequence sequence = new Sequence(Sequence.PPQ, PPQN);
final Track track = sequence.createTrack();

// Send dump request
track.add(new MidiEvent(dumpRequest, 0));

// How to receive the response of the request?

final Sequencer sequencer = MidiSystem.getSequencer();
sequencer.setSequence(sequence);
sequencer.open();
sequencer.start();
// ...

1 ответ

Решение

Как видно из диаграммы реализации MIDI, Gervill (как и почти любой другой программный синтезатор) не отправляет MIDI-сообщения.

Вы не можете проверить функции синтезатора по умолчанию из вашего кода.

Если вы хотите использовать определенный синтезатор, вам придется создать его вручную. (Класс Гервилла будет com.sun.media.sound.SoftSynthesizer.)

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