Re: PV_BinPeakEQ/miSC_getFFTbufSizes error

[email protected] Fri, 28 May 2021 15:25:45 +0200
Newsgroups gmane.comp.audio.supercollider.user
Message-ID <[email protected]>

> Am 28.05.2021 um 08:41 schrieb [email protected]:
> 
> I recently updated SuperCollider and I'm finding that the code I was
> using for PV_BinPeakEQ uGen no longer works correctly.

PV_BinPeakEQ is no part of miSCellaneous_lib (in contrast to PV_BinRange and PV_BinGap which are similarily based on PV_BrickWall). I suggested this class in a post at some point.

Maybe I’ve updated it meanwhile, my code is from August 11th 2020 and it works

////////


PV_BinPeakEQ : PV_ChainUGen {

	*new { |buffer, loBin, hiBin, db|
		^this.multiNew(\control, buffer, loBin, hiBin, db)
	}

	*new1 { |rate, buffer, loBin, hiBin, db|
		var bufSize, wipe_1, wipe_2, chain_band, chain_lo, chain_hi, chain_mul, mul, size;

		bufSize = buffer.fftSize;
		size = buffer.asArray.size;

		chain_band = size.collect { LocalBuf(bufSize) };
		chain_lo = size.collect { LocalBuf(bufSize) };
		chain_hi = size.collect { LocalBuf(bufSize) };
		mul = Impulse.ar(SampleRate.ir * 2 / bufSize) * db.dbamp;
		chain_mul = FFT(LocalBuf(bufSize), mul);

		chain_band = PV_Copy(buffer, chain_band);
		chain_lo = PV_Copy(buffer, chain_lo);
		chain_hi = PV_Copy(buffer, chain_hi);

		wipe_1 = loBin * 2 / bufSize;
		chain_band = PV_BrickWall(chain_band, wipe_1);
		chain_lo = PV_BrickWall(chain_lo, wipe_1 - 1);

		wipe_2 = hiBin * 2 / bufSize;
		chain_band = PV_BrickWall(chain_band, wipe_2 - 1);
		chain_hi = PV_BrickWall(chain_hi, wipe_2);

		chain_band = PV_MagMul(chain_band, chain_mul);
		^PV_Add(chain_band, PV_Add(chain_lo, chain_hi))[0]
	}
}

////////


(
SynthDef(\threeBandFFTEQ, { |out = 0, in, amp = 1, mix = 1,
band1 = #[200, 500], band2 = #[1200, 1700], band3 = #[3200, 5000],
dbs = #[0, 0, 0]|

var inSig = In.ar(in, 1), sig;
var loBin1, hiBin1, loBin2, hiBin2, loBin3, hiBin3, binRange;
var bufSize = 1024;
var chain = FFT(LocalBuf(bufSize), inSig);

binRange = s.sampleRate / bufSize;
loBin1 = (band1[0] / binRange);
hiBin1 = (band1[1] / binRange);
loBin2 = (band2[0] / binRange);
hiBin2 = (band2[1] / binRange);
loBin3 = (band3[0] / binRange);
hiBin3 = (band3[1] / binRange);

chain = PV_BinPeakEQ(chain, loBin1, hiBin1, dbs[0]);
chain = PV_BinPeakEQ(chain, loBin2, hiBin2, dbs[1]);
chain = PV_BinPeakEQ(chain, loBin3, hiBin3, dbs[2]);

XOut.ar(out, mix, IFFT(chain) ! 2);
}).add;
)


a = Bus.audio(s, 1);
s.freqscope;

y = Synth(\threeBandFFTEQ, [in: a]);

x = { Out.ar(a, Saw.ar(100, 0.1)) }.play

y.set(\dbs, [0, -60, -20])

y.set(\band2, [300, 2000])


x.free;
y.free;


Cheers

Daniel

-----------------------------
http://daniel-mayer.at
-----------------------------