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

时间:2016-12-01 04:50:24

标签: javascript ecmascript-6 midi web-midi

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

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

  • 命令
  • 信道
  • 注释
  • 速度

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

  • onPad
  • onPitchBend
  • onModWheel

1 个答案:

答案 0 :(得分:4)

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

用ES6编写的示例。

data中的MIDIMessageEvent可以使用解析功能进行拆分:

/**
 * 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

<强>资源: