~buf = Buffer.read(s, "/Users/lcoogan/snd/releases/desolation-mountain/02 - crawling and quietly seething was the figure of the trees.wav"); ( { var rate, sig, wow, flutter, noise, dropout, echo, worn, warm, ghost, deckNoise; // Load mono audio buffer first: (run once before) // ~buf = Buffer.readChannel(s, "/Users/lcoogan/snd/releases/desolation-mountain/mono.wav", channels:[0]); // --- Wow & flutter --- wow = SinOsc.kr(0.3).range(0.99, 1.01); // slow cyclical wobblee flutter = LFNoise1.kr(1).range(0.995, 1.005); // fast jitter rate = wow * flutter; // --- Play the buffer with pitch mod --- sig = PlayBuf.ar(1, ~buf, rate, doneAction: 2); // --- Simulate dropouts --- dropout = LFNoise2.kr(0.4).range(0.6, 1.0); sig = sig * dropout; // --- Add tape hiss --- noise = BrownNoise.ar(0.003); // --- Print-through / ghosting (delayed echo of self) --- ghost = DelayC.ar(sig, 0.6, 0.6) * 0.3; // --- Slight combing / smearing (wow bleed) --- echo = CombL.ar(sig, 0.2, 0.03, 2) * 0.2; // --- Tape saturation --- warm = ((sig + ghost + echo) * 2).tanh; // --- Worn tape: Lowpass and bitcrush --- worn = LPF.ar(warm, 4000); // worn = Decimator.ar(worn, rate: 12000, bits: 10); // --- Add subtle deck hum / mechanical loop? --- deckNoise = SinOsc.ar(50, 0, 0.001); // tape motor hum // --- Stereo + Final mix --- Splay.ar(worn + noise + deckNoise, spread: 0.5) * 0.4; }.play; )