Как разобрать входящие сообщения 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
Ресурсы: