xxxxxxxxxx
66
class Attractor {
constructor(x, y, m, channelName, outputNode) {
this.sampleRate = Math.pow(2, 9);
this.analyzer = new Tone.Waveform(this.sampleRate);
this.pos = createVector(x, y);
this.mass = m;
this.r = sqrt(this.mass) * 2;
const pan = channelName === "AttractorRight" ? 1 : -1;
this.channel = new Tone.Channel(0, 0).receive(channelName);
const panner = new Tone.Panner(pan);
this.channel.fan(this.analyzer, panner);
panner.connect(outputNode)
createSpan('Strength');
this.gSlider = createSlider(0,100,10);
}
attract(mover) {
let force = p5.Vector.sub(this.pos, mover.pos);
let distanceSq = constrain(force.magSq(), 100, 1000);
let G = this.gSlider.value() / 10;
let strength = G * (this.mass * mover.mass) / distanceSq;
force.setMag(strength);
mover.applyForce(force);
}
show() {
push();
translate(this.pos.x, this.pos.y);
// for (let r = 200; r > 0; r -= 15) {
// noStroke()
// colorMode(HSL)
// fill(0, 0, 0, 0.01);
// ellipse(0, 0, r, r);
// }
strokeWeight(1);
stroke(0);
noFill();
ellipse(0, 0, 25);
beginShape();
let waveform = this.analyzer.getValue();
let theta = 0;
for (let i = 0; i < this.sampleRate; i++) {
let val = map(waveform[i], -1, 1, -500, 500);
vertex((cos(theta) * val), (sin(theta) * val));
theta += 360 / this.sampleRate;
}
endShape();
pop();
}
}