observ-midi
Version:
Observe and write to midi stream as a single value, struct, array or grid.
57 lines (43 loc) • 1.21 kB
JavaScript
var ObservVarhash = require('observ-varhash')
var handle = require('./lib/handle.js')
var getMessage = require('./lib/get-message.js')
var getValue = require('./lib/get-value.js')
var handleResend = require('./lib/handle-resend.js')
var write = require('./lib/write.js')
module.exports = midiVarhash
function midiVarhash(duplexPort, output){
var obs = ObservVarhash()
obs.output = output || ObservVarhash()
var outputValues = {}
var removeListeners = [
handle(duplexPort, handleData),
obs.output(updateOutput),
handleResend(duplexPort, outputValues, clearInput)
]
obs.destroy = function() {
removeListeners.forEach(invoke)
}
if (output){
updateOutput(output())
}
return obs
/// scoped
function handleData(data){
var key = data[0] + '/' + data[1]
obs.put(key, data[2])
}
function updateOutput(values){
Object.keys(values).forEach(function(key){
var value = getValue(values[key])
if (outputValues[key] !== value){
outputValues[key] = value
write(duplexPort, getMessage(key, value))
}
})
}
function clearInput(){
Object.keys(obs()).forEach(function(key){
obs.put(key, null)
})
}
}