observ-midi
Version:
Observe and write to midi stream as a single value, struct, array or grid.
51 lines (46 loc) • 1.17 kB
JavaScript
var Observ = require('observ')
var ObservMidi = require('./')
var ObservArray = require('observ-array')
module.exports = function(duplexPort, mappings){
var result = ObservMidi(duplexPort, mappings)
Object.keys(mappings).forEach(extend, result)
return result
}
function extend(key){
var buttons = this
var button = buttons[key]
button.state = Observ()
button.flash = flash
button.light = light
extendValueStack(button.output, [button.state])
}
function extendValueStack(obs, stack){
if (!obs.stack){
obs.stack = ObservArray(stack || [Observ(obs())])
return obs.stack(function(values){
var topValue = null
values.forEach(function(value){
if (value){
topValue = value
}
})
obs.set(topValue)
})
}
}
function light(color, insertAt){
var output = this.output
var obs = Observ(color)
if (insertAt != null){
output.stack.splice(insertAt, 0, obs)
} else {
output.stack.push(obs)
}
return function remove(){
var index = output.stack.indexOf(obs)
output.stack.splice(index, 1)
}
}
function flash(color, duration){
setTimeout(this.light(color), duration || 50)
}