diff --git a/viz/index.html b/viz/index.html
index e08f7cc..5ade59d 100644
--- a/viz/index.html
+++ b/viz/index.html
@@ -6627,6 +6627,27 @@
post.connect(glitch); glitch.connect(out); post.connect(delSend); post.connect(revSend);
post.connect(echoIn); // the mix onto the Earth Echo tape
+ // ---- Juno-106-style BBD chorus — two short delays, each warbled by its own
+ // slow LFO and panned wide. Always gently on, so the dry oscillators sound
+ // warm and stereo. The single best-value vintage borrow: universally widens
+ // the mix and can't sound bad. World-modulatable via chorusWet if wanted. ----
+ const chorusWet = ctx.createGain(); chorusWet.gain.value = 0.3;
+ const chIn = ctx.createGain(); chIn.gain.value = 1;
+ const chD1 = ctx.createDelay(0.05); chD1.delayTime.value = 0.017;
+ const chD2 = ctx.createDelay(0.05); chD2.delayTime.value = 0.023;
+ const chLfo1 = ctx.createOscillator(); chLfo1.frequency.value = 0.62;
+ const chLfo2 = ctx.createOscillator(); chLfo2.frequency.value = 0.47;
+ const chDep1 = ctx.createGain(); chDep1.gain.value = 0.0038; // ±3.8 ms warble
+ const chDep2 = ctx.createGain(); chDep2.gain.value = 0.0044;
+ const chPanL = ctx.createStereoPanner(); chPanL.pan.value = -0.75;
+ const chPanR = ctx.createStereoPanner(); chPanR.pan.value = 0.75;
+ chLfo1.connect(chDep1); chDep1.connect(chD1.delayTime);
+ chLfo2.connect(chDep2); chDep2.connect(chD2.delayTime);
+ chIn.connect(chD1); chD1.connect(chPanL); chPanL.connect(chorusWet);
+ chIn.connect(chD2); chD2.connect(chPanR); chPanR.connect(chorusWet);
+ chorusWet.connect(out); post.connect(chIn);
+ chLfo1.start(); chLfo2.start();
+
lfo = ctx.createOscillator(); lfo.frequency.value = 0.2;
const lfoAmt = ctx.createGain(); lfoAmt.gain.value = 260; lfo.connect(lfoAmt);
@@ -6681,7 +6702,7 @@
lfo.start();
return { out, preSat, glitch, revSend, fb, satDry, satWet, leadOsc, leadFilt, leadAmp,
bassOsc, bassAmp, padOscs, padFilt, padAmp, droneOscs, droneAmp,
- echoDelay, echoFilt, echoFb, echoWet, echoFlutAmt, hissGain };
+ echoDelay, echoFilt, echoFb, echoWet, echoFlutAmt, hissGain, chorusWet };
}
function hit(node, peak, dec) { // pluck envelope