Javascript 如何使用Web MIDI处理设备的插拔?

Javascript 如何使用Web MIDI处理设备的插拔?,javascript,web,midi,web-midi,Javascript,Web,Midi,Web Midi,我正在为在线乐谱阅读培训师工作。我能够实现对以前连接的MIDI键盘的访问,但是,我很难实现热插拔方案 我的最后一张照片是这样的: setupDevices(inputs){ let deviceName = ''; inputs.forEach((value, key, map) => { if (value.connection === 'open' || value.connection === 'pending' ){

我正在为在线乐谱阅读培训师工作。我能够实现对以前连接的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
 (所有这些都是在我刚刚打开控制器之后打印出来的)。有什么提示吗

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);

请参见

我发布的代码已在侦听MIDIAccess.onstatechange,但我无法重新注册关键事件。我尝试使用虚拟MIDI设备,我的chrome 68上也有重复的报告(每个端口报告两次)。但是有一件事,当您调用MIDIPort.open时,如果MIDIPort尚未连接,MIDIAccess statechange将再次触发。当你简单地设置它的onmidmessage时也是如此。这个例子不适合我的控制器,它有多个接口(有时它连接到DAW接口而不是键盘)。但这看起来是一个很有希望的暗示,谢谢!顺便说一句,你的采样器库看起来很好,我要试试。