observ-midi
Version:
Observe and write to midi stream as a single value, struct, array or grid.
60 lines (45 loc) • 1.2 kB
JavaScript
var Observ = require('observ')
var handle = require('./lib/handle.js')
var getMessage = require('./lib/get-message.js')
var handleResend = require('./lib/handle-resend.js')
var getValue = require('./lib/get-value.js')
var write = require('./lib/write.js')
var getMappedMessage = require('./lib/get-mapped-message')
module.exports = midiValue
function midiValue(duplexPort, mapping, output){
var obs = Observ()
obs.output = output || Observ()
var outputValues = {}
var removeListeners = [
handle(duplexPort, handleData),
obs.output(updateOutput),
handleResend(duplexPort, outputValues, clearInput)
]
if (output){
updateOutput(output())
}
obs.destroy = function() {
removeListeners.forEach(invoke)
}
return obs
/// scoped
function handleData (data) {
var msg = getMappedMessage(data)
if (mapping === String(msg.key)) {
obs.set(msg.value)
}
}
function updateOutput(value){
value = getValue(value)
if (outputValues[mapping] !== value){
outputValues[mapping] = value
write(duplexPort, getMessage(mapping, value))
}
}
function clearInput(){
obs.set(null)
}
}
function invoke(f) {
f()
}