(
{
    var sig, noise, crackle, flutter, gritty, dusty, wow, ring, dropout;

    // Buffer preload (mono)
    // ~buf = Buffer.readChannel(s, "/Users/lcoogan/snd/releases/desolation-mountain/mono.wav", channels:[0]);

    // Wow & flutter (slow and loopy like hand-cranked)
    wow = SinOsc.kr(0.1).range(0.99, 1.01);
    flutter = LFNoise1.kr(6).range(0.98, 1.02);

    // Modulated playback rate
    sig = PlayBuf.ar(1, ~buf, rate: wow * flutter, doneAction: 2);

    // Bandwidth-limited like a wax disc (c. 4kHz max)
    sig = HPF.ar(sig, 300);   // kill low-end rumble
    sig = LPF.ar(sig, 4000);  // simulate acoustic horn

    // Dropouts (emulate groove wear)
    dropout = LFNoise2.kr(0.8).range(0.5, 1.0);
    sig = sig * dropout;

    // Clicks / crackle (discrete dust pops)
    crackle = Dust2.ar(200) * Decay2.ar(Impulse.ar(20), 0.001, 0.02) * 0.2;

    // Background hiss / groove rumble
	noise = WhiteNoise.ar(0.01) + Crackle.ar(1.5, 0.02);

    // Mechanical ring (horn resonance / disc rumble)
    ring = Resonz.ar(sig, 900, 0.1) * 0.3;

    // Mix everything (all mono!)
    gritty = sig + ring + crackle + noise;

    // Subtle saturation
    gritty = (gritty * 2).tanh;

    // Reduce output + normalize
    gritty!2* 0.5;
}.play;
)
