(
~firegen = {
        var trigs, durscale, resfreq;
        var noise, hissing, crackles, lapping;
        // A common noise source
        noise = WhiteNoise.ar;
        // Hissing
        hissing = HPF.ar(noise, 1000) * LFNoise2.kr(1).squared.squared;
        // Crackle
        trigs = Dust.kr(1);
        durscale = TRand.kr(1, 1.5, trigs); // vary duration between default 20ms and 30ms
        resfreq = TExpRand.kr(100, 1000, trigs); // different resonant frequency for each one
        crackles = noise * EnvGen.ar(Env.perc(0, 0.02, curve: 0), trigs, timeScale: durscale);
        crackles = crackles + BPF.ar(crackles, resfreq, 20);
        // Flame
        lapping = LeakDC.ar(LeakDC.ar(BPF.ar(noise, 30, 0.2) * 50).clip2(0.9)) * 0.5;
        // Combine them:
        ([crackles, hissing, lapping] * [0.1, 0.3, 0.6]).sum * 3
};
~firegen.play
)

(
{
        BPF.ar(~firegen,  600, 1/0.2) +
        BPF.ar(~firegen, 1200, 1/0.6) +
        BPF.ar(~firegen, 2600, 1/0.4) +
        HPF.ar(~firegen, 1000)
}.play
)