2 /* (C) Guenter Geiger <geiger@epy.co.at> */
7 These filter coefficients computations are taken from
8 http://www.harmony-central.com/Computer/Programming/Audio-EQ-Cookbook.txt
10 written by Robert Bristow-Johnson
16 #include "../../pdbox.h"
17 #include "../src/m_pd.h"
21 #include "../src/m_pd.h"
23 #pragma warning( disable : 4244 )
24 #pragma warning( disable : 4305 )
30 /* ------------------- bandpass ----------------------------*/
32 static t_class
*bandpass_class
;
34 void bandpass_bang(t_rbjfilter
*x
)
37 t_float omega
= e_omega(x
->x_freq
,x
->x_rate
);
38 t_float alpha
= e_alpha(x
->x_bw
* 0.01,omega
);
42 t_float a0
= 1 + alpha
;
43 t_float a1
= -2.*cos(omega
);
44 t_float a2
= 1 - alpha
;
46 /* post("bang %f %f %f",x->x_freq, x->x_gain, x->x_bw); */
48 if (!check_stability(-a1
/a0
,-a2
/a0
,b0
/a0
,b1
/a0
,b2
/a0
)) {
49 post("bandpass: filter unstable -> resetting");
55 SETFLOAT(at
+1,-a2
/a0
);
60 outlet_list(x
->x_obj
.ob_outlet
,&s_list
,5,at
);
64 void bandpass_float(t_rbjfilter
*x
,t_floatarg f
)
71 static void *bandpass_new(t_floatarg f
,t_floatarg bw
)
73 t_rbjfilter
*x
= (t_rbjfilter
*)pd_new(bandpass_class
);
76 outlet_new(&x
->x_obj
,&s_float
);
77 /* floatinlet_new(&x->x_obj, &x->x_gain); */
78 floatinlet_new(&x
->x_obj
, &x
->x_bw
);
79 if (f
> 0.) x
->x_freq
= f
;
80 if (bw
> 0.) x
->x_bw
= bw
;
85 void bandpass_setup(void)
87 bandpass_class
= class_new(gensym("bandpass"), (t_newmethod
)bandpass_new
, 0,
88 sizeof(t_rbjfilter
), 0,A_DEFFLOAT
,A_DEFFLOAT
,0);
89 class_addbang(bandpass_class
,bandpass_bang
);
90 class_addfloat(bandpass_class
,bandpass_float
);