packages feed

csound-expression-typed-0.1.0.0: data/opcodes/audaciouseq.udo

/* 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