我正在使用带有 Web MIDI API 的 MIDI 协议与 MIDI 设备进行通信。每次等待响应或超时以发送下一条消息时,我都想向此设备发送 MIDI 消息。通过接收响应。
我想要以下内容:
//gotMIDImessage will be called when the message is received
midiIn.onmidimessage = gotMIDImessage;
function gotMIDImessage(messageData) {
//Do something with the data
}
//send bunch of messages in a loop and wait for responce each time
function askDevice(){
for (var i=0;i<n;i++){
for (var j=0;j<m;j++){
midiOut.send([0xF0,0x52,0x00,0x61,0x09,0x00,i,j,0xF7]);
//wait for gotMIDImessage or timeout to continue and do something about the response hre
}
}
}
这是我的第一次尝试:
midiIn.onmidimessage = gotMIDImessage;
function gotMIDImessage(messageData) {
received.innerHTML=received.innerHTML+"<br>"+messageData.data;
return new Promise(resolve => {
setTimeout(() => {
resolve(1);
}, 100);
});
}
async function askDevice() {
var o = {'data': 'await'};
for (var i=0;i<5;i++){
for (var j=0;j<3;j++){
var res=await gotMIDImessage(o);
midiOut.send([0xF0,0x52,0x00,0x61,0x09,0x00,i,j,0xF7]);
}
}
}
它显然不起作用,因为await gotMIDImessage();
调用了该函数gotMIDImessage()
,但该函数在收到消息时会自动触发。
我怎样才能做到这一点?
编辑:我也试过这个似乎不起作用的版本
received=null;
midiMessage=null;
function gotMIDImessage(messageData) {
received=true;
midiMessage=messageData.data;
}
function sendWait(message){
received=false;
midiOut.send(message);
function waitForIt(){
if(!received){
setTimeout(function(){waitForIt()},1000);
}else{
alert("received");
}
}
return midiMessage;
}
function askDevice() {
var o = {'data': 'await'};
for (var i=0;i<5;i++){
for (var j=0;j<3;j++){
res=sendWait([0xF0,0x52,0x00,0x61,0x09,0x00,i,j,0xF7]);
}
}
}
res
始终为空,我在循环完成后收到所有 15 条消息