function draw(sketch = mutable sketch, p5 = mutable p5) {
updateFps();
sketch.getAudioContext().resume();
mutable fft.analyze();
updateMelScaledSamples();
updateLoudnessCorrection();
sketch.background(0);
sketch.strokeWeight(2);
mutable maxEnergy[sketch.frameCount % mutable maxEnergy.length] =
mutable data.reduce(
(max, sample) => Math.max(max, sample.correctedEnergy),
0
);
const maxCorrectedEnergy = Math.max(...mutable maxEnergy);
const avgCorrectedEnergy = mutable maxEnergy.reduce(
(a, c, i, arr) => a + c / arr.length,
0
);
const lowCorrectedEnergy = Math.min(maxCorrectedEnergy, avgCorrectedEnergy);
const highCorrectedEnergy = Math.max(maxCorrectedEnergy, avgCorrectedEnergy);
const midCorrectedEnergy = (lowCorrectedEnergy + highCorrectedEnergy) / 2;
const avgCorrectedEnergySqrt = Math.sqrt(avgCorrectedEnergy);
const c = sketch.height / 2;
for (let i = 0; i < mutable data.length; i++) {
const { correctedEnergy, startHz } = mutable data[i];
const x = sketch.map(i, 0, mutable data.length, 0, sketch.width);
const r = sketch.map(correctedEnergy, 0, lowCorrectedEnergy, 0, c);
if (r < 1) continue;
sketch.strokeWeight(
sketch.map(correctedEnergy, 0, avgCorrectedEnergy, 1, 3)
);
sketch.stroke(
sketch.map(startHz, 0, settings.maxFrequency, 0, 360),
100,
sketch.map(Math.sqrt(correctedEnergy), 0, avgCorrectedEnergySqrt, 33, 100)
);
sketch.line(x, c - r, x, c + r);
}
}