UNPKG

monode

Version:

Toolkit for the monome and arc osc controllers

237 lines (231 loc) 6.29 kB
(function() { var events, makeGrid, nodeOsc, osc; events = require('events'); osc = require('./osc'); nodeOsc = require('node-osc'); module.exports = makeGrid = function(devicePort, type) { var client, encAddr, grid, handleDisconnect, handleEnc, handleHost, handleId, handleKey, handlePrefix, handleRotation, handleSize, handleTilt, height, host, id, isArc, isReady, keyAddr, port, prefix, ready, rotation, server, setLedAddr, setLevelAddr, size, tiltAddr, width; grid = new events.EventEmitter(); server = null; setLedAddr = null; setLevelAddr = null; keyAddr = null; encAddr = null; tiltAddr = null; client = new nodeOsc.Client('127.0.0.1', devicePort); prefix = null; width = null; height = null; port = null; id = null; host = null; rotation = null; ready = false; isArc = type && type.match(/monome arc (\d+)/); if (isArc) { size = parseInt(isArc[1]); } isArc = !!isArc; new osc.Server(10200, function(error, _server) { if (error) { console.error('Error creating grid server:', error); throw error; } server = _server; port = server.port; server.on('message', function(msg, info) { var address; address = msg[0]; if (!address) { return; } if (address === '/sys/prefix') { return handlePrefix(msg); } else if (address === keyAddr) { return handleKey(msg); } else if (address === encAddr) { return handleEnc(msg); } else if (address === tiltAddr) { return handleTilt(msg); } else if (address === '/sys/size') { return handleSize(msg); } else if (address === '/sys/id') { return handleId(msg); } else if (address === '/sys/host') { return handleHost(msg); } else if (address === '/sys/rotation') { return handleRotation(msg); } else if (address === '/sys/disconnect') { return handleDisconnect(msg); } }); grid.emit('listening', server.port); client.send('/sys/port', port); return client.send('/sys/info', port); }); handlePrefix = function(msg) { prefix = msg[1]; tiltAddr = prefix + '/tilt'; if (isArc) { keyAddr = prefix + '/enc/key'; encAddr = prefix + '/enc/delta'; setLevelAddr = prefix + '/ring/set'; } else { keyAddr = prefix + '/grid/key'; setLedAddr = prefix + '/grid/led/set'; setLevelAddr = prefix + '/grid/led/level/set'; } grid.emit('prefix', prefix); return isReady(); }; handleSize = function(msg) { width = msg[1]; height = msg[2]; grid.emit('size', width, height); return isReady(); }; handleId = function(msg) { id = msg[1]; grid.emit('id', id); return isReady(); }; handleHost = function(msg) { host = msg[1]; grid.emit('host', host); return isReady(); }; handleRotation = function(msg) { rotation = msg[1]; grid.emit('rotation', rotation); return isReady(); }; handleDisconnect = function(msg) { return grid.emit('disconnect', grid); }; handleKey = function(msg) { return grid.emit('key', msg[1], msg[2], msg[3]); }; handleEnc = function(msg) { return grid.emit('enc', msg[1], msg[2]); }; handleTilt = function(msg) { return grid.emit('tilt', msg[1], msg[2], msg[3], msg[4]); }; isReady = function() { if (!ready) { if ((height || size) && rotation !== null && port && id && host && prefix) { ready = true; return grid.emit('ready', grid); } } }; grid.level = function(x, y, i) { return client.send(setLevelAddr, x, y, i); }; grid.close = function() { if (server) { return server.kill(); } }; if (isArc) { grid.led = function(x, y, s) { return client.send(setLevelAddr, x, y, s ? 15 : 0); }; Object.defineProperty(grid, 'size', { get: function() { return size; }, enumerable: true }); Object.defineProperty(grid, 'width', { get: function() { return size; }, enumerable: true }); Object.defineProperty(grid, 'height', { get: function() { return 64; }, enumerable: true }); } else { grid.led = function(x, y, s) { return client.send(setLedAddr, x, y, s ? 1 : 0); }; Object.defineProperty(grid, 'width', { get: function() { return width; }, enumerable: true }); Object.defineProperty(grid, 'height', { get: function() { return height; }, enumerable: true }); } Object.defineProperty(grid, 'rotation', { get: function() { return rotation; }, set: function(value) { return client.send('/sys/rotation', value); }, enumerable: true }); Object.defineProperty(grid, 'id', { get: function() { return id; }, enumerable: true }); Object.defineProperty(grid, 'host', { get: function() { return host; }, enumerable: true }); Object.defineProperty(grid, 'port', { get: function() { return port; }, enumerable: true }); Object.defineProperty(grid, 'prefix', { get: function() { return prefix; }, set: function(value) { return client.send('/sys/prefix', value); }, enumerable: true }); Object.defineProperty(grid, 'ready', { get: function() { return ready; }, enumerable: true }); Object.defineProperty(grid, 'osc', { get: function() { return client; }, enumerable: true }); Object.defineProperty(grid, 'type', { get: function() { return type; }, enumerable: true }); Object.defineProperty(grid, 'isArc', { get: function() { return isArc; }, enumerable: true }); return grid; }; }).call(this);