monode
Version:
Toolkit for the monome and arc osc controllers
237 lines (231 loc) • 6.29 kB
JavaScript
(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);