Skip to content
Snippets Groups Projects
Commit a99de685 authored by Micah Elizabeth Scott's avatar Micah Elizabeth Scott
Browse files

Particle system example with TouchOSC control

parent 5e60c3a5
No related branches found
No related tags found
No related merge requests found
#!/usr/bin/env node
// Particle system example with Node and opc.js, controllable via OSC.
// You can use this with TouchOSC, with the "Simple" touch layout.
// Note that we don't push values *to* TouchOSC yet, so the initial state
// of the controls may not match the state we keep here on the OSC server.
//
// Specify an LED layout file on the command line, or use the default (grid32x16z)
var osc = require('node-osc');
var oscServer = new osc.Server(8000, '0.0.0.0');
var OPC = new require('./opc');
var model = OPC.loadModel(process.argv[2] || '../layouts/grid32x16z.json');
var client = new OPC('localhost', 7890);
// State values; change over time
var stateAngle1 = 0;
var stateAngle2 = 0;
// Parameters, set via OSC
var hue = 0.3;
var hueShift = 0.8;
var saturation = 0.5;
var brightness = 0.5;
var falloff = 0.5;
var rate1 = 0.1;
var rate2 = 0.2;
oscServer.on('message', function (msg, rinfo) {
// Show the message, for debugging
console.log(msg);
// First page, color
if (msg[0] == '/1/fader1') hue = msg[1];
if (msg[0] == '/1/fader2') hueShift = msg[1];
if (msg[0] == '/1/fader3') saturation = msg[1];
if (msg[0] == '/1/fader4') falloff = msg[1];
if (msg[0] == '/1/fader5') brightness = msg[1];
// XY pad, oscillator rates
if (msg[0] == '/3/xy') {
rate1 = msg[1];
rate2 = msg[2];
}
});
function draw() {
var numParticles = 200;
var particles = [];
var trail = 100.0;
var scaledRate1 = (rate1 - 0.5) * 0.5;
var scaledRate2 = (rate2 - 0.5) * 0.5;
stateAngle1 += scaledRate1;
stateAngle2 += scaledRate2;
for (var i = 0; i < numParticles; i++) {
var s = i / numParticles;
// Local state angles for this particle
var lsa1 = stateAngle1 + scaledRate1 * trail * s;
var lsa2 = stateAngle2 + scaledRate2 * trail * s;
// Compute position, this gives us the shape of our effect.
var radius = 0.1 + 2.0 * s;
var x = radius * Math.cos(lsa1);
var y = radius * Math.sin(lsa2);
particles[i] = {
point: [x, 0, y],
intensity: brightness * (1 - s),
falloff: falloff * 175,
color: OPC.hsv( hue + s * 2.0 * (hueShift - 0.5), saturation, 0.5)
};
}
client.mapParticles(particles, model);
}
setInterval(draw, 10);
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment