Newer
Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
#!/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);