class Particle { Oscillator wave; float energy; float x, y; float vx, vy; float maxv = 1; float sz = 1; //float ampDelta = random(0.0025, 0.005); float ampDelta = 0.00125; Particle() { x = random(0, width); y = random(0, height); vx = random(-1, 1); vy = random(-1, 1); energy = random(0, maxEnergy); } void move() { if (wave != null) { if (wave.amplitude() <= ampDelta) { wave.setAmp(0.0); out.removeSignal(wave); wave = null; } else { wave.setAmp(wave.amplitude() - ampDelta); } } energy++; if ((energy >= maxEnergy) && (tick % quantise == 0)) { pulse(); } //vx = random((-energy / 50), energy / 50); //vy = random((-energy / 50), energy / 50); if (random(100) > 95) { vx = random(-1, 1); vy = random(-1, 1); } if ((x < 0) || (x > width)) vx *= -1; if ((y < 0) || (y > height)) vy *= -1; float energyLevel = energy / maxEnergy; x += min(vx * energyLevel, maxv); y += min(vy * energyLevel, maxv); fill(255, map(energy, 0, maxEnergy, 10, 200)); noStroke(); ellipse(x + random(-energyLevel, energyLevel) * 3, y + random(-energyLevel, energyLevel) * 3, sz, sz); } void pulse() { float energyDraw = random(maxEnergy * 0.5, energy); int freqIndex = int(map(x, 0, width, 0, freqs.length)); freqIndex = max(0, min(freqs.length - 1, freqIndex)); float frequency = freqs[freqIndex]; float maxAmp = 1.0 / (totalParticles + 0.0); energy -= energyDraw; if (wave != null) { wave.setFreq(frequency); wave.setAmp(maxAmp); } else { wave = new SineWave(frequency, maxAmp, 44100); wave.noPortamento(); out.addSignal(wave); } //fill(120, 204, 255); if (DRAW_COLUMNS) { fill(0); noStroke(); //ellipse(x, y, sz * 2, sz * 2); rect(freqIndex * (width / (freqs.length + 0.0)), 0, (width / (freqs.length + 0.0)), height); } noFill(); int circleCount = 16; for (int i = 1; i < circleCount; i++) { strokeWeight(2); stroke(255, 255 - 255 * (i / (circleCount + 0.0))); float diam = sz * pow(2, i) * random(1); ellipse(x, y, diam, diam); } } }