/* audaciouseq - multi-band equalizer A Csound UDO implementation of Audacious' EQ: https://github.com/audacious-media-player/audacious/blob/master/src/libaudcore/equalizer.cc */ /* Q value for band-pass filters 1.2247 = (3/2)^(1/2) * Gives 4 dB suppression at Fc*2 and Fc/2 */ #define Q # 1.2247449 # /* single-sample, 2nd order IIR filter */ opcode audacious_bp2, k, kik kin, ifC, kgain xin ;; Calc Coefficients ith = 2 * $M_PI * (ifC / sr) iC = (1 - tan(ith * $Q / 2)) / (1 + tan(ith * $Q / 2)) ia0 = (1 + iC) * cos(ith) ia1 = -iC ib0 = (1 - iC) / 2 ib1 = -1.005 kout init 0 kwq0 init 0 kwq1 init 0 kG = pow(10, kgain / 20) - 1 ;; Filter Code kyt = kin kw = kyt * ib0 + kwq0 * ia0 + kwq1 * ia1 kyt += (kw + kwq1 * ib1) * kG ;; Memory kwq1 = kwq0 kwq0 = kw xout kyt endop /* 10-band EQ Input: asig, kgain1, kgain2, ... Output: aout 10 kgain arguments maps to each band Bands are: 31.25, 52.6, 125, 500, 1000, 2000, 4000, 8000, 16000 */ opcode audaciouseq, a, akkkkkkkkkk ain, kgain1, kgain2, kgain3, kgain4, kgain5, kgain6, kgain7, kgain8, kgain9, kgain10 xin aout = 0 kndx = 0 while (kndx < ksmps) do ksamp audacious_bp2 ain[kndx], 31.25, kgain1 ksamp audacious_bp2 ksamp, 62.5, kgain2 ksamp audacious_bp2 ksamp, 125, kgain3 ksamp audacious_bp2 ksamp, 250, kgain4 ksamp audacious_bp2 ksamp, 500, kgain5 ksamp audacious_bp2 ksamp, 1000, kgain6 ksamp audacious_bp2 ksamp, 2000, kgain7 ksamp audacious_bp2 ksamp, 4000, kgain8 ksamp audacious_bp2 ksamp, 8000, kgain9 aout[kndx] audacious_bp2 ksamp, 16000, kgain10 kndx += 1 od xout aout endop