Как разобрать входящие сообщения Web MIDI API (onmidimessage)

Давайте предположим, что я уже использую Web MIDI API для прослушивания MIDI-входов для сообщений, и теперь я пытаюсь понять и использовать данные, которые я получаю.

Как я могу разобрать некоторую основную информацию из MIDIMessageEvent?

  • команда
  • канал
  • нота
  • скорость

Как я могу интерпретировать проанализированную информацию для некоторых основных событий MIDI?

  • onNote
  • onPad
  • onPitchBend
  • onModWheel

1 ответ

Решение

Анализировать и интерпретировать данные входящего сообщения 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

Ресурсы:

Другие вопросы по тегам