class OrbitParticle { Oscillator wave; float energy; float x, y; float vx, vy; Particle orbit; float sz = 1; //float ampDelta = random(0.0025, 0.005); float ampDelta = 0.025; OrbitParticle() { x = random(0, width); y = random(0, height); vx = random(-1, 1); vy = random(-1, 1); orbit = particles[int(random(0, particleCount - 1))]; energy = random(0, maxEnergy); } void move() { if (random(10) > 9) { orbit = particles[int(random(0, particleCount - 1))]; } if (wave != null) { if (wave.amplitude() <= ampDelta) { wave.setAmp(0.0); out.removeSignal(wave); wave = null; } else { wave.setAmp(wave.amplitude() - ampDelta); } } energy += 2; if ((energy >= maxEnergy) && (tick % quantise == 0)) { pulse(); } //vx = random((-energy / 50), energy / 50); //vy = random((-energy / 50), energy / 50); //if (random(10) > 9) { // vx = random(-1, 1); // vy = random(-1, 1); //} vx += 0.1 * random(0.2) * (orbit.x - x); vy += 0.1 * random(0.2) * (orbit.y - y); float energyLevel = energy / maxEnergy; vx = max(min(vx, energyLevel), -energyLevel); vy = max(min(vy, energyLevel), -energyLevel); if ((x < 0) || (x > width)) vx *= -1; if ((y < 0) || (y > height)) vy *= -1; x += vx; y += vy; fill(0, 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++) { stroke(0, 255 - 255 * (i / (circleCount + 0.0))); ellipse(x, y, sz * pow(2, i), sz * pow(2, i)); } } }