2016-12-01 5 views
1

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

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

  • команда
  • канал
  • примечание
  • скорость

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

  • onNote
  • onPad
  • onPitchBend
  • onModWheel

ответ

3

Анализировать и интерпретировать Web MIDI данные сообщения ввода API

Примеры, написанные в ES6.

The 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 

ресурсы: