midi-controller
Version:
Create buttons and note matrices from duplex midi streams for midi controllers such as Launchpad.
86 lines (67 loc) • 1.7 kB
JavaScript
module.exports = function(options, filter, onDown, onUp){
var lightStack = []
var currentLight = 0
var offLight = 0
var turnOff = null
var button = {
controlType: 'button',
light: function(color){
var item = {light: color}
lightStack.push(item)
refresh()
return function(shouldRefresh){
var index = lightStack.indexOf(item)
lightStack.splice(index, 1)
if (shouldRefresh !== false) refresh()
}
},
flash: function(color, duration){
var turnOff = button.light(color)
setTimeout(turnOff, duration || 50)
},
setOff: function(color){
offLight = color
refresh()
},
turnOn: function(color){
turnOff&&turnOff(false)
turnOff = button.light(color)
},
turnOff: function(color){
if (turnOff){
turnOff()
turnOff = null
}
},
grab: function(onGrabDown, onGrabUp){
return options.grabber.grab(filter, function(data){
if (data[2]){
onGrabDown&&onGrabDown.apply(button, [data])
} else {
onGrabUp&&onGrabUp.apply(button, [data])
}
})
},
destroy: function(){
release()
}
}
function refresh(){
var light = (lightStack[lightStack.length-1] || {}).light
if (light == null){
light = offLight
}
if (light != currentLight){
currentLight = light
options.port.write([filter[0], filter[1], light || 0])
}
}
var release = options.grabber.grab(filter, function(data){
if (data[2]){
onDown&&onDown.apply(button, [data])
} else {
onUp&&onUp.apply(button, [data])
}
})
return button
}