UNPKG

midi-grid

Version:

Map a duplex midi stream to observable input and output value grids.

89 lines (76 loc) 1.97 kB
var MidiStream = require('midi-stream') var ArrayGrid = require('array-grid') var MidiGrid = require('./') var duplexPort = MidiStream('Launchpad Mini 2') var mapping = ArrayGrid([], [8,8]) var columnMajor = ArrayGrid([], [8,8], [1, 8]) for (var r=0;r<8;r++){ for (var c=0;c<8;c++){ var launchpadButtonId = (r * 16) + c mapping.set(r, c, '144/' + launchpadButtonId) } } var launchpad = MidiGrid(duplexPort, mapping) var posRow = 0 var posCol = 0 var posCircle = 0 var colorsRow = [13, 60, 13] var colorsCol = [28, 15, 28] var colorsCircle = [63, 62, 29] var circle = [ [-2,-2], [2,2], [-2,2], [2,-2], [-1,-1], [1,1], [-1,1], [1,-1], [0,0], ] var down = [] launchpad(function(values){ if (values._diff){ var coords = values._diff[0] var key = coords[0] + '/' + coords[1] if (values._diff[2]){ for (var r=coords[0]-1;r<=coords[0]+1;r++){ for (var c=coords[1]-1;c<=coords[1]+1;c++){ launchpad.output.set(r, c, 0) } } down.push(key) } else { down.splice(down.indexOf(key), 1) } } }) function stepRow(){ var color = Math.floor(posRow / 64) % colorsRow.length var coords = launchpad.coordsAt(posRow % 64) launchpad.output.set(coords[0], coords[1], colorsRow[color]) posRow += 1 } function stepCol(){ var color = Math.floor(posCol / 64) % colorsCol.length var coords = columnMajor.coordsAt(posCol % 64) launchpad.output.set(coords[0], coords[1], colorsCol[color]) posCol += 1 } function encircle(){ var offset = circle[posCircle % circle.length] launchpad.data().forEach(function(value, i){ if (value){ var coords = launchpad.coordsAt(i) launchpad.output.set( coords[0] + offset[0], coords[1] + offset[1], colorsCircle[Math.floor(posCircle / circle.length) % colorsCircle.length] ) } }) posCircle += 1 } setInterval(stepRow, 40) setInterval(stepCol, 40) setInterval(encircle, 20)