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

Posted

技术标签:

【中文标题】如何解析 Web MIDI API 输入消息 (onmidimesage)【英文标题】:How to parse Web MIDI API input messages (onmidimessage) 【发布时间】:2016-12-01 04:50:23 【问题描述】:

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

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

命令 频道 注意 速度

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

注意 在平板上 onPitchBend onModWheel

【问题讨论】:

【参考方案1】:

解析和解释 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

资源:

Web MIDI API MIDI message data summary Script by cwilso Script by cotejp

【讨论】:

以上是关于如何解析 Web MIDI API 输入消息 (onmidimesage)的主要内容,如果未能解决你的问题,请参考以下文章

Win 10 应用开发MIDI 音乐合成——音符消息篇

Angular 2/Web Api - json 解析错误语法错误意外结束输入

使用 C 解析 MIDI 文件 - (分配内存的可能问题)

Android上的Midi事件路由

Web midi API 和多个同步笔记

尝试使用 Web api 从 Azure 队列中检索消息文本,但消息文本已编码。我如何删除编码