Как справиться с подключением / отключением устройства через Web MIDI? - PullRequest
0 голосов
/ 29 августа 2018

Я работаю над онлайн-инструктором по чтению нот, прототип доступен здесь . Мне удалось реализовать доступ к ранее подключенной MIDI-клавиатуре, однако я изо всех сил пытаюсь реализовать сценарий «горячего подключения / отключения».

Мой последний дубль выглядит так:

    setupDevices(inputs){
    let deviceName = '';

    inputs.forEach((value, key, map) => {
        if (value.connection === 'open' || value.connection === 'pending' ){

            value.open().then((midiInput) => {
                console.log(`Opened ${midiInput.name}`);
                midiInput.onmidimessage = midiController.onMIDIMessage;
            }, null);
        } else {
            value.onmidimessage = null;
        }
    });

    if (deviceName.length === 0) {
        deviceName = 'none';
    }

    document.getElementById('connectedDevice').setAttribute('value', deviceName);
},

onMIDISuccess(midiAccess) {
    midiAccess.onstatechange = (evt) => {
        console.log('MIDI config changed');
        midiController.setupDevices(evt.currentTarget.inputs);
    };
}

При отладке все обещания вызываются с хорошо выглядящими аргументами, но я не могу получить никаких сообщений о ключах. Также console.log (Opened ${midiInput.name}) вызывается намного чаще, чем ожидалось:

midiController.js:57 MIDI config changed
midiController.js:40 Opened KOMPLETE KONTROL - 1
midiController.js:57 MIDI config changed
midiController.js:40 Opened KOMPLETE KONTROL - 1
midiController.js:57 MIDI config changed
midiController.js:40 Opened KOMPLETE KONTROL - 1
midiController.js:40 Opened KOMPLETE KONTROL EXT - 1
midiController.js:40 Opened KOMPLETE KONTROL - 1
3
midiController.js:40 Opened KOMPLETE KONTROL EXT - 1
midiController.js:57 MIDI config changed
midiController.js:40 Opened KOMPLETE KONTROL - 1
midiController.js:40 Opened KOMPLETE KONTROL EXT - 1
midiController.js:57 MIDI config changed
midiController.js:40 Opened KOMPLETE KONTROL - 1
midiController.js:40 Opened KOMPLETE KONTROL EXT - 1
2
midiController.js:40 Opened Komplete Kontrol DAW - 1
midiController.js:57 MIDI config changed
midiController.js:40 Opened KOMPLETE KONTROL - 1
midiController.js:40 Opened KOMPLETE KONTROL EXT - 1
midiController.js:57 MIDI config changed
midiController.js:40 Opened KOMPLETE KONTROL - 1
midiController.js:40 Opened KOMPLETE KONTROL EXT - 1

(все это печатается сразу после того, как я только что включил контроллер). Есть намеки?

1 Ответ

0 голосов
/ 30 августа 2018
function midiOnMIDImessage(event) {
        console.log(event);
    }
function requestMIDIAccessSuccess(midi) {
        var inputs = midi.inputs.values();
        for (var input = inputs.next(); input && !input.done; input = inputs.next()) {
            input.value.onmidimessage = midiOnMIDImessage;
        }
    }
navigator.requestMIDIAccess().then(requestMIDIAccessSuccess, requestMIDIAccessFailure);

См. Рабочий пример

...