import traer.physics.*; import beads.*; AudioContext ac; ArrayList carrierFreqs; ArrayList modFreqRatios; ArrayList panners; Particle selectedParticle = null; boolean initialized = false; boolean frozen = false; int frameMousePressed =0; ParticleSystem ps = new ParticleSystem(); void setup() { background(0); ac = new AudioContext(); size(400,400); colorMode(HSB,100); background(0); smooth(); frameRate(30); strokeWeight(.5); stroke(100); carrierFreqs = new ArrayList(); modFreqRatios = new ArrayList(); panners = new ArrayList(); } void drawParticles() { for(int i=0; i= 1) { p2 = findNearestParticle(((x*1.0)/width)*100, ((y*1.0)/height)*100); } Particle p0 = ps.makeParticle(sz, ((x*1.0)/width)*100, ((y*1.0)/height)*100, 70); // adding repulsions to all other particles for(int i=0; i= 2) { // strength, dampening, rest length ps.makeSpring(p2, p0, .1, .1, 25); } } void createNoisemaker(float x, float y, float sz) { sz = max(3, min(sz,100)); Glide cf = new Glide(ac, 500); carrierFreqs.add(cf); // save a reference for later Glide mfr = new Glide(ac, 1); modFreqRatios.add(mfr); Function modFreq = new Function(cf, mfr) { public float calculate() { return x[0] * x[1]; } }; WavePlayer freqModulator = new WavePlayer(ac, modFreq, new SineBuffer().getDefault()); Function carrierMod = new Function(freqModulator, cf) { public float calculate() { return x[0] * 300.0 + x[1]; } }; WavePlayer wp = new WavePlayer(ac, carrierMod, new SineBuffer().getDefault()); Gain g = new Gain(ac, 1, map(sz,0,100,0,1)); // more massive particles are louder PanMonoToStereo pan = new PanMonoToStereo(ac, new Envelope(ac, 0.5)); // not working? panners.add(pan); g.addInput(wp); pan.addInput(g); ac.out.addInput(pan); if(! initialized) { ac.start(); // only start it once initialized = true; println("started"); } } void keyPressed() { if(key == 'f') { frozen = !frozen; } }