javascript MIDI-события очищены - PullRequest
0 голосов
/ 21 апреля 2020

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

function awaitReply(msg=null, timeout=5000) {
  return new Promise(resolve => {
    midiIn.onmidimessage = msgg => {resolve(msgg);}
    if (msg!=null){ midiOut.send(msg);}
    setTimeout(() => {resolve({data:null}); }, timeout);
  });
}
async function sendMIDImessage(){
  let res = await awaitReply([0xF0, 0x52, 0x00, 0x6E, 0x09, 0x00, 0x00,0x00, 0xF7]);
  //Do something
}

Этот код очень хорошо работает в нормальных условиях, но имеет один недостаток. Иногда устройство отвечает более чем одним сообщением, которое остается в очереди. Когда я спрашиваю снова, я получаю остаток от предыдущего ответа (который я просто хочу игнорировать, потому что я не вижу, как обрабатывать несколько ответов), и существует постоянное смещение. Я хотел бы иметь возможность очистить события перед отправкой нового. Что я пробовал:

function awaitReply(msg=null, timeout=5000) {
  while (midiIn.onmidimessage=mssg=>{return mssg.data.length>0){dump=mssg.data}
  return new Promise(...);
}

Не элегантное решение и не работает. Удаление прослушивателя событий также не работает.

Что работает, но слишком медленно: EDIT: он слишком медленный из-за тайм-аута (поэтому я могу уменьшить его до 1 мс, потому что MIDI-сообщения уже в очереди)

async function sendMIDImessage(){
  var dump=await awaitReply(null,5000)!
  while (dump!=null){
    dump=await awaitReply(null,5000);
  }
  let res = await awaitReply([0xF0, 0x52, 0x00, 0x6E, 0x09, 0x00, 0x00,0x00, 0xF7]);
  //Do something
}

Я чувствую, что должно быть более простое решение моего обходного пути. Как очистить прослушиватель событий midiIn.onmidimessage?

Не стесняйтесь добавлять предложения о моем методе решения этой проблемы общения

...