var midimessage = require('midimessage')
module.exports = function (player) {
/**
* Connect a player to a midi input
*
* The options accepts:
*
* - channel: the channel to listen to. Listen to all channels by default.
*
* @param {MIDIInput} input
* @param {Object} options - (Optional)
* @return {SamplePlayer} the player
* @example
* var piano = player(...)
* window.navigator.requestMIDIAccess().then(function (midiAccess) {
* midiAccess.inputs.forEach(function (midiInput) {
* piano.listenToMidi(midiInput)
* })
* })
*/
player.listenToMidi = function (input, options) {
var started = {}
var opts = options || {}
var gain = opts.gain || function (vel) { return vel / 127 }
input.onmidimessage = function (msg) {
var mm = msg.messageType ? msg : midimessage(msg)
if (mm.messageType === 'noteon' && mm.velocity === 0) {
mm.messageType = 'noteoff'
}
if (opts.channel && mm.channel !== opts.channel) return
switch (mm.messageType) {
case 'noteon':
started[mm.key] = player.play(mm.key, 0, { gain: gain(mm.velocity) })
break
case 'noteoff':
if (started[mm.key]) {
started[mm.key].stop()
delete started[mm.key]
}
break
}
}
return player
}
return player
}
|