如何解析 Web MIDI API 输入消息 (onmidimessage)

How to parse Web MIDI API input messages (onmidimessage)

假设我已经在使用 Web MIDI API 来侦听 MIDI 输入以获取消息,现在我正在尝试理解并利用我接收到的数据。

如何从 MIDIMessageEvent 中解析一些基本信息?

如何解释一些基本 MIDI 事件的解析信息?

解析和解释 Web MIDI API 输入消息数据

用 ES6 编写的示例。

MIDIMessageEvent 中的 data 可以用 解析函数 拆分,如下所示:

/**
 * Parse basic information out of a MIDI message.
 */
function parseMidiMessage(message) {
  return {
    command: message.data[0] >> 4,
    channel: message.data[0] & 0xf,
    note: message.data[1],
    velocity: message.data[2] / 127
  }
}

鉴于 一些事件函数 用于处理基本 MIDI 事件:

function onNote(note, velocity) {}
function onPad(pad, velocity) {}
function onPitchBend(value) {}
function onModWheel(value) {}

我们可能会使用上面的解析函数来解释 MIDI 消息并调用上述事件函数:

/**
 * Handle a MIDI message from a MIDI input.
 */
function handleMidiMessage(message) {

  // Parse the MIDIMessageEvent.
  const {command, channel, note, velocity} = parseMidiMessage(message)

  // Stop command.
  // Negative velocity is an upward release rather than a downward press.
  if (command === 8) {
    if      (channel === 0) onNote(note, -velocity)
    else if (channel === 9) onPad(note, -velocity)
  }

  // Start command.
  else if (command === 9) {
    if      (channel === 0) onNote(note, velocity)
    else if (channel === 9) onPad(note, velocity)
  }

  // Knob command.
  else if (command === 11) {
    if (note === 1) onModWheel(velocity)
  }

  // Pitch bend command.
  else if (command === 14) {
    onPitchBend(velocity)
  }
}

处理程序附加到正确的 MIDI 输入:

midiInput.onmidimessage = handleMidiMessage

资源: