Update of /cvsroot/pure-data/externals/iemlib/src/iemlib1 In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv1233/iemlib/src/iemlib1
Modified Files: biquad_freq_resp.c db2v.c f2note.c forpp.c gate.c iemlib1.c makefile_win soundfile_info.c split.c v2db.c Added Files: FIR~.c filter~.c hml_shelf~.c iem_cot4~.c iem_delay~.c iem_pow4~.c iem_sqrt4~.c lp1_t~.c makefile_linux mov_avrg_kern~.c para_bp2~.c peakenv~.c prvu~.c pvu~.c rvu~.c sin_phase~.c vcf_filter~.c Log Message: changed sig* to *_tilde #if MSC_VER is obsolete replaced all float by t_float
--- NEW FILE: filter~.c --- /* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution.
iemlib1 written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2005 */
#include "m_pd.h" #include "iemlib.h" #include <math.h>
/* ---------- filter~ - slow dynamic filter-kernel 1. and 2. order ----------- */
typedef struct _filter_tilde { t_object x_obj; t_float wn1; t_float wn2; t_float a0; t_float a1; t_float a2; t_float b1; t_float b2; t_float sr; t_float cur_f; t_float cur_l; t_float cur_a; t_float cur_b; t_float delta_f; t_float delta_a; t_float delta_b; t_float end_f; t_float end_a; t_float end_b; t_float ticks_per_interpol_time; t_float rcp_ticks; t_float interpol_time; int ticks; int counter_f; int counter_a; int counter_b; int inv; int hp; int first_order; int event_mask; void (*calc)(); void *x_debug_outlet; t_atom x_at[5]; t_float x_msi; } t_filter_tilde;
t_class *filter_tilde_class;
static void filter_tilde_snafu(t_filter_tilde *x) {
}
static void filter_tilde_lp1(t_filter_tilde *x) { t_float al;
al = x->cur_a * x->cur_l; x->a0 = 1.0f/(1.0f + al); x->a1 = x->a0; x->b1 = (al - 1.0f)*x->a0; }
static void filter_tilde_lp2(t_filter_tilde *x) { t_float l, al, bl2, rcp;
l = x->cur_l; al = l*x->cur_a; bl2 = l*l*x->cur_b + 1.0f; rcp = 1.0f/(al + bl2); x->a0 = rcp; x->a1 = 2.0f*rcp; x->a2 = x->a0; x->b1 = rcp*2.0f*(bl2 - 2.0f); x->b2 = rcp*(al - bl2); }
static void filter_tilde_hp1(t_filter_tilde *x) { t_float al, rcp;
al = x->cur_a * x->cur_l; rcp = 1.0f/(1.0f + al); x->a0 = rcp*al; x->a1 = -x->a0; x->b1 = rcp*(al - 1.0f); }
static void filter_tilde_hp2(t_filter_tilde *x) { t_float l, al, bl2, rcp;
l = x->cur_l; bl2 = l*l*x->cur_b + 1.0f; al = l*x->cur_a; rcp = 1.0f/(al + bl2); x->a0 = rcp*(bl2 - 1.0f); x->a1 = -2.0f*x->a0; x->a2 = x->a0; x->b1 = rcp*2.0f*(bl2 - 2.0f); x->b2 = rcp*(al - bl2); }
static void filter_tilde_rp2(t_filter_tilde *x) { t_float l, al, l2, rcp;
l = x->cur_l; l2 = l*l + 1.0f; al = l*x->cur_a; rcp = 1.0f/(al + l2); x->a0 = rcp*l; x->a2 = -x->a0; x->b1 = rcp*2.0f*(l2 - 2.0f); x->b2 = rcp*(al - l2); }
static void filter_tilde_bp2(t_filter_tilde *x) { t_float l, al, l2, rcp;
l = x->cur_l; l2 = l*l + 1.0f; al = l*x->cur_a; rcp = 1.0f/(al + l2); x->a0 = rcp*al; x->a2 = -x->a0; x->b1 = rcp*2.0f*(l2 - 2.0f); x->b2 = rcp*(al - l2); }
static void filter_tilde_bs2(t_filter_tilde *x) { t_float l, al, l2, rcp;
l = x->cur_l; l2 = l*l + 1.0f; al = l*x->cur_a; rcp = 1.0f/(al + l2); x->a0 = rcp*l2; x->a1 = rcp*2.0f*(2.0f - l2); x->a2 = x->a0; x->b1 = -x->a1; x->b2 = rcp*(al - l2); }
static void filter_tilde_rpw2(t_filter_tilde *x) { t_float l, al, l2, rcp;
l = x->cur_l; l2 = l*l + 1.0f; al = l*x->cur_a/x->cur_f; rcp = 1.0f/(al + l2); x->a0 = rcp*l; x->a2 = -x->a0; x->b1 = rcp*2.0f*(l2 - 2.0f); x->b2 = rcp*(al - l2); }
static void filter_tilde_bpw2(t_filter_tilde *x) { t_float l, al, l2, rcp;
l = x->cur_l; l2 = l*l + 1.0f; al = l*x->cur_a/x->cur_f; rcp = 1.0f/(al + l2); x->a0 = rcp*al; x->a2 = -x->a0; x->b1 = rcp*2.0f*(l2 - 2.0f); x->b2 = rcp*(al - l2); }
static void filter_tilde_bsw2(t_filter_tilde *x) { t_float l, al, l2, rcp;
l = x->cur_l; l2 = l*l + 1.0f; al = l*x->cur_a/x->cur_f; rcp = 1.0f/(al + l2); x->a0 = rcp*l2; x->a1 = rcp*2.0f*(2.0f - l2); x->a2 = x->a0; x->b1 = -x->a1; x->b2 = rcp*(al - l2); }
static void filter_tilde_ap1(t_filter_tilde *x) { t_float al;
al = x->cur_a * x->cur_l; x->a0 = (1.0f - al)/(1.0f + al); x->b1 = -x->a0; }
static void filter_tilde_ap2(t_filter_tilde *x) { t_float l, al, bl2, rcp;
l = x->cur_l; bl2 = l*l*x->cur_b + 1.0f; al = l*x->cur_a; rcp = 1.0f/(al + bl2); x->a1 = rcp*2.0f*(2.0f - bl2); x->a0 = rcp*(bl2 - al); x->b1 = -x->a1; x->b2 = -x->a0; }
/*static void filter_tilde_bp2(t_filter_tilde *x) { t_float l, al, l2, rcp;
l = x->cur_l; l2 = l*l + 1.0; al = l*x->cur_a; rcp = 1.0f/(al + l2); x->a0 = rcp*al; x->a2 = -x->a0; x->b1 = rcp*2.0f*(2.0f - l2); x->b2 = rcp*(l2 - al); }*/
static void filter_tilde_dsp_tick(t_filter_tilde *x) { if(x->event_mask) { if(x->counter_f) { float l, si, co;
if(x->counter_f <= 1) { x->cur_f = x->end_f; x->counter_f = 0; x->event_mask &= 6;/*set event_mask_bit 0 = 0*/ } else { x->counter_f--; x->cur_f *= x->delta_f; } l = x->cur_f * x->sr; if(l < 1.0e-20f) x->cur_l = 1.0e20f; else if(l > 1.57079632f) x->cur_l = 0.0f; else { si = sin(l); co = cos(l); x->cur_l = co/si; } } if(x->counter_a) { if(x->counter_a <= 1) { x->cur_a = x->end_a; x->counter_a = 0; x->event_mask &= 5;/*set event_mask_bit 1 = 0*/ } else { x->counter_a--; x->cur_a *= x->delta_a; } } if(x->counter_b) { if(x->counter_b <= 1) { x->cur_b = x->end_b; x->counter_b = 0; x->event_mask &= 3;/*set event_mask_bit 2 = 0*/ } else { x->counter_b--; x->cur_b *= x->delta_b; } }
(*(x->calc))(x);
/* stability check */ if(x->first_order) { if(x->b1 <= -0.9999998f) x->b1 = -0.9999998f; else if(x->b1 >= 0.9999998f) x->b1 = 0.9999998f; } else { float discriminant = x->b1 * x->b1 + 4.0f * x->b2;
if(x->b1 <= -1.9999996f) x->b1 = -1.9999996f; else if(x->b1 >= 1.9999996f) x->b1 = 1.9999996f;
if(x->b2 <= -0.9999998f) x->b2 = -0.9999998f; else if(x->b2 >= 0.9999998f) x->b2 = 0.9999998f;
if(discriminant >= 0.0f) { if(0.9999998f - x->b1 - x->b2 < 0.0f) x->b2 = 0.9999998f - x->b1; if(0.9999998f + x->b1 - x->b2 < 0.0f) x->b2 = 0.9999998f + x->b1; } } } }
static t_int *filter_tilde_perform_2o(t_int *w) { t_float *in = (float *)(w[1]); t_float *out = (float *)(w[2]); t_filter_tilde *x = (t_filter_tilde *)(w[3]); int i, n = (t_int)(w[4]); t_float wn0, wn1=x->wn1, wn2=x->wn2; t_float a0=x->a0, a1=x->a1, a2=x->a2; t_float b1=x->b1, b2=x->b2;
filter_tilde_dsp_tick(x); for(i=0; i<n; i++) { wn0 = *in++ + b1*wn1 + b2*wn2; *out++ = a0*wn0 + a1*wn1 + a2*wn2; wn2 = wn1; wn1 = wn0; } /* NAN protect */ if(IEM_DENORMAL(wn2)) wn2 = 0.0f; if(IEM_DENORMAL(wn1)) wn1 = 0.0f;
x->wn1 = wn1; x->wn2 = wn2; return(w+5); } /* yn0 = *out; xn0 = *in; ************* yn0 = a0*xn0 + a1*xn1 + a2*xn2 + b1*yn1 + b2*yn2; yn2 = yn1; yn1 = yn0; xn2 = xn1; xn1 = xn0; ************************* y/x = (a0 + a1*z-1 + a2*z-2)/(1 - b1*z-1 - b2*z-2);*/
static t_int *filter_tilde_perf8_2o(t_int *w) { t_float *in = (float *)(w[1]); t_float *out = (float *)(w[2]); t_filter_tilde *x = (t_filter_tilde *)(w[3]); int i, n = (t_int)(w[4]); t_float wn[10]; t_float a0=x->a0, a1=x->a1, a2=x->a2; t_float b1=x->b1, b2=x->b2;
filter_tilde_dsp_tick(x); wn[0] = x->wn2; wn[1] = x->wn1; for(i=0; i<n; i+=8, in+=8, out+=8) { wn[2] = in[0] + b1*wn[1] + b2*wn[0]; out[0] = a0*wn[2] + a1*wn[1] + a2*wn[0]; wn[3] = in[1] + b1*wn[2] + b2*wn[1]; out[1] = a0*wn[3] + a1*wn[2] + a2*wn[1]; wn[4] = in[2] + b1*wn[3] + b2*wn[2]; out[2] = a0*wn[4] + a1*wn[3] + a2*wn[2]; wn[5] = in[3] + b1*wn[4] + b2*wn[3]; out[3] = a0*wn[5] + a1*wn[4] + a2*wn[3]; wn[6] = in[4] + b1*wn[5] + b2*wn[4]; out[4] = a0*wn[6] + a1*wn[5] + a2*wn[4]; wn[7] = in[5] + b1*wn[6] + b2*wn[5]; out[5] = a0*wn[7] + a1*wn[6] + a2*wn[5]; wn[8] = in[6] + b1*wn[7] + b2*wn[6]; out[6] = a0*wn[8] + a1*wn[7] + a2*wn[6]; wn[9] = in[7] + b1*wn[8] + b2*wn[7]; out[7] = a0*wn[9] + a1*wn[8] + a2*wn[7]; wn[0] = wn[8]; wn[1] = wn[9]; } /* NAN protect */ if(IEM_DENORMAL(wn[0])) wn[0] = 0.0f; if(IEM_DENORMAL(wn[1])) wn[1] = 0.0f;
x->wn1 = wn[1]; x->wn2 = wn[0]; return(w+5); }
static t_int *filter_tilde_perform_1o(t_int *w) { t_float *in = (float *)(w[1]); t_float *out = (float *)(w[2]); t_filter_tilde *x = (t_filter_tilde *)(w[3]); int i, n = (t_int)(w[4]); t_float wn0, wn1=x->wn1; t_float a0=x->a0, a1=x->a1; t_float b1=x->b1;
filter_tilde_dsp_tick(x); for(i=0; i<n; i++) { wn0 = *in++ + b1*wn1; *out++ = a0*wn0 + a1*wn1; wn1 = wn0; } /* NAN protect */ if(IEM_DENORMAL(wn1)) wn1 = 0.0f;
x->wn1 = wn1; return(w+5); }
static t_int *filter_tilde_perf8_1o(t_int *w) { t_float *in = (float *)(w[1]); t_float *out = (float *)(w[2]); t_filter_tilde *x = (t_filter_tilde *)(w[3]); int i, n = (t_int)(w[4]); t_float wn[9]; t_float a0=x->a0, a1=x->a1; t_float b1=x->b1;
filter_tilde_dsp_tick(x); wn[0] = x->wn1; for(i=0; i<n; i+=8, in+=8, out+=8) { wn[1] = in[0] + b1*wn[0]; out[0] = a0*wn[1] + a1*wn[0]; wn[2] = in[1] + b1*wn[1]; out[1] = a0*wn[2] + a1*wn[1]; wn[3] = in[2] + b1*wn[2]; out[2] = a0*wn[3] + a1*wn[2]; wn[4] = in[3] + b1*wn[3]; out[3] = a0*wn[4] + a1*wn[3]; wn[5] = in[4] + b1*wn[4]; out[4] = a0*wn[5] + a1*wn[4]; wn[6] = in[5] + b1*wn[5]; out[5] = a0*wn[6] + a1*wn[5]; wn[7] = in[6] + b1*wn[6]; out[6] = a0*wn[7] + a1*wn[6]; wn[8] = in[7] + b1*wn[7]; out[7] = a0*wn[8] + a1*wn[7]; wn[0] = wn[8]; } /* NAN protect */ if(IEM_DENORMAL(wn[0])) wn[0] = 0.0f;
x->wn1 = wn[0]; return(w+5); }
static void filter_tilde_ft4(t_filter_tilde *x, t_floatarg t) { int i = (int)((x->ticks_per_interpol_time)*t+0.49999f);
x->interpol_time = t; if(i <= 0) { x->ticks = 1; x->rcp_ticks = 1.0; } else { x->ticks = i; x->rcp_ticks = 1.0 / (t_float)i; } }
static void filter_tilde_ft3(t_filter_tilde *x, t_floatarg b) { if(b <= 0.0f) b = 0.000001f; if(x->hp) b = 1.0 / b; if(b != x->cur_b) { x->end_b = b; x->counter_b = x->ticks; x->delta_b = exp(log(b/x->cur_b)*x->rcp_ticks); x->event_mask |= 4;/*set event_mask_bit 2 = 1*/ } }
static void filter_tilde_ft2(t_filter_tilde *x, t_floatarg a) { if(a <= 0.0f) a = 0.000001f; if(x->inv) a = 1.0f / a; if(x->hp) a /= x->cur_b; if(a != x->cur_a) { x->end_a = a; x->counter_a = x->ticks; x->delta_a = exp(log(a/x->cur_a)*x->rcp_ticks); x->event_mask |= 2;/*set event_mask_bit 1 = 1*/ } }
static void filter_tilde_ft1(t_filter_tilde *x, t_floatarg f) { if(f <= 0.0f) f = 0.000001f; if(f != x->cur_f) { x->end_f = f; x->counter_f = x->ticks; x->delta_f = exp(log(f/x->cur_f)*x->rcp_ticks); x->event_mask |= 1;/*set event_mask_bit 0 = 1*/ } }
static void filter_tilde_print(t_filter_tilde *x) { // post("fb1 = %g, fb2 = %g, ff1 = %g, ff2 = %g, ff3 = %g", x->b1, x->b2, x->a0, x->a1, x->a2); x->x_at[0].a_w.w_float = x->b1; x->x_at[1].a_w.w_float = x->b2; x->x_at[2].a_w.w_float = x->a0; x->x_at[3].a_w.w_float = x->a1; x->x_at[4].a_w.w_float = x->a2; outlet_list(x->x_debug_outlet, &s_list, 5, x->x_at); }
static void filter_tilde_dsp(t_filter_tilde *x, t_signal **sp) { t_float si, co, f; int i, n=(int)sp[0]->s_n;
x->sr = 3.14159265358979323846f / (t_float)(sp[0]->s_sr); x->ticks_per_interpol_time = 0.001f * (t_float)(sp[0]->s_sr) / (t_float)n; i = (int)((x->ticks_per_interpol_time)*(x->interpol_time)+0.49999f); if(i <= 0) { x->ticks = 1; x->rcp_ticks = 1.0f; } else { x->ticks = i; x->rcp_ticks = 1.0f / (t_float)i; } f = x->cur_f * x->sr; if(f < 1.0e-20f) x->cur_l = 1.0e20f; else if(f > 1.57079632f) x->cur_l = 0.0f; else { si = sin(f); co = cos(f); x->cur_l = co/si; } if(x->first_order) { if(n&7) dsp_add(filter_tilde_perform_1o, 4, sp[0]->s_vec, sp[1]->s_vec, x, n); else dsp_add(filter_tilde_perf8_1o, 4, sp[0]->s_vec, sp[1]->s_vec, x, n); } else { if(n&7) dsp_add(filter_tilde_perform_2o, 4, sp[0]->s_vec, sp[1]->s_vec, x, n); else dsp_add(filter_tilde_perf8_2o, 4, sp[0]->s_vec, sp[1]->s_vec, x, n); } }
static void *filter_tilde_new(t_symbol *s, int argc, t_atom *argv) { t_filter_tilde *x = (t_filter_tilde *)pd_new(filter_tilde_class); int i; t_float si, co, f=0.0f, a=0.0f, b=0.0f, interpol=0.0f; t_symbol *filt_typ=gensym("");
inlet_new(&x->x_obj, &x->x_obj.ob_pd, &s_float, gensym("ft1")); inlet_new(&x->x_obj, &x->x_obj.ob_pd, &s_float, gensym("ft2")); inlet_new(&x->x_obj, &x->x_obj.ob_pd, &s_float, gensym("ft3")); inlet_new(&x->x_obj, &x->x_obj.ob_pd, &s_float, gensym("ft4")); outlet_new(&x->x_obj, &s_signal); x->x_debug_outlet = outlet_new(&x->x_obj, &s_list); x->x_msi = 0.0f;
x->x_at[0].a_type = A_FLOAT; x->x_at[1].a_type = A_FLOAT; x->x_at[2].a_type = A_FLOAT; x->x_at[3].a_type = A_FLOAT; x->x_at[4].a_type = A_FLOAT;
x->event_mask = 1; x->counter_f = 1; x->counter_a = 0; x->counter_b = 0; x->delta_f = 0.0f; x->delta_a = 0.0f; x->delta_b = 0.0f; x->interpol_time = 0.0f; x->wn1 = 0.0f; x->wn2 = 0.0f; x->a0 = 0.0f; x->a1 = 0.0f; x->a2 = 0.0f; x->b1 = 0.0f; x->b2 = 0.0f; x->sr = 3.14159265358979323846f / 44100.0f; x->calc = filter_tilde_snafu; x->first_order = 0; if((argc == 5)&&IS_A_FLOAT(argv,4)&&IS_A_FLOAT(argv,3)&&IS_A_FLOAT(argv,2)&&IS_A_FLOAT(argv,1)&&IS_A_SYMBOL(argv,0)) { filt_typ = atom_getsymbolarg(0, argc, argv); f = (t_float)atom_getfloatarg(1, argc, argv); a = (t_float)atom_getfloatarg(2, argc, argv); b = (t_float)atom_getfloatarg(3, argc, argv); interpol = (t_float)atom_getfloatarg(4, argc, argv); } x->cur_f = f; f *= x->sr; if(f < 1.0e-20f) x->cur_l = 1.0e20f; else if(f > 1.57079632f) x->cur_l = 0.0f; else { si = sin(f); co = cos(f); x->cur_l = co/si; } if(a <= 0.0f) a = 0.000001f; if(b <= 0.0f) b = 0.000001f; x->cur_b = b;
if(interpol <= 0.0f) interpol = 0.0f; x->interpol_time = interpol; x->ticks_per_interpol_time = 0.001f * 44100.0f / 64.0f; i = (int)((x->ticks_per_interpol_time)*(x->interpol_time)+0.49999f); if(i <= 0) { x->ticks = 1; x->rcp_ticks = 1.0f; } else { x->ticks = i; x->rcp_ticks = 1.0f / (t_float)i; }
x->calc = filter_tilde_snafu;
x->cur_a = 1.0f/a; /*a was Q*/ x->inv = 1; x->hp = 0;
if(filt_typ->s_name) { if(filt_typ == gensym("ap1")) { x->calc = filter_tilde_ap1; x->a1 = 1.0f; x->first_order = 1; } else if(filt_typ == gensym("ap2")) { x->calc = filter_tilde_ap2; x->a2 = 1.0f; } else if(filt_typ == gensym("ap1c")) { x->calc = filter_tilde_ap1; x->a1 = 1.0f; x->inv = 0; x->cur_a = a; /*a was damping*/ x->first_order = 1; } else if(filt_typ == gensym("ap2c")) { x->calc = filter_tilde_ap2; x->a2 = 1.0f; x->inv = 0; x->cur_a = a; /*a was damping*/ } else if(filt_typ == gensym("bpq2")) { x->calc = filter_tilde_bp2; } else if(filt_typ == gensym("rbpq2")) { x->calc = filter_tilde_rp2; } else if(filt_typ == gensym("bsq2")) { x->calc = filter_tilde_bs2; } else if(filt_typ == gensym("bpw2")) { x->calc = filter_tilde_bpw2; x->inv = 0; x->cur_a = a; /*a was bw*/ } else if(filt_typ == gensym("rbpw2")) { x->calc = filter_tilde_rpw2; x->inv = 0; x->cur_a = a; /*a was bw*/ } else if(filt_typ == gensym("bsw2")) { x->calc = filter_tilde_bsw2; x->inv = 0; x->cur_a = a; /*a was bw*/ } else if(filt_typ == gensym("hp1")) { x->calc = filter_tilde_hp1; x->first_order = 1; } else if(filt_typ == gensym("hp2")) { x->calc = filter_tilde_hp2; } else if(filt_typ == gensym("lp1")) { x->calc = filter_tilde_lp1; x->first_order = 1; } else if(filt_typ == gensym("lp2")) { x->calc = filter_tilde_lp2; } else if(filt_typ == gensym("hp1c")) { x->calc = filter_tilde_hp1; x->cur_a = 1.0f / a; x->first_order = 1; } else if(filt_typ == gensym("hp2c")) { x->calc = filter_tilde_hp2; x->inv = 0; x->cur_a = a / b; x->cur_b = 1.0f / b; x->hp = 1; } else if(filt_typ == gensym("lp1c")) { x->calc = filter_tilde_lp1; x->inv = 0; x->cur_a = a; /*a was damping*/ x->first_order = 1; } else if(filt_typ == gensym("lp2c")) { x->calc = filter_tilde_lp2; x->inv = 0; x->cur_a = a; /*a was damping*/ } else { post("filter~-Error: 1. initial-arguments: <sym> kind: \ lp1, lp2, hp1, hp2, \ lp1c, lp2c, hp1c, hp2c, \ ap1, ap2, ap1c, ap2c, \ bpq2, rbpq2, bsq2, \ bpw2, rbpw2, bsw2!"); } x->end_f = x->cur_f; x->end_a = x->cur_a; x->end_b = x->cur_b; } return (x); }
void filter_tilde_setup(void) { filter_tilde_class = class_new(gensym("filter~"), (t_newmethod)filter_tilde_new, 0, sizeof(t_filter_tilde), 0, A_GIMME, 0); CLASS_MAINSIGNALIN(filter_tilde_class, t_filter_tilde, x_msi); class_addmethod(filter_tilde_class, (t_method)filter_tilde_dsp, gensym("dsp"), 0); class_addmethod(filter_tilde_class, (t_method)filter_tilde_ft1, gensym("ft1"), A_FLOAT, 0); class_addmethod(filter_tilde_class, (t_method)filter_tilde_ft2, gensym("ft2"), A_FLOAT, 0); class_addmethod(filter_tilde_class, (t_method)filter_tilde_ft3, gensym("ft3"), A_FLOAT, 0); class_addmethod(filter_tilde_class, (t_method)filter_tilde_ft4, gensym("ft4"), A_FLOAT, 0); class_addmethod(filter_tilde_class, (t_method)filter_tilde_print, gensym("print"), 0); class_sethelpsymbol(filter_tilde_class, gensym("iemhelp/help-filter~")); }
--- NEW FILE: makefile_linux --- current: all
.SUFFIXES: .pd_linux
INCLUDE = -I. -I/usr/local/src/pd/src
LDFLAGS = -export-dynamic -shared LIB = -ldl -lm -lpthread
#select either the DBG and OPT compiler flags below:
CFLAGS = -DPD -DUNIX -W -Werror -Wno-unused \ -Wno-parentheses -Wno-switch -O6 -funroll-loops -fomit-frame-pointer -fno-strict-aliasing \ -DDL_OPEN
SYSTEM = $(shell uname -m)
# the sources
SRC = biquad_freq_resp.c \ db2v.c \ f2note.c \ filter~.c \ FIR~.c \ forpp.c \ gate.c \ hml_shelf~.c \ iem_cot4~.c \ iem_delay~.c \ iem_pow4~.c \ iem_sqrt4~.c \ lp1_t~.c \ mov_avrg_kern~.c \ para_bp2~.c \ peakenv~.c \ prvu~.c \ pvu~.c \ rvu~.c \ sin_phase~.c \ soundfile_info.c \ split.c \ v2db.c \ vcf_filter~.c \ iemlib2.c
TARGET = iemlib1.pd_linux
OBJ = $(SRC:.c=.o)
# # ------------------ targets ------------------------------------ #
clean: rm $(TARGET) rm *.o
all: $(OBJ) @echo :: $(OBJ) $(LD) $(LDFLAGS) -o $(TARGET) *.o $(LIB) strip --strip-unneeded $(TARGET)
$(OBJ) : %.o : %.c $(CC) $(CFLAGS) $(INCLUDE) -c -o $*.o $*.c
Index: soundfile_info.c =================================================================== RCS file: /cvsroot/pure-data/externals/iemlib/src/iemlib1/soundfile_info.c,v retrieving revision 1.4 retrieving revision 1.5 diff -C2 -d -r1.4 -r1.5 *** soundfile_info.c 11 Apr 2006 16:24:09 -0000 1.4 --- soundfile_info.c 8 Nov 2006 13:24:10 -0000 1.5 *************** *** 4,12 **** iemlib1 written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2005 */
- #ifdef _MSC_VER - #pragma warning( disable : 4244 ) - #pragma warning( disable : 4305 ) - #endif - #include "m_pd.h" #include "iemlib.h" --- 4,7 ---- *************** *** 163,167 **** goto soundfile_info_end; } ! SETFLOAT(x->x_atheader+SFI_HEADER_CHANNELS, (float)ss); ch = ss; header_size += 2; --- 158,162 ---- goto soundfile_info_end; } ! SETFLOAT(x->x_atheader+SFI_HEADER_CHANNELS, (t_float)ss); ch = ss; header_size += 2; *************** *** 174,178 **** goto soundfile_info_end; } ! SETFLOAT(x->x_atheader+SFI_HEADER_SAMPLERATE, (float)ll); sr = ll; header_size += 4; --- 169,173 ---- goto soundfile_info_end; } ! SETFLOAT(x->x_atheader+SFI_HEADER_SAMPLERATE, (t_float)ll); sr = ll; header_size += 4; *************** *** 189,193 **** goto soundfile_info_end; } ! SETFLOAT(x->x_atheader+SFI_HEADER_BYTES_PER_SAMPLE, (float)(ss/ch)); bps = ss; header_size += 2; --- 184,188 ---- goto soundfile_info_end; } ! SETFLOAT(x->x_atheader+SFI_HEADER_BYTES_PER_SAMPLE, (t_float)(ss/ch)); bps = ss; header_size += 2; *************** *** 211,219 **** cvec += 8;
! SETFLOAT(x->x_atheader+SFI_HEADER_HEADERBYTES, (float)header_size);
filesize -= header_size; filesize /= bps; ! SETFLOAT(x->x_atheader+SFI_HEADER_MULTICHANNEL_FILE_LENGTH, (float)filesize); SETSYMBOL(x->x_atheader+SFI_HEADER_ENDINESS, gensym("l")); SETSYMBOL(x->x_atheader+SFI_HEADER_FILENAME, gensym(completefilename)); --- 206,214 ---- cvec += 8;
! SETFLOAT(x->x_atheader+SFI_HEADER_HEADERBYTES, (t_float)header_size);
filesize -= header_size; filesize /= bps; ! SETFLOAT(x->x_atheader+SFI_HEADER_MULTICHANNEL_FILE_LENGTH, (t_float)filesize); SETSYMBOL(x->x_atheader+SFI_HEADER_ENDINESS, gensym("l")); SETSYMBOL(x->x_atheader+SFI_HEADER_FILENAME, gensym(completefilename));
--- NEW FILE: iem_pow4~.c --- /* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution.
iemlib1 written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2005 */
#include "m_pd.h" #include "iemlib.h" #include <math.h>
/* ------------------------ iem_pow4~ ----------------------------- */
static t_class *iem_pow4_tilde_class;
typedef struct _iem_pow4_tilde { t_object x_obj; t_float x_exp; t_float x_msi; } t_iem_pow4_tilde;
static void iem_pow4_tilde_ft1(t_iem_pow4_tilde *x, t_floatarg f) { x->x_exp = f; }
static t_int *iem_pow4_tilde_perform(t_int *w) { t_float *in = (t_float *)(w[1]); t_float *out = (t_float *)(w[2]); t_iem_pow4_tilde *x = (t_iem_pow4_tilde *)(w[3]); t_float y=x->x_exp; t_float f, g; int n = (int)(w[4])/4;
while (n--) { f = *in; if(f < 0.01f) f = 0.01f; else if(f > 1000.0f) f = 1000.0f; g = log(f); f = exp(g*y); *out++ = f; *out++ = f; *out++ = f; *out++ = f; in += 4; } return (w+5); }
static void iem_pow4_tilde_dsp(t_iem_pow4_tilde *x, t_signal **sp) { dsp_add(iem_pow4_tilde_perform, 4, sp[0]->s_vec, sp[1]->s_vec, x, sp[0]->s_n); }
static void *iem_pow4_tilde_new(t_floatarg f) { t_iem_pow4_tilde *x = (t_iem_pow4_tilde *)pd_new(iem_pow4_tilde_class);
x->x_exp = f; inlet_new(&x->x_obj, &x->x_obj.ob_pd, &s_float, gensym("ft1")); outlet_new(&x->x_obj, gensym("signal")); x->x_msi = 0; return (x); }
void iem_pow4_tilde_setup(void) { iem_pow4_tilde_class = class_new(gensym("iem_pow4~"), (t_newmethod)iem_pow4_tilde_new, 0, sizeof(t_iem_pow4_tilde), 0, A_DEFFLOAT, 0); class_addcreator((t_newmethod)iem_pow4_tilde_new, gensym("icot~"), 0); CLASS_MAINSIGNALIN(iem_pow4_tilde_class, t_iem_pow4_tilde, x_msi); class_addmethod(iem_pow4_tilde_class, (t_method)iem_pow4_tilde_dsp, gensym("dsp"), 0); class_addmethod(iem_pow4_tilde_class, (t_method)iem_pow4_tilde_ft1, gensym("ft1"), A_FLOAT, 0); class_sethelpsymbol(iem_pow4_tilde_class, gensym("iemhelp/help-iem_pow4~")); }
Index: makefile_win =================================================================== RCS file: /cvsroot/pure-data/externals/iemlib/src/iemlib1/makefile_win,v retrieving revision 1.5 retrieving revision 1.6 diff -C2 -d -r1.5 -r1.6 *** makefile_win 31 Oct 2006 14:17:16 -0000 1.5 --- makefile_win 8 Nov 2006 13:24:09 -0000 1.6 *************** *** 19,43 **** db2v.c \ f2note.c \ forpp.c \ gate.c \ ! sigfilter.c \ ! sigFIR.c \ ! sighml_shelf.c \ ! sigiem_cot4.c \ ! sigiem_delay.c \ ! sigiem_sqrt4.c \ ! sigiem_pow4.c \ ! siglp1_t.c \ ! sigmov_avrg_kern.c \ ! sigpara_bp2.c \ ! sigpeakenv.c \ ! sigprvu.c \ ! sigpvu.c \ ! sigrvu.c \ ! sigsin_phase.c \ ! sigvcf_filter.c \ soundfile_info.c \ split.c \ v2db.c \ iemlib1.c
--- 19,43 ---- db2v.c \ f2note.c \ + filter~.c \ + FIR~.c \ forpp.c \ gate.c \ ! hml_shelf~.c \ ! iem_cot4~.c \ ! iem_delay~.c \ ! iem_pow4~.c \ ! iem_sqrt4~.c \ ! lp1_t~.c \ ! mov_avrg_kern~.c \ ! para_bp2~.c \ ! peakenv~.c \ ! prvu~.c \ ! pvu~.c \ ! rvu~.c \ ! sin_phase~.c \ soundfile_info.c \ split.c \ v2db.c \ + vcf_filter~.c \ iemlib1.c
--- NEW FILE: prvu~.c --- /* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution.
iemlib1 written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2005 */
#include "m_pd.h" #include "iemlib.h" #include <math.h>
/* ---------------- prvu~ - simple peak&rms-vu-meter. ----------------- */
typedef struct _prvu_tilde { t_object x_obj; t_atom x_at[3]; void *x_clock_metro; t_float x_metro_time; void *x_clock_hold; t_float x_hold_time; t_float x_cur_peak; t_float x_old_peak; t_float x_hold_peak; int x_hold; t_float x_sum_rms; t_float x_old_rms; t_float x_rcp; t_float x_sr; t_float x_threshold_over; int x_overflow_counter; t_float x_release_time; t_float x_c1; int x_started; t_float x_msi; } t_prvu_tilde;
t_class *prvu_tilde_class; static void prvu_tilde_tick_metro(t_prvu_tilde *x); static void prvu_tilde_tick_hold(t_prvu_tilde *x);
static void prvu_tilde_reset(t_prvu_tilde *x) { x->x_at[0].a_w.w_float = -99.9f; x->x_at[1].a_w.w_float = -99.9f; x->x_at[2].a_w.w_float = 0.0f; outlet_list(x->x_obj.ob_outlet, &s_list, 3, x->x_at); x->x_overflow_counter = 0; x->x_cur_peak = 0.0f; x->x_old_peak = 0.0f; x->x_hold_peak = 0.0f; x->x_sum_rms = 0.0f; x->x_old_rms = 0.0f; x->x_hold = 0; clock_unset(x->x_clock_hold); clock_delay(x->x_clock_metro, x->x_metro_time); }
static void prvu_tilde_stop(t_prvu_tilde *x) { clock_unset(x->x_clock_metro); x->x_started = 0; }
static void prvu_tilde_start(t_prvu_tilde *x) { clock_delay(x->x_clock_metro, x->x_metro_time); x->x_started = 1; }
static void prvu_tilde_float(t_prvu_tilde *x, t_floatarg f) { if(f == 0.0) { clock_unset(x->x_clock_metro); x->x_started = 0; } else { clock_delay(x->x_clock_metro, x->x_metro_time); x->x_started = 1; } }
static void prvu_tilde_t_release(t_prvu_tilde *x, t_floatarg release_time) { if(release_time <= 5.0f) release_time = 5.0f; x->x_release_time = release_time; x->x_c1 = exp(-2.0f*x->x_metro_time/x->x_release_time); }
static void prvu_tilde_t_metro(t_prvu_tilde *x, t_floatarg metro_time) { if(metro_time <= 5.0f) metro_time = 5.0f; x->x_metro_time = metro_time; x->x_c1 = exp(-2.0f*x->x_metro_time/x->x_release_time); x->x_rcp = 1.0f/(x->x_sr*(t_float)x->x_metro_time); }
static void prvu_tilde_t_hold(t_prvu_tilde *x, t_floatarg hold_time) { if(hold_time <= 5.0f) hold_time = 5.0f; x->x_hold_time = hold_time; }
static void prvu_tilde_threshold(t_prvu_tilde *x, t_floatarg thresh) { x->x_threshold_over = thresh; }
static t_int *prvu_tilde_perform(t_int *w) { t_float *in = (t_float *)(w[1]); t_prvu_tilde *x = (t_prvu_tilde *)(w[2]); int n = (int)(w[3]); t_float peak = x->x_cur_peak, pow, sum=x->x_sum_rms; int i;
if(x->x_started) { for(i=0; i<n; i++) { pow = in[i]*in[i]; if(pow > peak) peak = pow; sum += pow; } x->x_cur_peak = peak; x->x_sum_rms = sum; } return(w+4); }
static void prvu_tilde_dsp(t_prvu_tilde *x, t_signal **sp) { x->x_sr = 0.001*(t_float)sp[0]->s_sr; x->x_rcp = 1.0f/(x->x_sr*x->x_metro_time); dsp_add(prvu_tilde_perform, 3, sp[0]->s_vec, x, sp[0]->s_n); clock_delay(x->x_clock_metro, x->x_metro_time); }
static void prvu_tilde_tick_hold(t_prvu_tilde *x) { x->x_hold = 0; x->x_hold_peak = x->x_old_peak; }
static void prvu_tilde_tick_metro(t_prvu_tilde *x) { t_float dbr, dbp, cur_rms, c1=x->x_c1;
x->x_old_peak *= c1; /* NAN protect */ if(IEM_DENORMAL(x->x_old_peak)) x->x_old_peak = 0.0f;
if(x->x_cur_peak > x->x_old_peak) x->x_old_peak = x->x_cur_peak; if(x->x_old_peak > x->x_hold_peak) { x->x_hold = 1; x->x_hold_peak = x->x_old_peak; clock_delay(x->x_clock_hold, x->x_hold_time); } if(!x->x_hold) x->x_hold_peak = x->x_old_peak; if(x->x_hold_peak <= 0.0000000001f) dbp = -99.9f; else if(x->x_hold_peak > 1000000.0f) { dbp = 60.0f; x->x_hold_peak = 1000000.0f; x->x_old_peak = 1000000.0f; } else dbp = 4.3429448195f*log(x->x_hold_peak); x->x_cur_peak = 0.0f; if(dbp >= x->x_threshold_over) x->x_overflow_counter++; x->x_at[1].a_w.w_float = dbp; x->x_at[2].a_w.w_float = (t_float)x->x_overflow_counter;
cur_rms = (1.0f - c1)*x->x_sum_rms*x->x_rcp + c1*x->x_old_rms; /* NAN protect */ if(IEM_DENORMAL(cur_rms)) cur_rms = 0.0f;
if(cur_rms <= 0.0000000001f) dbr = -99.9f; else if(cur_rms > 1000000.0f) { dbr = 60.0f; x->x_old_rms = 1000000.0f; } else dbr = 4.3429448195f*log(cur_rms); x->x_sum_rms = 0.0f; x->x_old_rms = cur_rms; x->x_at[0].a_w.w_float = dbr; outlet_list(x->x_obj.ob_outlet, &s_list, 3, x->x_at); clock_delay(x->x_clock_metro, x->x_metro_time); }
static void prvu_tilde_ff(t_prvu_tilde *x) { clock_free(x->x_clock_metro); clock_free(x->x_clock_hold); }
static void *prvu_tilde_new(t_floatarg metro_time, t_floatarg hold_time, t_floatarg release_time, t_floatarg threshold) { t_prvu_tilde *x; t_float t; int i;
x = (t_prvu_tilde *)pd_new(prvu_tilde_class); if(metro_time <= 0.0f) metro_time = 300.0f; if(metro_time <= 5.0f) metro_time = 5.0f; if(release_time <= 0.0f) release_time = 300.0f; if(release_time <= 5.0f) release_time = 5.0f; if(hold_time <= 0.0f) hold_time = 1000.0f; if(hold_time <= 5.0f) hold_time = 5.0f; if(threshold == 0.0f) threshold = -0.01f; x->x_metro_time = metro_time; x->x_release_time = release_time; x->x_hold_time = hold_time; x->x_threshold_over = threshold; x->x_c1 = exp(-2.0f*x->x_metro_time/x->x_release_time); x->x_cur_peak = 0.0f; x->x_old_peak = 0.0f; x->x_hold_peak = 0.0f; x->x_hold = 0; x->x_sum_rms = 0.0f; x->x_old_rms = 0.0f; x->x_sr = 44.1f; x->x_rcp = 1.0f/(x->x_sr*x->x_metro_time); x->x_overflow_counter = 0; x->x_clock_metro = clock_new(x, (t_method)prvu_tilde_tick_metro); x->x_clock_hold = clock_new(x, (t_method)prvu_tilde_tick_hold); x->x_started = 1; outlet_new(&x->x_obj, &s_list); x->x_at[0].a_type = A_FLOAT; x->x_at[1].a_type = A_FLOAT; x->x_at[2].a_type = A_FLOAT; x->x_msi = 0.0f; return(x); }
void prvu_tilde_setup(void) { prvu_tilde_class = class_new(gensym("prvu~"), (t_newmethod)prvu_tilde_new, (t_method)prvu_tilde_ff, sizeof(t_prvu_tilde), 0, A_DEFFLOAT, A_DEFFLOAT, A_DEFFLOAT, A_DEFFLOAT, 0); CLASS_MAINSIGNALIN(prvu_tilde_class, t_prvu_tilde, x_msi); class_addmethod(prvu_tilde_class, (t_method)prvu_tilde_dsp, gensym("dsp"), 0); class_addfloat(prvu_tilde_class, prvu_tilde_float); class_addmethod(prvu_tilde_class, (t_method)prvu_tilde_reset, gensym("reset"), 0); class_addmethod(prvu_tilde_class, (t_method)prvu_tilde_start, gensym("start"), 0); class_addmethod(prvu_tilde_class, (t_method)prvu_tilde_stop, gensym("stop"), 0); class_addmethod(prvu_tilde_class, (t_method)prvu_tilde_t_release, gensym("t_release"), A_FLOAT, 0); class_addmethod(prvu_tilde_class, (t_method)prvu_tilde_t_metro, gensym("t_metro"), A_FLOAT, 0); class_addmethod(prvu_tilde_class, (t_method)prvu_tilde_t_hold, gensym("t_hold"), A_FLOAT, 0); class_addmethod(prvu_tilde_class, (t_method)prvu_tilde_threshold, gensym("threshold"), A_FLOAT, 0); class_sethelpsymbol(prvu_tilde_class, gensym("iemhelp/help-prvu~")); }
Index: db2v.c =================================================================== RCS file: /cvsroot/pure-data/externals/iemlib/src/iemlib1/db2v.c,v retrieving revision 1.4 retrieving revision 1.5 diff -C2 -d -r1.4 -r1.5 *** db2v.c 11 Apr 2006 16:24:09 -0000 1.4 --- db2v.c 8 Nov 2006 13:24:09 -0000 1.5 *************** *** 4,18 **** iemlib1 written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2005 */
- #ifdef _MSC_VER - #pragma warning( disable : 4244 ) - #pragma warning( disable : 4305 ) - #endif -
#include "m_pd.h" #include "iemlib.h" #include <math.h> - #include <stdio.h> - #include <string.h>
/* -------- db2v - a techn. dB to rms-value converter. --------- */ --- 4,11 ---- *************** *** 20,29 **** static t_class *db2v_class;
! float db2v(float f) { return (f <= -199.9 ? 0 : exp(0.11512925465 * f)); }
! static void db2v_float(t_object *x, t_float f) { outlet_float(x->ob_outlet, db2v(f)); --- 13,22 ---- static t_class *db2v_class;
! t_float db2v(t_float f) { return (f <= -199.9 ? 0 : exp(0.11512925465 * f)); }
! static void db2v_float(t_object *x, t_floatarg f) { outlet_float(x->ob_outlet, db2v(f));
--- NEW FILE: para_bp2~.c --- /* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution.
iemlib1 written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2005 */
#include "m_pd.h" #include "iemlib.h" #include <math.h>
/* ---------- para_bp2~ - parametric bandpass 2. order ----------- */
typedef struct _para_bp2_tilde { t_object x_obj; t_float wn1; t_float wn2; t_float a0; t_float a1; t_float a2; t_float b1; t_float b2; t_float sr; t_float cur_f; t_float cur_l; t_float cur_a; t_float cur_g; t_float delta_f; t_float delta_a; t_float delta_g; t_float end_f; t_float end_a; t_float end_g; t_float ticks_per_interpol_time; t_float rcp_ticks; t_float interpol_time; int ticks; int counter_f; int counter_a; int counter_g; int event_mask; void *x_debug_outlet; t_atom x_at[5]; t_float x_msi; } t_para_bp2_tilde;
t_class *para_bp2_tilde_class;
static void para_bp2_tilde_calc(t_para_bp2_tilde *x) { t_float l, al, gal, l2, rcp;
l = x->cur_l; l2 = l*l + 1.0f; al = l*x->cur_a; gal = al*x->cur_g; rcp = 1.0f/(al + l2); x->a0 = rcp*(l2 + gal); x->a1 = rcp*2.0f*(2.0f - l2); x->a2 = rcp*(l2 - gal); x->b1 = -x->a1; x->b2 = rcp*(al - l2); }
static void para_bp2_tilde_dsp_tick(t_para_bp2_tilde *x) { if(x->event_mask) { t_float discriminant;
if(x->counter_f) { t_float l, si, co;
if(x->counter_f <= 1) { x->cur_f = x->end_f; x->counter_f = 0; x->event_mask &= 6;/*set event_mask_bit 0 = 0*/ } else { x->counter_f--; x->cur_f *= x->delta_f; } l = x->cur_f * x->sr; if(l < 1.0e-20f) x->cur_l = 1.0e20f; else if(l > 1.57079632f) x->cur_l = 0.0f; else { si = sin(l); co = cos(l); x->cur_l = co/si; } } if(x->counter_a) { if(x->counter_a <= 1) { x->cur_a = x->end_a; x->counter_a = 0; x->event_mask &= 5;/*set event_mask_bit 1 = 0*/ } else { x->counter_a--; x->cur_a *= x->delta_a; } } if(x->counter_g) { if(x->counter_g <= 1) { x->cur_g = x->end_g; x->counter_g = 0; x->event_mask &= 3;/*set event_mask_bit 2 = 0*/ } else { x->counter_g--; x->cur_g *= x->delta_g; } }
para_bp2_tilde_calc(x);
/* stability check */
discriminant = x->b1 * x->b1 + 4.0f * x->b2; if(x->b1 <= -1.9999996f) x->b1 = -1.9999996f; else if(x->b1 >= 1.9999996f) x->b1 = 1.9999996f;
if(x->b2 <= -0.9999998f) x->b2 = -0.9999998f; else if(x->b2 >= 0.9999998f) x->b2 = 0.9999998f;
if(discriminant >= 0.0f) { if(0.9999998f - x->b1 - x->b2 < 0.0f) x->b2 = 0.9999998f - x->b1; if(0.9999998f + x->b1 - x->b2 < 0.0f) x->b2 = 0.9999998f + x->b1; } } }
static t_int *para_bp2_tilde_perform(t_int *w) { t_float *in = (t_float *)(w[1]); t_float *out = (t_float *)(w[2]); t_para_bp2_tilde *x = (t_para_bp2_tilde *)(w[3]); int i, n = (t_int)(w[4]); t_float wn0, wn1=x->wn1, wn2=x->wn2; t_float a0=x->a0, a1=x->a1, a2=x->a2; t_float b1=x->b1, b2=x->b2;
para_bp2_tilde_dsp_tick(x); for(i=0; i<n; i++) { wn0 = *in++ + b1*wn1 + b2*wn2; *out++ = a0*wn0 + a1*wn1 + a2*wn2; wn2 = wn1; wn1 = wn0; } /* NAN protect */ if(IEM_DENORMAL(wn2)) wn2 = 0.0f; if(IEM_DENORMAL(wn1)) wn1 = 0.0f;
x->wn1 = wn1; x->wn2 = wn2; return(w+5); } /* yn0 = *out; xn0 = *in; ************* yn0 = a0*xn0 + a1*xn1 + a2*xn2 + b1*yn1 + b2*yn2; yn2 = yn1; yn1 = yn0; xn2 = xn1; xn1 = xn0; ************************* y/x = (a0 + a1*z-1 + a2*z-2)/(1 - b1*z-1 - b2*z-2);*/
static t_int *para_bp2_tilde_perf8(t_int *w) { t_float *in = (t_float *)(w[1]); t_float *out = (t_float *)(w[2]); t_para_bp2_tilde *x = (t_para_bp2_tilde *)(w[3]); int i, n = (t_int)(w[4]); t_float wn[10]; t_float a0=x->a0, a1=x->a1, a2=x->a2; t_float b1=x->b1, b2=x->b2;
para_bp2_tilde_dsp_tick(x); wn[0] = x->wn2; wn[1] = x->wn1; for(i=0; i<n; i+=8, in+=8, out+=8) { wn[2] = in[0] + b1*wn[1] + b2*wn[0]; out[0] = a0*wn[2] + a1*wn[1] + a2*wn[0]; wn[3] = in[1] + b1*wn[2] + b2*wn[1]; out[1] = a0*wn[3] + a1*wn[2] + a2*wn[1]; wn[4] = in[2] + b1*wn[3] + b2*wn[2]; out[2] = a0*wn[4] + a1*wn[3] + a2*wn[2]; wn[5] = in[3] + b1*wn[4] + b2*wn[3]; out[3] = a0*wn[5] + a1*wn[4] + a2*wn[3]; wn[6] = in[4] + b1*wn[5] + b2*wn[4]; out[4] = a0*wn[6] + a1*wn[5] + a2*wn[4]; wn[7] = in[5] + b1*wn[6] + b2*wn[5]; out[5] = a0*wn[7] + a1*wn[6] + a2*wn[5]; wn[8] = in[6] + b1*wn[7] + b2*wn[6]; out[6] = a0*wn[8] + a1*wn[7] + a2*wn[6]; wn[9] = in[7] + b1*wn[8] + b2*wn[7]; out[7] = a0*wn[9] + a1*wn[8] + a2*wn[7]; wn[0] = wn[8]; wn[1] = wn[9]; } /* NAN protect */ if(IEM_DENORMAL(wn[0])) wn[0] = 0.0f; if(IEM_DENORMAL(wn[1])) wn[1] = 0.0f;
x->wn1 = wn[1]; x->wn2 = wn[0]; return(w+5); }
static void para_bp2_tilde_ft4(t_para_bp2_tilde *x, t_floatarg t) { int i = (int)((x->ticks_per_interpol_time)*t);
x->interpol_time = t; if(i <= 0) i = 1; x->ticks = i; x->rcp_ticks = 1.0f / (t_float)i; }
static void para_bp2_tilde_ft3(t_para_bp2_tilde *x, t_floatarg l) { t_float g = exp(0.11512925465 * l);
if(g != x->cur_g) { x->end_g = g; x->counter_g = x->ticks; x->delta_g = exp(log(g/x->cur_g)*x->rcp_ticks); x->event_mask |= 4;/*set event_mask_bit 2 = 1*/ } }
static void para_bp2_tilde_ft2(t_para_bp2_tilde *x, t_floatarg q) { t_float a;
if(q <= 0.0f) q = 0.000001f; a = 1.0f/q; if(a != x->cur_a) { x->end_a = a; x->counter_a = x->ticks; x->delta_a = exp(log(a/x->cur_a)*x->rcp_ticks); x->event_mask |= 2;/*set event_mask_bit 1 = 1*/ } }
static void para_bp2_tilde_ft1(t_para_bp2_tilde *x, t_floatarg f) { if(f <= 0.0f) f = 0.000001f; if(f != x->cur_f) { x->end_f = f; x->counter_f = x->ticks; x->delta_f = exp(log(f/x->cur_f)*x->rcp_ticks); x->event_mask |= 1;/*set event_mask_bit 0 = 1*/ } }
static void para_bp2_tilde_print(t_para_bp2_tilde *x) { // post("fb1 = %g, fb2 = %g, ff1 = %g, ff2 = %g, ff3 = %g", x->b1, x->b2, x->a0, x->a1, x->a2); x->x_at[0].a_w.w_float = x->b1; x->x_at[1].a_w.w_float = x->b2; x->x_at[2].a_w.w_float = x->a0; x->x_at[3].a_w.w_float = x->a1; x->x_at[4].a_w.w_float = x->a2; outlet_list(x->x_debug_outlet, &s_list, 5, x->x_at); }
static void para_bp2_tilde_dsp(t_para_bp2_tilde *x, t_signal **sp) { t_float si, co, f; int i, n=(int)sp[0]->s_n;
x->sr = 3.14159265358979323846f / (t_float)(sp[0]->s_sr); x->ticks_per_interpol_time = 0.001f * (t_float)(sp[0]->s_sr) / (t_float)n; i = (int)((x->ticks_per_interpol_time)*(x->interpol_time)); if(i <= 0) i = 1; x->ticks = i; x->rcp_ticks = 1.0f / (t_float)i; f = x->cur_f * x->sr; if(f < 1.0e-20f) x->cur_l = 1.0e20f; else if(f > 1.57079632f) x->cur_l = 0.0f; else { si = sin(f); co = cos(f); x->cur_l = co/si; } if(n&7) dsp_add(para_bp2_tilde_perform, 4, sp[0]->s_vec, sp[1]->s_vec, x, n); else dsp_add(para_bp2_tilde_perf8, 4, sp[0]->s_vec, sp[1]->s_vec, x, n); }
static void *para_bp2_tilde_new(t_symbol *s, int argc, t_atom *argv) { t_para_bp2_tilde *x = (t_para_bp2_tilde *)pd_new(para_bp2_tilde_class); int i; t_float si, co, f=0.0f, q=1.0f, l=0.0f, interpol=0.0f;
inlet_new(&x->x_obj, &x->x_obj.ob_pd, &s_float, gensym("ft1")); inlet_new(&x->x_obj, &x->x_obj.ob_pd, &s_float, gensym("ft2")); inlet_new(&x->x_obj, &x->x_obj.ob_pd, &s_float, gensym("ft3")); inlet_new(&x->x_obj, &x->x_obj.ob_pd, &s_float, gensym("ft4")); outlet_new(&x->x_obj, &s_signal); x->x_debug_outlet = outlet_new(&x->x_obj, &s_list); x->x_msi = 0;
x->x_at[0].a_type = A_FLOAT; x->x_at[1].a_type = A_FLOAT; x->x_at[2].a_type = A_FLOAT; x->x_at[3].a_type = A_FLOAT; x->x_at[4].a_type = A_FLOAT;
x->event_mask = 1; x->counter_f = 1; x->counter_a = 0; x->counter_g = 0; x->delta_f = 0.0f; x->delta_a = 0.0f; x->delta_g = 0.0f; x->interpol_time = 500.0f; x->wn1 = 0.0f; x->wn2 = 0.0f; x->a0 = 0.0f; x->a1 = 0.0f; x->a2 = 0.0f; x->b1 = 0.0f; x->b2 = 0.0f; x->sr = 3.14159265358979323846f / 44100.0f; x->cur_a = 1.0f; if((argc == 4)&&IS_A_FLOAT(argv,3)&&IS_A_FLOAT(argv,2)&&IS_A_FLOAT(argv,1)&&IS_A_FLOAT(argv,0)) { f = (t_float)atom_getfloatarg(0, argc, argv); q = (t_float)atom_getfloatarg(1, argc, argv); l = (t_float)atom_getfloatarg(2, argc, argv); interpol = (t_float)atom_getfloatarg(3, argc, argv); } if(f <= 0.0f) f = 0.000001f; x->cur_f = f; f *= x->sr; if(f < 1.0e-20f) x->cur_l = 1.0e20f; else if(f > 1.57079632f) x->cur_l = 0.0f; else { si = sin(f); co = cos(f); x->cur_l = co/si; } if(q <= 0.0f) q = 0.000001f; x->cur_a = 1.0f/q; x->cur_g = exp(0.11512925465 * l); if(interpol <= 0.0f) interpol = 0.0f; x->interpol_time = interpol; x->ticks_per_interpol_time = 0.5f; i = (int)((x->ticks_per_interpol_time)*(x->interpol_time)); if(i <= 0) i = 1; x->ticks = i; x->rcp_ticks = 1.0f / (t_float)i; x->end_f = x->cur_f; x->end_a = x->cur_a; x->end_g = x->cur_g; return(x); }
void para_bp2_tilde_setup(void) { para_bp2_tilde_class = class_new(gensym("para_bp2~"), (t_newmethod)para_bp2_tilde_new, 0, sizeof(t_para_bp2_tilde), 0, A_GIMME, 0); CLASS_MAINSIGNALIN(para_bp2_tilde_class, t_para_bp2_tilde, x_msi); class_addmethod(para_bp2_tilde_class, (t_method)para_bp2_tilde_dsp, gensym("dsp"), 0); class_addmethod(para_bp2_tilde_class, (t_method)para_bp2_tilde_ft1, gensym("ft1"), A_FLOAT, 0); class_addmethod(para_bp2_tilde_class, (t_method)para_bp2_tilde_ft2, gensym("ft2"), A_FLOAT, 0); class_addmethod(para_bp2_tilde_class, (t_method)para_bp2_tilde_ft3, gensym("ft3"), A_FLOAT, 0); class_addmethod(para_bp2_tilde_class, (t_method)para_bp2_tilde_ft4, gensym("ft4"), A_FLOAT, 0); class_addmethod(para_bp2_tilde_class, (t_method)para_bp2_tilde_print, gensym("print"), 0); class_sethelpsymbol(para_bp2_tilde_class, gensym("iemhelp/help-para_bp2~")); }
--- NEW FILE: iem_sqrt4~.c --- /* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution.
iemlib1 written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2005 */
#include "m_pd.h" #include "iemlib.h" #include <math.h>
#define IEMSQRT4TAB1SIZE 256 #define IEMSQRT4TAB2SIZE 1024
/* ------------------------ iem_sqrt4~ ----------------------------- */
t_float *iem_sqrt4_tilde_exptab=(t_float *)0L; t_float *iem_sqrt4_tilde_mantissatab=(t_float *)0L;
static t_class *iem_sqrt4_tilde_class;
typedef struct _iem_sqrt4_tilde { t_object x_obj; t_float x_msi; } t_iem_sqrt4_tilde;
static t_int *iem_sqrt4_tilde_perform(t_int *w) { t_float *in = (t_float *)(w[1]); t_float *out = (t_float *)(w[2]); t_int n = (t_int)(w[3])/4;
while(n--) { t_float f = *in; t_float g, h; long l = *(long *)(in);
if(f < 0.0f) { *out++ = 0.0f; *out++ = 0.0f; *out++ = 0.0f; *out++ = 0.0f; } else { g = iem_sqrt4_tilde_exptab[(l >> 23) & 0xff] * iem_sqrt4_tilde_mantissatab[(l >> 13) & 0x3ff]; h = f * (1.5f * g - 0.5f * g * g * g * f); *out++ = h; *out++ = h; *out++ = h; *out++ = h; } in += 4; } return(w+4); }
static void iem_sqrt4_tilde_dsp(t_iem_sqrt4_tilde *x, t_signal **sp) { dsp_add(iem_sqrt4_tilde_perform, 3, sp[0]->s_vec, sp[1]->s_vec, sp[0]->s_n); }
static void iem_sqrt4_tilde_maketable(void) { int i; t_float f; long l;
if(!iem_sqrt4_tilde_exptab) { iem_sqrt4_tilde_exptab = (t_float *)getbytes(sizeof(t_float) * IEMSQRT4TAB1SIZE); for(i=0; i<IEMSQRT4TAB1SIZE; i++) { l = (i ? (i == IEMSQRT4TAB1SIZE-1 ? IEMSQRT4TAB1SIZE-2 : i) : 1)<< 23; *(long *)(&f) = l; iem_sqrt4_tilde_exptab[i] = 1.0f/sqrt(f); } } if(!iem_sqrt4_tilde_mantissatab) { iem_sqrt4_tilde_mantissatab = (t_float *)getbytes(sizeof(t_float) * IEMSQRT4TAB2SIZE); for(i=0; i<IEMSQRT4TAB2SIZE; i++) { f = 1.0f + (1.0f/(t_float)IEMSQRT4TAB2SIZE) * (t_float)i; iem_sqrt4_tilde_mantissatab[i] = 1.0f/sqrt(f); } } }
static void *iem_sqrt4_tilde_new(void) { t_iem_sqrt4_tilde *x = (t_iem_sqrt4_tilde *)pd_new(iem_sqrt4_tilde_class);
outlet_new(&x->x_obj, gensym("signal")); x->x_msi = 0; return (x); }
void iem_sqrt4_tilde_setup(void) { iem_sqrt4_tilde_class = class_new(gensym("iem_sqrt4~"), (t_newmethod)iem_sqrt4_tilde_new, 0, sizeof(t_iem_sqrt4_tilde), 0, 0); CLASS_MAINSIGNALIN(iem_sqrt4_tilde_class, t_iem_sqrt4_tilde, x_msi); class_addmethod(iem_sqrt4_tilde_class, (t_method)iem_sqrt4_tilde_dsp, gensym("dsp"), 0); iem_sqrt4_tilde_maketable(); class_sethelpsymbol(iem_sqrt4_tilde_class, gensym("iemhelp/help-iem_sqrt4~")); }
Index: forpp.c =================================================================== RCS file: /cvsroot/pure-data/externals/iemlib/src/iemlib1/forpp.c,v retrieving revision 1.4 retrieving revision 1.5 diff -C2 -d -r1.4 -r1.5 *** forpp.c 11 Apr 2006 16:24:09 -0000 1.4 --- forpp.c 8 Nov 2006 13:24:09 -0000 1.5 *************** *** 4,18 **** iemlib1 written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2005 */
- #ifdef _MSC_VER - #pragma warning( disable : 4244 ) - #pragma warning( disable : 4305 ) - #endif -
#include "m_pd.h" #include "iemlib.h" - #include <math.h> - #include <stdio.h> - #include <string.h>
/* ----------------------------- for++ -------------------------------- */ --- 4,10 ---- *************** *** 24,28 **** int x_beg; int x_end; ! float x_delay; int x_cur; int x_incr; --- 16,20 ---- int x_beg; int x_end; ! t_float x_delay; int x_cur; int x_incr; *************** *** 109,113 **** }
! static void forpp_float(t_forpp *x, t_float beg) { x->x_beg = (int)beg; --- 101,105 ---- }
! static void forpp_float(t_forpp *x, t_floatarg beg) { x->x_beg = (int)beg; *************** *** 118,122 **** }
! static void forpp_ft1(t_forpp *x, t_float end) { x->x_end = (int)end; --- 110,114 ---- }
! static void forpp_ft1(t_forpp *x, t_floatarg end) { x->x_end = (int)end; *************** *** 127,131 **** }
! static void forpp_ft2(t_forpp *x, t_float delay) { if(delay < 0.0) --- 119,123 ---- }
! static void forpp_ft2(t_forpp *x, t_floatarg delay) { if(delay < 0.0)
--- NEW FILE: mov_avrg_kern~.c --- /* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution.
iemlib1 written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2005 */
#include "m_pd.h" #include "iemlib.h"
/* -- mov_avrg_kern~ - kernel for a moving-average-filter with IIR - */
typedef struct _mov_avrg_kern_tilde { t_object x_obj; double x_wn1; double x_a0; double x_sr; double x_mstime; int x_nsamps; int x_counter; t_float x_msi; } t_mov_avrg_kern_tilde;
t_class *mov_avrg_kern_tilde_class;
static t_int *mov_avrg_kern_tilde_perform(t_int *w) { t_float *in_direct = (t_float *)(w[1]); t_float *in_delayed = (t_float *)(w[2]); t_float *out = (t_float *)(w[3]); t_mov_avrg_kern_tilde *x = (t_mov_avrg_kern_tilde *)(w[4]); int i, n = (int)(w[5]); double wn0, wn1=x->x_wn1, a0=x->x_a0;
if(x->x_counter) { int counter = x->x_counter;
if(counter >= n) { x->x_counter = counter - n; for(i=0; i<n; i++) { wn0 = wn1 + a0*(double)(*in_direct++); *out++ = (t_float)wn0; wn1 = wn0; } } else { x->x_counter = 0; for(i=0; i<counter; i++) { wn0 = wn1 + a0*(double)(*in_direct++); *out++ = (t_float)wn0; wn1 = wn0; } for(i=counter; i<n; i++) { wn0 = wn1 + a0*(double)(*in_direct++ - *in_delayed++); *out++ = (t_float)wn0; wn1 = wn0; } } } else { for(i=0; i<n; i++) { wn0 = wn1 + a0*(double)(*in_direct++ - *in_delayed++); *out++ = (t_float)wn0; wn1 = wn0; } } x->x_wn1 = wn1; return(w+6); }
static void mov_avrg_kern_tilde_ft1(t_mov_avrg_kern_tilde *x, t_floatarg mstime) { if(mstime < 0.04) mstime = 0.04; x->x_mstime = (double)mstime; x->x_nsamps = (int)(x->x_sr * x->x_mstime); x->x_counter = x->x_nsamps; x->x_wn1 = 0.0; x->x_a0 = 1.0/(double)(x->x_nsamps); }
static void mov_avrg_kern_tilde_reset(t_mov_avrg_kern_tilde *x) { x->x_counter = x->x_nsamps; x->x_wn1 = 0.0; }
static void mov_avrg_kern_tilde_dsp(t_mov_avrg_kern_tilde *x, t_signal **sp) { x->x_sr = 0.001*(double)(sp[0]->s_sr); x->x_nsamps = (int)(x->x_sr * x->x_mstime); x->x_counter = x->x_nsamps; x->x_wn1 = 0.0; x->x_a0 = 1.0/(double)(x->x_nsamps); dsp_add(mov_avrg_kern_tilde_perform, 5, sp[0]->s_vec, sp[1]->s_vec, sp[2]->s_vec, x, sp[0]->s_n); }
static void *mov_avrg_kern_tilde_new(t_floatarg mstime) { t_mov_avrg_kern_tilde *x = (t_mov_avrg_kern_tilde *)pd_new(mov_avrg_kern_tilde_class);
if(mstime < 0.04) mstime = 0.04; x->x_mstime = (double)mstime; x->x_sr = 44.1; x->x_nsamps = (int)(x->x_sr * x->x_mstime); x->x_counter = x->x_nsamps; x->x_wn1 = 0.0; x->x_a0 = 1.0/(double)(x->x_nsamps);
inlet_new(&x->x_obj, &x->x_obj.ob_pd, &s_signal, &s_signal); inlet_new(&x->x_obj, &x->x_obj.ob_pd, &s_float, gensym("ft1")); outlet_new(&x->x_obj, &s_signal); x->x_msi = 0; return(x); }
void mov_avrg_kern_tilde_setup(void) { mov_avrg_kern_tilde_class = class_new(gensym("mov_avrg_kern~"), (t_newmethod)mov_avrg_kern_tilde_new, 0, sizeof(t_mov_avrg_kern_tilde), 0, A_FLOAT, 0); CLASS_MAINSIGNALIN(mov_avrg_kern_tilde_class, t_mov_avrg_kern_tilde, x_msi); class_addmethod(mov_avrg_kern_tilde_class, (t_method)mov_avrg_kern_tilde_dsp, gensym("dsp"), 0); class_addmethod(mov_avrg_kern_tilde_class, (t_method)mov_avrg_kern_tilde_ft1, gensym("ft1"), A_FLOAT, 0); class_addmethod(mov_avrg_kern_tilde_class, (t_method)mov_avrg_kern_tilde_reset, gensym("reset"), 0); }
--- NEW FILE: peakenv~.c --- /* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution.
iemlib1 written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2005 */
#include "m_pd.h" #include "iemlib.h" #include <math.h>
/* ---------------- peakenv~ - simple peak-envelope-converter. ----------------- */
typedef struct _peakenv_tilde { t_object x_obj; t_float x_sr; t_float x_old_peak; t_float x_c1; t_float x_releasetime; t_float x_msi; } t_peakenv_tilde;
t_class *peakenv_tilde_class;
static void peakenv_tilde_reset(t_peakenv_tilde *x) { x->x_old_peak = 0.0f; }
static void peakenv_tilde_ft1(t_peakenv_tilde *x, t_floatarg f)/* release-time in ms */ { if(f < 0.0f) f = 0.0f; x->x_releasetime = f; x->x_c1 = exp(-1.0/(x->x_sr*0.001*x->x_releasetime)); }
static t_int *peakenv_tilde_perform(t_int *w) { t_float *in = (t_float *)(w[1]); t_float *out = (t_float *)(w[2]); t_peakenv_tilde *x = (t_peakenv_tilde *)(w[3]); int n = (int)(w[4]); t_float peak = x->x_old_peak; t_float c1 = x->x_c1; t_float absolute; int i;
for(i=0; i<n; i++) { absolute = fabs(*in++); peak *= c1; if(absolute > peak) peak = absolute; *out++ = peak; } /* NAN protect */ if(IEM_DENORMAL(peak)) peak = 0.0f; x->x_old_peak = peak; return(w+5); }
static void peakenv_tilde_dsp(t_peakenv_tilde *x, t_signal **sp) { x->x_sr = (t_float)sp[0]->s_sr; peakenv_tilde_ft1(x, x->x_releasetime); dsp_add(peakenv_tilde_perform, 4, sp[0]->s_vec, sp[1]->s_vec, x, sp[0]->s_n); }
static void *peakenv_tilde_new(t_floatarg f) { t_peakenv_tilde *x = (t_peakenv_tilde *)pd_new(peakenv_tilde_class);
if(f <= 0.0f) f = 0.0f; x->x_sr = 44100.0f; peakenv_tilde_ft1(x, f); x->x_old_peak = 0.0f; inlet_new(&x->x_obj, &x->x_obj.ob_pd, &s_float, gensym("ft1")); outlet_new(&x->x_obj, &s_signal); x->x_msi = 0; return(x); }
void peakenv_tilde_setup(void) { peakenv_tilde_class = class_new(gensym("peakenv~"), (t_newmethod)peakenv_tilde_new, 0, sizeof(t_peakenv_tilde), 0, A_DEFFLOAT, 0); CLASS_MAINSIGNALIN(peakenv_tilde_class, t_peakenv_tilde, x_msi); class_addmethod(peakenv_tilde_class, (t_method)peakenv_tilde_dsp, gensym("dsp"), 0); class_addmethod(peakenv_tilde_class, (t_method)peakenv_tilde_ft1, gensym("ft1"), A_FLOAT, 0); class_addmethod(peakenv_tilde_class, (t_method)peakenv_tilde_reset, gensym("reset"), 0); class_sethelpsymbol(peakenv_tilde_class, gensym("iemhelp/help-peakenv~")); }
Index: gate.c =================================================================== RCS file: /cvsroot/pure-data/externals/iemlib/src/iemlib1/gate.c,v retrieving revision 1.4 retrieving revision 1.5 diff -C2 -d -r1.4 -r1.5 *** gate.c 11 Apr 2006 16:24:09 -0000 1.4 --- gate.c 8 Nov 2006 13:24:09 -0000 1.5 *************** *** 2,18 **** * WARRANTIES, see the file, "LICENSE.txt," in this distribution.
! iemlib1 written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2004 */ ! ! #ifdef _MSC_VER ! #pragma warning( disable : 4244 ) ! #pragma warning( disable : 4305 ) ! #endif
#include "m_pd.h" #include "iemlib.h" ! #include <math.h> ! #include <stdio.h> ! #include <string.h>
/* --------- gate ---------------------- */ --- 2,11 ---- * WARRANTIES, see the file, "LICENSE.txt," in this distribution.
! iemlib1 written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2005 */
#include "m_pd.h" #include "iemlib.h" !
/* --------- gate ---------------------- */ *************** *** 22,26 **** { t_object x_obj; ! float x_state; } t_gate;
--- 15,19 ---- { t_object x_obj; ! t_float x_state; } t_gate;
*************** *** 68,72 **** floatinlet_new(&x->x_obj, &x->x_state); outlet_new(&x->x_obj, 0); ! x->x_state = (f==0.0)?0:1; return (x); } --- 61,65 ---- floatinlet_new(&x->x_obj, &x->x_state); outlet_new(&x->x_obj, 0); ! x->x_state = (f==0.0f)?0.0f:1.0f; return (x); }
--- NEW FILE: vcf_filter~.c --- /* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution.
iemlib1 written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2005 */
#include "m_pd.h" #include "iemlib.h" #include <math.h>
/* ---------- vcf_filter~ - slow dynamic vcf_filter 1. and 2. order ----------- */
typedef struct _vcf_filter_tilde { t_object x_obj; t_float x_wn1; t_float x_wn2; t_float x_msi; char x_filtname[6]; } t_vcf_filter_tilde;
t_class *vcf_filter_tilde_class;
static t_int *vcf_filter_tilde_perform_snafu(t_int *w) { t_float *in = (t_float *)(w[1]); t_float *out = (t_float *)(w[4]); int n = (t_int)(w[6]);
while(n--) *out++ = *in++; return(w+7); }
/* lp2 wn0 = *in++ - rcp*(2.0f*(2.0f - l2)*wn1 + (l2 - al)*wn2); *out++ = rcp*(wn0 + 2.0f*wn1 + wn2); wn2 = wn1; wn1 = wn0;
bp2 wn0 = *in++ - rcp*(2.0f*(2.0f - l2)*wn1 + (l2 - al)*wn2); *out++ = rcp*al*(wn0 - wn2); wn2 = wn1; wn1 = wn0;
rbp2 wn0 = *in++ - rcp*(2.0f*(2.0f - l2)*wn1 + (l2 - al)*wn2); *out++ = rcp*l*(wn0 - wn2); wn2 = wn1; wn1 = wn0;
hp2 wn0 = *in++ - rcp*(2.0f*(2.0f - l2)*wn1 + (l2 - al)*wn2); *out++ = rcp*(wn0 - 2.0f*wn1 + wn2); wn2 = wn1; wn1 = wn0;
*/
static t_int *vcf_filter_tilde_perform_lp2(t_int *w) { t_float *in = (t_float *)(w[1]); t_float *lp = (t_float *)(w[2]); t_float *q = (t_float *)(w[3]); t_float *out = (t_float *)(w[4]); t_vcf_filter_tilde *x = (t_vcf_filter_tilde *)(w[5]); int i, n = (t_int)(w[6]); t_float wn0, wn1=x->x_wn1, wn2=x->x_wn2; t_float l, al, l2, rcp;
for(i=0; i<n; i+=4) { l = lp[i]; if(q[i] < 0.000001f) al = 1000000.0f*l; else if(q[i] > 1000000.0f) al = 0.000001f*l; else al = l/q[i]; l2 = l*l + 1.0f; rcp = 1.0f/(al + l2);
wn0 = *in++ - rcp*(2.0f*(2.0f - l2)*wn1 + (l2 - al)*wn2); *out++ = rcp*(wn0 + 2.0f*wn1 + wn2); wn2 = wn1; wn1 = wn0;
wn0 = *in++ - rcp*(2.0f*(2.0f - l2)*wn1 + (l2 - al)*wn2); *out++ = rcp*(wn0 + 2.0f*wn1 + wn2); wn2 = wn1; wn1 = wn0;
wn0 = *in++ - rcp*(2.0f*(2.0f - l2)*wn1 + (l2 - al)*wn2); *out++ = rcp*(wn0 + 2.0f*wn1 + wn2); wn2 = wn1; wn1 = wn0;
wn0 = *in++ - rcp*(2.0f*(2.0f - l2)*wn1 + (l2 - al)*wn2); *out++ = rcp*(wn0 + 2.0f*wn1 + wn2); wn2 = wn1; wn1 = wn0; } /* NAN protect */ if(IEM_DENORMAL(wn2)) wn2 = 0.0f; if(IEM_DENORMAL(wn1)) wn1 = 0.0f;
x->x_wn1 = wn1; x->x_wn2 = wn2; return(w+7); }
static t_int *vcf_filter_tilde_perform_bp2(t_int *w) { t_float *in = (t_float *)(w[1]); t_float *lp = (t_float *)(w[2]); t_float *q = (t_float *)(w[3]); t_float *out = (t_float *)(w[4]); t_vcf_filter_tilde *x = (t_vcf_filter_tilde *)(w[5]); int i, n = (t_int)(w[6]); t_float wn0, wn1=x->x_wn1, wn2=x->x_wn2; t_float l, al, l2, rcp;
for(i=0; i<n; i+=4) { l = lp[i]; if(q[i] < 0.000001f) al = 1000000.0f*l; else if(q[i] > 1000000.0f) al = 0.000001f*l; else al = l/q[i]; l2 = l*l + 1.0f; rcp = 1.0f/(al + l2);
wn0 = *in++ - rcp*(2.0f*(2.0f - l2)*wn1 + (l2 - al)*wn2); *out++ = rcp*al*(wn0 - wn2); wn2 = wn1; wn1 = wn0;
wn0 = *in++ - rcp*(2.0f*(2.0f - l2)*wn1 + (l2 - al)*wn2); *out++ = rcp*al*(wn0 - wn2); wn2 = wn1; wn1 = wn0;
wn0 = *in++ - rcp*(2.0f*(2.0f - l2)*wn1 + (l2 - al)*wn2); *out++ = rcp*al*(wn0 - wn2); wn2 = wn1; wn1 = wn0;
wn0 = *in++ - rcp*(2.0f*(2.0f - l2)*wn1 + (l2 - al)*wn2); *out++ = rcp*al*(wn0 - wn2); wn2 = wn1; wn1 = wn0; } /* NAN protect */ if(IEM_DENORMAL(wn2)) wn2 = 0.0f; if(IEM_DENORMAL(wn1)) wn1 = 0.0f;
x->x_wn1 = wn1; x->x_wn2 = wn2; return(w+7); }
static t_int *vcf_filter_tilde_perform_rbp2(t_int *w) { t_float *in = (t_float *)(w[1]); t_float *lp = (t_float *)(w[2]); t_float *q = (t_float *)(w[3]); t_float *out = (t_float *)(w[4]); t_vcf_filter_tilde *x = (t_vcf_filter_tilde *)(w[5]); int i, n = (t_int)(w[6]); t_float wn0, wn1=x->x_wn1, wn2=x->x_wn2; t_float al, l, l2, rcp;
for(i=0; i<n; i+=4) { l = lp[i]; if(q[i] < 0.000001f) al = 1000000.0f*l; else if(q[i] > 1000000.0f) al = 0.000001f*l; else al = l/q[i]; l2 = l*l + 1.0f; rcp = 1.0f/(al + l2);
wn0 = *in++ - rcp*(2.0f*(2.0f - l2)*wn1 + (l2 - al)*wn2); *out++ = rcp*l*(wn0 - wn2); wn2 = wn1; wn1 = wn0;
wn0 = *in++ - rcp*(2.0f*(2.0f - l2)*wn1 + (l2 - al)*wn2); *out++ = rcp*l*(wn0 - wn2); wn2 = wn1; wn1 = wn0;
wn0 = *in++ - rcp*(2.0f*(2.0f - l2)*wn1 + (l2 - al)*wn2); *out++ = rcp*l*(wn0 - wn2); wn2 = wn1; wn1 = wn0;
wn0 = *in++ - rcp*(2.0f*(2.0f - l2)*wn1 + (l2 - al)*wn2); *out++ = rcp*l*(wn0 - wn2); wn2 = wn1; wn1 = wn0; } /* NAN protect */ if(IEM_DENORMAL(wn2)) wn2 = 0.0f; if(IEM_DENORMAL(wn1)) wn1 = 0.0f;
x->x_wn1 = wn1; x->x_wn2 = wn2; return(w+7); }
static t_int *vcf_filter_tilde_perform_hp2(t_int *w) { t_float *in = (t_float *)(w[1]); t_float *lp = (t_float *)(w[2]); t_float *q = (t_float *)(w[3]); t_float *out = (t_float *)(w[4]); t_vcf_filter_tilde *x = (t_vcf_filter_tilde *)(w[5]); int i, n = (t_int)(w[6]); t_float wn0, wn1=x->x_wn1, wn2=x->x_wn2; t_float l, al, l2, rcp, forw;
for(i=0; i<n; i+=4) { l = lp[i]; if(q[i] < 0.000001f) al = 1000000.0f*l; else if(q[i] > 1000000.0f) al = 0.000001f*l; else al = l/q[i]; l2 = l*l + 1.0f; rcp = 1.0f/(al + l2); forw = rcp * (l2 - 1.0f);
wn0 = *in++ - rcp*(2.0f*(2.0f - l2)*wn1 + (l2 - al)*wn2); *out++ = forw*(wn0 - 2.0f*wn1 + wn2); wn2 = wn1; wn1 = wn0;
wn0 = *in++ - rcp*(2.0f*(2.0f - l2)*wn1 + (l2 - al)*wn2); *out++ = forw*(wn0 - 2.0f*wn1 + wn2); wn2 = wn1; wn1 = wn0;
wn0 = *in++ - rcp*(2.0f*(2.0f - l2)*wn1 + (l2 - al)*wn2); *out++ = forw*(wn0 - 2.0f*wn1 + wn2); wn2 = wn1; wn1 = wn0;
wn0 = *in++ - rcp*(2.0f*(2.0f - l2)*wn1 + (l2 - al)*wn2); *out++ = forw*(wn0 - 2.0f*wn1 + wn2); wn2 = wn1; wn1 = wn0; } /* NAN protect */ if(IEM_DENORMAL(wn2)) wn2 = 0.0f; if(IEM_DENORMAL(wn1)) wn1 = 0.0f;
x->x_wn1 = wn1; x->x_wn2 = wn2; return(w+7); }
static void vcf_filter_tilde_dsp(t_vcf_filter_tilde *x, t_signal **sp) { if(!strcmp(x->x_filtname,"bp2")) dsp_add(vcf_filter_tilde_perform_bp2, 6, sp[0]->s_vec, sp[1]->s_vec, sp[2]->s_vec, sp[3]->s_vec, x, sp[0]->s_n); else if(!strcmp(x->x_filtname,"rbp2")) dsp_add(vcf_filter_tilde_perform_rbp2, 6, sp[0]->s_vec, sp[1]->s_vec, sp[2]->s_vec, sp[3]->s_vec, x, sp[0]->s_n); else if(!strcmp(x->x_filtname,"lp2")) dsp_add(vcf_filter_tilde_perform_lp2, 6, sp[0]->s_vec, sp[1]->s_vec, sp[2]->s_vec, sp[3]->s_vec, x, sp[0]->s_n); else if(!strcmp(x->x_filtname,"hp2")) dsp_add(vcf_filter_tilde_perform_hp2, 6, sp[0]->s_vec, sp[1]->s_vec, sp[2]->s_vec, sp[3]->s_vec, x, sp[0]->s_n); else { dsp_add(vcf_filter_tilde_perform_snafu, 6, sp[0]->s_vec, sp[1]->s_vec, sp[2]->s_vec, sp[3]->s_vec, x, sp[0]->s_n); post("vcf_filter~-Error: 1. initial-arguments: <sym> kind: lp2, bp2, rbp2, hp2!"); } }
static void *vcf_filter_tilde_new(t_symbol *filt_typ) { t_vcf_filter_tilde *x = (t_vcf_filter_tilde *)pd_new(vcf_filter_tilde_class); char *c;
inlet_new(&x->x_obj, &x->x_obj.ob_pd, &s_signal, &s_signal); inlet_new(&x->x_obj, &x->x_obj.ob_pd, &s_signal, &s_signal); outlet_new(&x->x_obj, &s_signal); x->x_msi = 0; x->x_wn1 = 0.0f; x->x_wn2 = 0.0f; c = (char *)filt_typ->s_name; c[5] = 0; strcpy(x->x_filtname, c); return(x); }
void vcf_filter_tilde_setup(void) { vcf_filter_tilde_class = class_new(gensym("vcf_filter~"), (t_newmethod)vcf_filter_tilde_new, 0, sizeof(t_vcf_filter_tilde), 0, A_DEFSYM, 0); CLASS_MAINSIGNALIN(vcf_filter_tilde_class, t_vcf_filter_tilde, x_msi); class_addmethod(vcf_filter_tilde_class, (t_method)vcf_filter_tilde_dsp, gensym("dsp"), 0); class_sethelpsymbol(vcf_filter_tilde_class, gensym("iemhelp/help-vcf_filter~")); }
--- NEW FILE: lp1_t~.c --- /* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution.
iemlib1 written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2005 */
#include "m_pd.h" #include "iemlib.h" #include <math.h>
/* -- lp1_t~ - slow dynamic lowpass-filter 1. order with tau input --- */
typedef struct _lp1_t_tilde { t_object x_obj; t_float yn1; t_float c0; t_float c1; t_float sr; t_float cur_t; t_float delta_t; t_float end_t; t_float ticks_per_interpol_time; t_float rcp_ticks; t_float interpol_time; int ticks; int counter_t; t_float x_msi; } t_lp1_t_tilde;
t_class *lp1_t_tilde_class;
static void lp1_t_tilde_dsp_tick(t_lp1_t_tilde *x) { if(x->counter_t) { if(x->counter_t <= 1) { x->cur_t = x->end_t; x->counter_t = 0; } else { x->counter_t--; x->cur_t += x->delta_t; } if(x->cur_t == 0.0f) x->c1 = 0.0f; else x->c1 = exp((x->sr)/x->cur_t); x->c0 = 1.0f - x->c1; } }
static t_int *lp1_t_tilde_perform(t_int *w) { t_float *in = (t_float *)(w[1]); t_float *out = (t_float *)(w[2]); t_lp1_t_tilde *x = (t_lp1_t_tilde *)(w[3]); int i, n = (t_int)(w[4]); t_float yn0, yn1=x->yn1; t_float c0=x->c0, c1=x->c1;
lp1_t_tilde_dsp_tick(x); for(i=0; i<n; i++) { yn0 = (*in++)*c0 + yn1*c1; *out++ = yn0; yn1 = yn0; } /* NAN protect */ if(IEM_DENORMAL(yn1)) yn1 = 0.0f; x->yn1 = yn1; return(w+5); }
static t_int *lp1_t_tilde_perf8(t_int *w) { t_float *in = (t_float *)(w[1]); t_float *out = (t_float *)(w[2]); t_lp1_t_tilde *x = (t_lp1_t_tilde *)(w[3]); int i, n = (t_int)(w[4]); t_float yn[9]; t_float c0=x->c0, c1=x->c1;
lp1_t_tilde_dsp_tick(x); yn[0] = x->yn1; for(i=0; i<n; i+=8, in+=8, out+=8) { yn[1] = in[0]*c0 + yn[0]*c1; out[0] = yn[1]; yn[2] = in[1]*c0 + yn[1]*c1; out[1] = yn[2]; yn[3] = in[2]*c0 + yn[2]*c1; out[2] = yn[3]; yn[4] = in[3]*c0 + yn[3]*c1; out[3] = yn[4]; yn[5] = in[4]*c0 + yn[4]*c1; out[4] = yn[5]; yn[6] = in[5]*c0 + yn[5]*c1; out[5] = yn[6]; yn[7] = in[6]*c0 + yn[6]*c1; out[6] = yn[7]; yn[8] = in[7]*c0 + yn[7]*c1; out[7] = yn[8]; yn[0] = yn[8]; } /* NAN protect */ if(IEM_DENORMAL(yn[0])) yn[0] = 0.0f;
x->yn1 = yn[0]; return(w+5); }
static void lp1_t_tilde_ft2(t_lp1_t_tilde *x, t_floatarg t) { int i = (int)((x->ticks_per_interpol_time)*t);
x->interpol_time = t; if(i <= 0) i = 1; x->ticks = i; x->rcp_ticks = 1.0f / (t_float)i; }
static void lp1_t_tilde_ft1(t_lp1_t_tilde *x, t_floatarg time_const) { if(time_const < 0.0f) time_const = 0.0f; if(time_const != x->cur_t) { x->end_t = time_const; x->counter_t = x->ticks; x->delta_t = (time_const - x->cur_t) * x->rcp_ticks; } }
static void lp1_t_tilde_dsp(t_lp1_t_tilde *x, t_signal **sp) { int i, n=(int)sp[0]->s_n;
x->sr = -1000.0f / (t_float)(sp[0]->s_sr); x->ticks_per_interpol_time = 0.001f * (t_float)(sp[0]->s_sr) / (t_float)n; i = (int)((x->ticks_per_interpol_time)*(x->interpol_time)); if(i <= 0) i = 1; x->ticks = i; x->rcp_ticks = 1.0f / (t_float)i; if(x->cur_t == 0.0f) x->c1 = 0.0f; else x->c1 = exp((x->sr)/x->cur_t); x->c0 = 1.0f - x->c1; if(n&7) dsp_add(lp1_t_tilde_perform, 4, sp[0]->s_vec, sp[1]->s_vec, x, n); else dsp_add(lp1_t_tilde_perf8, 4, sp[0]->s_vec, sp[1]->s_vec, x, n); }
static void *lp1_t_tilde_new(t_symbol *s, int argc, t_atom *argv) { t_lp1_t_tilde *x = (t_lp1_t_tilde *)pd_new(lp1_t_tilde_class); int i; t_float time_const=0.0f, interpol=0.0f;
inlet_new(&x->x_obj, &x->x_obj.ob_pd, &s_float, gensym("ft1")); inlet_new(&x->x_obj, &x->x_obj.ob_pd, &s_float, gensym("ft2")); outlet_new(&x->x_obj, &s_signal); x->x_msi = 0; x->counter_t = 1; x->delta_t = 0.0f; x->interpol_time = 0.0f; x->yn1 = 0.0f; x->sr = -1.0f / 44.1f; if((argc >= 1)&&IS_A_FLOAT(argv,0)) time_const = (t_float)atom_getfloatarg(0, argc, argv); if((argc >= 2)&&IS_A_FLOAT(argv,1)) interpol = (t_float)atom_getfloatarg(1, argc, argv); if(time_const < 0.0f) time_const = 0.0f; x->cur_t = time_const; if(time_const == 0.0f) x->c1 = 0.0f; else x->c1 = exp((x->sr)/time_const); x->c0 = 1.0f - x->c1; if(interpol < 0.0f) interpol = 0.0f; x->interpol_time = interpol; x->ticks_per_interpol_time = 0.5f; i = (int)((x->ticks_per_interpol_time)*(x->interpol_time)); if(i <= 0) i = 1; x->ticks = i; x->rcp_ticks = 1.0f / (t_float)i; x->end_t = x->cur_t; return (x); }
void lp1_t_tilde_setup(void) { lp1_t_tilde_class = class_new(gensym("lp1_t~"), (t_newmethod)lp1_t_tilde_new, 0, sizeof(t_lp1_t_tilde), 0, A_GIMME, 0); CLASS_MAINSIGNALIN(lp1_t_tilde_class, t_lp1_t_tilde, x_msi); class_addmethod(lp1_t_tilde_class, (t_method)lp1_t_tilde_dsp, gensym("dsp"), 0); class_addmethod(lp1_t_tilde_class, (t_method)lp1_t_tilde_ft1, gensym("ft1"), A_FLOAT, 0); class_addmethod(lp1_t_tilde_class, (t_method)lp1_t_tilde_ft2, gensym("ft2"), A_FLOAT, 0); class_sethelpsymbol(lp1_t_tilde_class, gensym("iemhelp/help-lp1_t~")); }
Index: biquad_freq_resp.c =================================================================== RCS file: /cvsroot/pure-data/externals/iemlib/src/iemlib1/biquad_freq_resp.c,v retrieving revision 1.5 retrieving revision 1.6 diff -C2 -d -r1.5 -r1.6 *** biquad_freq_resp.c 11 Apr 2006 16:24:09 -0000 1.5 --- biquad_freq_resp.c 8 Nov 2006 13:24:09 -0000 1.6 *************** *** 4,18 **** iemlib1 written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2005 */
- #ifdef _MSC_VER - #pragma warning( disable : 4244 ) - #pragma warning( disable : 4305 ) - #endif -
#include "m_pd.h" #include "iemlib.h" #include <math.h> - #include <stdio.h> - #include <string.h>
/* ------------------------ biquad_freq_resp ------------------- */ --- 4,11 ---- *************** *** 22,30 **** { t_object x_obj; ! float a0; ! float a1; ! float a2; ! float b1; ! float b2; t_outlet *x_out_re; t_outlet *x_out_im; --- 15,23 ---- { t_object x_obj; ! t_float a0; ! t_float a1; ! t_float a2; ! t_float b1; ! t_float b2; t_outlet *x_out_re; t_outlet *x_out_im; *************** *** 33,40 **** static t_class *biquad_freq_resp_class;
! static void biquad_freq_resp_float(t_biquad_freq_resp *x, t_float f) { ! float re1, im1, re2, im2; ! float c, s, a;
if(f < 0.0f) --- 26,33 ---- static t_class *biquad_freq_resp_class;
! static void biquad_freq_resp_float(t_biquad_freq_resp *x, t_floatarg f) { ! t_float re1, im1, re2, im2; ! t_float c, s, a;
if(f < 0.0f)
--- NEW FILE: iem_cot4~.c --- /* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution.
iemlib1 written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2005 */
#include "m_pd.h" #include "iemlib.h" #include <math.h>
/* ------------------------ iem_cot4~ ----------------------------- */
t_float *iem_cot4_tilde_table_cos=(t_float *)0L; t_float *iem_cot4_tilde_table_sin=(t_float *)0L;
static t_class *iem_cot4_tilde_class;
typedef struct _iem_cot4_tilde { t_object x_obj; t_float x_sr; t_float x_msi; } t_iem_cot4_tilde;
static t_int *iem_cot4_tilde_perform(t_int *w) { t_float *in = (t_float *)(w[1]); t_float *out = (t_float *)(w[2]); t_float norm_freq; t_float hout; t_iem_cot4_tilde *x = (t_iem_cot4_tilde *)(w[3]); t_float sr=x->x_sr; int n = (int)(w[4]); t_float *ctab = iem_cot4_tilde_table_cos, *stab = iem_cot4_tilde_table_sin; t_float *caddr, *saddr, cf1, cf2, sf1, sf2, frac; double dphase; int normhipart; int32 mytfi; union tabfudge tf;
tf.tf_d = UNITBIT32; normhipart = tf.tf_i[HIOFFSET];
#if 0 /* this is the readable version of the code. */ while (n--) { norm_freq = *in * sr; if(norm_freq < 0.0001f) norm_freq = 0.0001f; else if(norm_freq > 0.9f) norm_freq = 0.9f; dphase = (double)(norm_freq * (t_float)(COSTABSIZE)) + UNITBIT32; tf.tf_d = dphase; mytfi = tf.tf_i[HIOFFSET] & (COSTABSIZE-1); saddr = stab + (mytfi); caddr = ctab + (mytfi); tf.tf_i[HIOFFSET] = normhipart; frac = tf.tf_d - UNITBIT32; sf1 = saddr[0]; sf2 = saddr[1]; cf1 = caddr[0]; cf2 = caddr[1]; in++; *out++ = (cf1 + frac * (cf2 - cf1))/(sf1 + frac * (sf2 - sf1)); } #endif #if 1 /* this is the same, unwrapped by hand. prolog beg*/ n /= 4; norm_freq = *in * sr; if(norm_freq < 0.0001f) norm_freq = 0.0001f; else if(norm_freq > 0.9f) norm_freq = 0.9f; dphase = (double)(norm_freq * (t_float)(COSTABSIZE)) + UNITBIT32; tf.tf_d = dphase; mytfi = tf.tf_i[HIOFFSET] & (COSTABSIZE-1); saddr = stab + (mytfi); caddr = ctab + (mytfi); tf.tf_i[HIOFFSET] = normhipart; in += 4; /*prolog end*/ while (--n) { norm_freq = *in * sr; if(norm_freq < 0.0001f) norm_freq = 0.0001f; else if(norm_freq > 0.9f) norm_freq = 0.9f; dphase = (double)(norm_freq * (t_float)(COSTABSIZE)) + UNITBIT32; frac = tf.tf_d - UNITBIT32; tf.tf_d = dphase; sf1 = saddr[0]; sf2 = saddr[1]; cf1 = caddr[0]; cf2 = caddr[1]; mytfi = tf.tf_i[HIOFFSET] & (COSTABSIZE-1); saddr = stab + (mytfi); caddr = ctab + (mytfi); hout = (cf1 + frac * (cf2 - cf1))/(sf1 + frac * (sf2 - sf1)); *out++ = hout; *out++ = hout; *out++ = hout; *out++ = hout; in += 4; tf.tf_i[HIOFFSET] = normhipart; }/*epilog beg*/ frac = tf.tf_d - UNITBIT32; sf1 = saddr[0]; sf2 = saddr[1]; cf1 = caddr[0]; cf2 = caddr[1]; hout = (cf1 + frac * (cf2 - cf1))/(sf1 + frac * (sf2 - sf1)); *out++ = hout; *out++ = hout; *out++ = hout; *out++ = hout; /*epilog end*/ #endif return (w+5); }
static void iem_cot4_tilde_dsp(t_iem_cot4_tilde *x, t_signal **sp) { x->x_sr = 2.0f / (t_float)sp[0]->s_sr; dsp_add(iem_cot4_tilde_perform, 4, sp[0]->s_vec, sp[1]->s_vec, x, sp[0]->s_n); }
static void iem_cot4_tilde_maketable(void) { int i; t_float *fp, phase, fff, phsinc = 0.5*3.141592653 / ((t_float)COSTABSIZE); union tabfudge tf;
if(!iem_cot4_tilde_table_sin) { iem_cot4_tilde_table_sin = (t_float *)getbytes(sizeof(t_float) * (COSTABSIZE+1)); for(i=COSTABSIZE+1, fp=iem_cot4_tilde_table_sin, phase=0; i--; fp++, phase+=phsinc) *fp = sin(phase); } if(!iem_cot4_tilde_table_cos) { iem_cot4_tilde_table_cos = (t_float *)getbytes(sizeof(t_float) * (COSTABSIZE+1)); for(i=COSTABSIZE+1, fp=iem_cot4_tilde_table_cos, phase=0; i--; fp++, phase+=phsinc) *fp = cos(phase); } tf.tf_d = UNITBIT32 + 0.5; if((unsigned)tf.tf_i[LOWOFFSET] != 0x80000000) bug("iem_cot4~: unexpected machine alignment"); }
static void *iem_cot4_tilde_new(void) { t_iem_cot4_tilde *x = (t_iem_cot4_tilde *)pd_new(iem_cot4_tilde_class);
outlet_new(&x->x_obj, gensym("signal")); x->x_msi = 0; return (x); }
void iem_cot4_tilde_setup(void) { iem_cot4_tilde_class = class_new(gensym("iem_cot4~"), (t_newmethod)iem_cot4_tilde_new, 0, sizeof(t_iem_cot4_tilde), 0, 0); class_addcreator((t_newmethod)iem_cot4_tilde_new, gensym("iem_cot~"), 0); CLASS_MAINSIGNALIN(iem_cot4_tilde_class, t_iem_cot4_tilde, x_msi); class_addmethod(iem_cot4_tilde_class, (t_method)iem_cot4_tilde_dsp, gensym("dsp"), 0); iem_cot4_tilde_maketable(); class_sethelpsymbol(iem_cot4_tilde_class, gensym("iemhelp/help-iem_cot4~")); }
--- NEW FILE: iem_delay~.c --- /* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution.
iemlib1 written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2005 */
#include "m_pd.h" #include "iemlib.h"
/* -------------------------- iem_delay~ ------------------------------ */
static t_class *iem_delay_tilde_class;
#define IEMDELAY_DEF_VEC_SIZE 64
typedef struct _iem_delay_tilde { t_object x_obj; int x_mallocsize; t_float x_max_delay_ms; t_float x_current_delay_ms; t_float *x_begmem1; t_float *x_begmem2; int x_writeindex; int x_blocksize; int x_delay_samples; t_float x_sr; t_float x_msi; } t_iem_delay_tilde;
static void iem_delay_tilde_cur_del(t_iem_delay_tilde *x, t_floatarg f) { if(f < 0.0f) f = 0.0f; else if(f > x->x_max_delay_ms) f = x->x_max_delay_ms; x->x_current_delay_ms = f; x->x_delay_samples = (int)(0.001f*x->x_sr * f + 0.5f); }
static t_int *iem_delay_tilde_perform(t_int *w) { t_float *in = (t_float *)(w[1]); t_float *out = (t_float *)(w[2]); t_iem_delay_tilde *x = (t_iem_delay_tilde *)(w[3]); int n=(int)(w[4]); int writeindex = x->x_writeindex; t_float *vec1, *vec2, *vec3;
vec1 = x->x_begmem1 + writeindex; vec2 = x->x_begmem2 + writeindex; vec3 = x->x_begmem2 + writeindex - x->x_delay_samples; writeindex += n; while(n--) { *vec1++ = *vec2++ = *in++; *out++ = *vec3++; } if(writeindex >= x->x_mallocsize) { writeindex -= x->x_mallocsize; } x->x_writeindex = writeindex; return(w+5); }
static t_int *iem_delay_tilde_perf8(t_int *w) { t_float *in = (t_float *)(w[1]); t_float *out = (t_float *)(w[2]); t_iem_delay_tilde *x = (t_iem_delay_tilde *)(w[3]); int i, n=(int)(w[4]); int writeindex = x->x_writeindex; t_float *vec1, *vec2;
vec1 = x->x_begmem1 + writeindex; vec2 = x->x_begmem2 + writeindex; for(i=0; i<n; i+=8) { *vec1++ = *vec2++ = *in++; *vec1++ = *vec2++ = *in++; *vec1++ = *vec2++ = *in++; *vec1++ = *vec2++ = *in++; *vec1++ = *vec2++ = *in++; *vec1++ = *vec2++ = *in++; *vec1++ = *vec2++ = *in++; *vec1++ = *vec2++ = *in++; }
vec2 = x->x_begmem2 + writeindex - x->x_delay_samples; for(i=0; i<n; i+=8) { *out++ = *vec2++; *out++ = *vec2++; *out++ = *vec2++; *out++ = *vec2++; *out++ = *vec2++; *out++ = *vec2++; *out++ = *vec2++; *out++ = *vec2++; }
writeindex += n; if(writeindex >= x->x_mallocsize) { writeindex -= x->x_mallocsize; } x->x_writeindex = writeindex; return(w+5); }
static void iem_delay_tilde_dsp(t_iem_delay_tilde *x, t_signal **sp) { int blocksize = sp[0]->s_n, i;
if(!x->x_blocksize)/*first time*/ { int nsamps = x->x_max_delay_ms * (t_float)sp[0]->s_sr * 0.001f;
if(nsamps < 1) nsamps = 1; nsamps += ((- nsamps) & (blocksize - 1)); nsamps += blocksize; x->x_mallocsize = nsamps; x->x_begmem1 = (t_float *)getbytes(2 * x->x_mallocsize * sizeof(t_float)); x->x_begmem2 = x->x_begmem1 + x->x_mallocsize; post("beginn = %x", (unsigned long)x->x_begmem1); x->x_writeindex = blocksize; x->x_sr = (t_float)sp[0]->s_sr; x->x_blocksize = blocksize; x->x_delay_samples = (int)(0.001f*x->x_sr * x->x_current_delay_ms + 0.5f); } else if((x->x_blocksize != blocksize) || ((t_float)sp[0]->s_sr != x->x_sr)) { int nsamps = x->x_max_delay_ms * (t_float)sp[0]->s_sr * 0.001f;
if(nsamps < 1) nsamps = 1; nsamps += ((- nsamps) & (blocksize - 1)); nsamps += blocksize;
x->x_begmem1 = (t_float *)resizebytes(x->x_begmem1, 2*x->x_mallocsize*sizeof(t_float), 2*nsamps*sizeof(t_float)); x->x_mallocsize = nsamps; x->x_begmem2 = x->x_begmem1 + x->x_mallocsize; post("beginn = %x", (unsigned long)x->x_begmem1); if(x->x_writeindex >= nsamps) x->x_writeindex -= nsamps; x->x_sr = (t_float)sp[0]->s_sr; x->x_blocksize = blocksize; x->x_delay_samples = (int)(0.001f*x->x_sr * x->x_current_delay_ms + 0.5f); }
if(blocksize&7) dsp_add(iem_delay_tilde_perform, 4, sp[0]->s_vec, sp[1]->s_vec, x, blocksize); else dsp_add(iem_delay_tilde_perf8, 4, sp[0]->s_vec, sp[1]->s_vec, x, blocksize); }
static void *iem_delay_tilde_new(t_floatarg max_delay_ms, t_floatarg current_delay_ms) { t_iem_delay_tilde *x = (t_iem_delay_tilde *)pd_new(iem_delay_tilde_class); int nsamps;
if(max_delay_ms < 2.0f) max_delay_ms = 2.0f; x->x_max_delay_ms = max_delay_ms; if(current_delay_ms < 0.0f) current_delay_ms = 0.0f; else if(current_delay_ms > max_delay_ms) current_delay_ms = max_delay_ms; x->x_current_delay_ms = current_delay_ms; nsamps = max_delay_ms * sys_getsr() * 0.001f; if(nsamps < 1) nsamps = 1; nsamps += ((- nsamps) & (IEMDELAY_DEF_VEC_SIZE - 1)); nsamps += IEMDELAY_DEF_VEC_SIZE; x->x_mallocsize = nsamps; x->x_begmem1 = (t_float *)getbytes(2 * x->x_mallocsize * sizeof(t_float)); x->x_begmem2 = x->x_begmem1 + x->x_mallocsize; x->x_writeindex = IEMDELAY_DEF_VEC_SIZE; x->x_blocksize = 0; x->x_sr = 0.0f; inlet_new(&x->x_obj, &x->x_obj.ob_pd, &s_float, gensym("ft1")); outlet_new(&x->x_obj, &s_signal); x->x_msi = 0.0f; return (x); }
static void iem_delay_tilde_free(t_iem_delay_tilde *x) { freebytes(x->x_begmem1, 2 * x->x_mallocsize * sizeof(t_float)); }
void iem_delay_tilde_setup(void) { iem_delay_tilde_class = class_new(gensym("iem_delay~"), (t_newmethod)iem_delay_tilde_new, (t_method)iem_delay_tilde_free, sizeof(t_iem_delay_tilde), 0, A_DEFFLOAT, A_DEFFLOAT, 0); CLASS_MAINSIGNALIN(iem_delay_tilde_class, t_iem_delay_tilde, x_msi); class_addmethod(iem_delay_tilde_class, (t_method)iem_delay_tilde_dsp, gensym("dsp"), 0); class_addmethod(iem_delay_tilde_class, (t_method)iem_delay_tilde_cur_del, gensym("ft1"), A_FLOAT, 0); }
--- NEW FILE: sin_phase~.c --- /* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution.
iemlib1 written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2005 */
#include "m_pd.h" #include "iemlib.h"
/* --- sin_phase~ - output the phase-difference between --- */ /* --- 2 sinewaves with the same frequency in samples ----- */ /* --- as a signal ---------------------------------------- */
typedef struct _sin_phase_tilde { t_object x_obj; t_float x_prev1; t_float x_prev2; t_float x_cur_out; int x_counter1; int x_counter2; int x_state1; int x_state2; t_float x_msi; } t_sin_phase_tilde;
t_class *sin_phase_tilde_class;
static t_int *sin_phase_tilde_perform(t_int *w) { t_float *in1 = (t_float *)(w[1]); t_float *in2 = (t_float *)(w[2]); t_float *out = (t_float *)(w[3]); t_sin_phase_tilde *x = (t_sin_phase_tilde *)(w[4]); int i, n = (t_int)(w[5]); t_float prev1=x->x_prev1; t_float prev2=x->x_prev2; t_float cur_out=x->x_cur_out; int counter1=x->x_counter1; int counter2=x->x_counter2; int state1=x->x_state1; int state2=x->x_state2;
for(i=0; i<n; i++) { if((in1[i] >= 0.0f) && (prev1 < 0.0f)) {/* pos. zero cross of sig_in_1 */ state1 = 1; counter1 = 0; } else if((in1[i] < 0.0f) && (prev1 >= 0.0f)) {/* neg. zero cross of sig_in_1 */ state2 = 1; counter2 = 0; }
if((in2[i] >= 0.0f) && (prev2 < 0.0f)) {/* pos. zero cross of sig_in_2 */ state1 = 0; cur_out = (t_float)(counter1); counter1 = 0; } else if((in2[i] < 0.0f) && (prev2 >= 0.0f)) {/* neg. zero cross of sig_in_2 */ state2 = 0; cur_out = (t_float)(counter2); counter2 = 0; }
if(state1) counter1++; if(state2) counter2++;
prev1 = in1[i]; prev2 = in2[i]; out[i] = cur_out; }
x->x_prev1 = prev1; x->x_prev2 = prev2; x->x_cur_out = cur_out; x->x_counter1 = counter1; x->x_counter2 = counter2; x->x_state1 = state1; x->x_state2 = state2;
return(w+6); }
static void sin_phase_tilde_dsp(t_sin_phase_tilde *x, t_signal **sp) { dsp_add(sin_phase_tilde_perform, 5, sp[0]->s_vec, sp[1]->s_vec, sp[2]->s_vec, x, sp[0]->s_n); }
static void *sin_phase_tilde_new(void) { t_sin_phase_tilde *x = (t_sin_phase_tilde *)pd_new(sin_phase_tilde_class);
inlet_new(&x->x_obj, &x->x_obj.ob_pd, &s_signal, &s_signal); outlet_new(&x->x_obj, &s_signal);
x->x_prev1 = 0.0f; x->x_prev2 = 0.0f; x->x_cur_out = 0.0f; x->x_counter1 = 0; x->x_counter2 = 0; x->x_state1 = 0; x->x_state2 = 0; x->x_msi = 0;
return (x); }
void sin_phase_tilde_setup(void) { sin_phase_tilde_class = class_new(gensym("sin_phase~"), (t_newmethod)sin_phase_tilde_new, 0, sizeof(t_sin_phase_tilde), 0, 0); CLASS_MAINSIGNALIN(sin_phase_tilde_class, t_sin_phase_tilde, x_msi); class_addmethod(sin_phase_tilde_class, (t_method)sin_phase_tilde_dsp, gensym("dsp"), 0); class_sethelpsymbol(sin_phase_tilde_class, gensym("iemhelp/help-sin_phase~")); }
Index: iemlib1.c =================================================================== RCS file: /cvsroot/pure-data/externals/iemlib/src/iemlib1/iemlib1.c,v retrieving revision 1.4 retrieving revision 1.5 diff -C2 -d -r1.4 -r1.5 *** iemlib1.c 11 Apr 2006 16:24:09 -0000 1.4 --- iemlib1.c 8 Nov 2006 13:24:09 -0000 1.5 *************** *** 4,12 **** iemlib1 written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2005 */
- #ifdef _MSC_VER - #pragma warning( disable : 4244 ) - #pragma warning( disable : 4305 ) - #endif -
#include "m_pd.h" --- 4,7 ---- *************** *** 25,49 **** void db2v_setup(void); void f2note_setup(void); void forpp_setup(void); void gate_setup(void); ! void sigfilter_setup(void); ! void sigFIR_setup(void); ! void sighml_shelf_setup(void); ! void sigiem_cot4_setup(void); ! void sigiem_delay_setup(void); ! void sigiem_sqrt4_setup(void); ! void sigiem_pow4_setup(void); ! void siglp1_t_setup(void); ! void sigmov_avrg_kern_setup(void); ! void sigpara_bp2_setup(void); ! void sigpeakenv_setup(void); ! void sigprvu_setup(void); ! void sigpvu_setup(void); ! void sigrvu_setup(void); ! void sigsin_phase_setup(void); ! void sigvcf_filter_setup(void); void soundfile_info_setup(void); void split_setup(void); void v2db_setup(void);
/* ------------------------ setup routine ------------------------- */ --- 20,44 ---- void db2v_setup(void); void f2note_setup(void); + void filter_tilde_setup(void); + void FIR_tilde_setup(void); void forpp_setup(void); void gate_setup(void); ! void hml_shelf_tilde_setup(void); ! void iem_cot4_tilde_setup(void); ! void iem_delay_tilde_setup(void); ! void iem_pow4_tilde_setup(void); ! void iem_sqrt4_tilde_setup(void); ! void lp1_t_tilde_setup(void); ! void mov_avrg_kern_tilde_setup(void); ! void para_bp2_tilde_setup(void); ! void peakenv_tilde_setup(void); ! void prvu_tilde_setup(void); ! void pvu_tilde_setup(void); ! void rvu_tilde_setup(void); ! void sin_phase_tilde_setup(void); void soundfile_info_setup(void); void split_setup(void); void v2db_setup(void); + void vcf_filter_tilde_setup(void);
/* ------------------------ setup routine ------------------------- */ *************** *** 57,81 **** db2v_setup(); f2note_setup(); forpp_setup(); gate_setup(); ! sigfilter_setup(); ! sigFIR_setup(); ! sighml_shelf_setup(); ! sigiem_cot4_setup(); ! sigiem_delay_setup(); ! sigiem_sqrt4_setup(); ! sigiem_pow4_setup(); ! siglp1_t_setup(); ! sigmov_avrg_kern_setup(); ! sigpara_bp2_setup(); ! sigpeakenv_setup(); ! sigprvu_setup(); ! sigpvu_setup(); ! sigrvu_setup(); ! sigsin_phase_setup(); ! sigvcf_filter_setup(); soundfile_info_setup(); split_setup(); v2db_setup();
post("iemlib1 (R-1.16) library loaded! (c) Thomas Musil 05.2005"); --- 52,76 ---- db2v_setup(); f2note_setup(); + filter_tilde_setup(); + FIR_tilde_setup(); forpp_setup(); gate_setup(); ! hml_shelf_tilde_setup(); ! iem_cot4_tilde_setup(); ! iem_delay_tilde_setup(); ! iem_pow4_tilde_setup(); ! iem_sqrt4_tilde_setup(); ! lp1_t_tilde_setup(); ! mov_avrg_kern_tilde_setup(); ! para_bp2_tilde_setup(); ! peakenv_tilde_setup(); ! prvu_tilde_setup(); ! pvu_tilde_setup(); ! rvu_tilde_setup(); ! sin_phase_tilde_setup(); soundfile_info_setup(); split_setup(); v2db_setup(); + vcf_filter_tilde_setup();
post("iemlib1 (R-1.16) library loaded! (c) Thomas Musil 05.2005");
--- NEW FILE: FIR~.c --- /* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution.
iemlib1 written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2005 */
#include "m_pd.h" #include "iemlib.h"
/* ---------- FIR~ - FIR-filter with table-coef ----------- */
typedef struct _FIR_tilde { t_object x_obj; t_float *x_coef_beg; t_float *x_history_beg; int x_rw_index; int x_fir_order; t_symbol *x_table_name; t_float x_msi; } t_FIR_tilde;
t_class *FIR_tilde_class;
static t_int *FIR_tilde_perform(t_int *w) { t_float *in = (t_float *)(w[1]); t_float *out = (t_float *)(w[2]); t_FIR_tilde *x = (t_FIR_tilde *)(w[3]); int n = (t_int)(w[4]); int rw_index = x->x_rw_index; int i, j; int order = x->x_fir_order; int ord16 = order / 16; t_float sum=0.0f; t_float *coef = x->x_coef_beg; t_float *write_hist1=x->x_history_beg; t_float *write_hist2; t_float *read_hist; t_float *coef_vec; t_float *hist_vec;
if(!coef) goto FIR_tildeperfzero;
write_hist1 = x->x_history_beg; write_hist2 = write_hist1 + order; read_hist = write_hist2;
for(i=0; i<n; i++) { write_hist1[rw_index] = in[i]; write_hist2[rw_index] = in[i];
sum = 0.0f; coef_vec = coef; hist_vec = &read_hist[rw_index]; for(j=0; j<ord16; j++) { sum += coef_vec[0] * hist_vec[0]; sum += coef_vec[1] * hist_vec[-1]; sum += coef_vec[2] * hist_vec[-2]; sum += coef_vec[3] * hist_vec[-3]; sum += coef_vec[4] * hist_vec[-4]; sum += coef_vec[5] * hist_vec[-5]; sum += coef_vec[6] * hist_vec[-6]; sum += coef_vec[7] * hist_vec[-7]; sum += coef_vec[8] * hist_vec[-8]; sum += coef_vec[9] * hist_vec[-9]; sum += coef_vec[10] * hist_vec[-10]; sum += coef_vec[11] * hist_vec[-11]; sum += coef_vec[12] * hist_vec[-12]; sum += coef_vec[13] * hist_vec[-13]; sum += coef_vec[14] * hist_vec[-14]; sum += coef_vec[15] * hist_vec[-15]; coef_vec += 16; hist_vec -= 16; } for(j=ord16*16; j<order; j++) { sum += coef[j] * read_hist[rw_index-j]; } out[i] = sum;
rw_index++; if(rw_index >= order) rw_index -= order; }
x->x_rw_index = rw_index; return(w+5);
FIR_tildeperfzero:
while(n--) *out++ = 0.0f; return(w+5); }
void FIR_tilde_set(t_FIR_tilde *x, t_symbol *table_name, t_floatarg forder) { t_garray *ga; int table_size; int order = (int)forder;
x->x_table_name = table_name; if(!(ga = (t_garray *)pd_findbyclass(x->x_table_name, garray_class))) { if(*table_name->s_name) error("FIR~: %s: no such table~", x->x_table_name->s_name); x->x_coef_beg = 0; } else if(!garray_getfloatarray(ga, &table_size, &x->x_coef_beg)) { error("%s: bad template for FIR~", x->x_table_name->s_name); x->x_coef_beg = 0; } else if(table_size < order) { error("FIR~: tablesize %d < order %d !!!!", table_size, order); x->x_coef_beg = 0; } else garray_usedindsp(ga); x->x_rw_index = 0; if(order > x->x_fir_order)/* resize */ x->x_history_beg = (t_float *)resizebytes(x->x_history_beg, 2*x->x_fir_order*sizeof(t_float), 2*order*sizeof(float)); x->x_fir_order = order; }
static void FIR_tilde_dsp(t_FIR_tilde *x, t_signal **sp) { FIR_tilde_set(x, x->x_table_name, x->x_fir_order); dsp_add(FIR_tilde_perform, 4, sp[0]->s_vec, sp[1]->s_vec, x, sp[0]->s_n); }
static void *FIR_tilde_new(t_symbol *ref, t_floatarg np) { t_FIR_tilde *x = (t_FIR_tilde *)pd_new(FIR_tilde_class);
outlet_new(&x->x_obj, &s_signal); x->x_msi = 0; x->x_table_name = ref; x->x_coef_beg = 0; if((int)np < 1) np = 1.0; x->x_fir_order = (int)np; x->x_history_beg = (t_float *)getbytes((2*x->x_fir_order)*sizeof(t_float)); x->x_rw_index = 0; return(x); }
static void FIR_tilde_free(t_FIR_tilde *x) { if(x->x_history_beg) freebytes(x->x_history_beg, (2*x->x_fir_order)*sizeof(t_float)); }
void FIR_tilde_setup(void) { FIR_tilde_class = class_new(gensym("FIR~"), (t_newmethod)FIR_tilde_new, (t_method)FIR_tilde_free, sizeof(t_FIR_tilde), 0, A_DEFSYM, A_DEFFLOAT, 0); CLASS_MAINSIGNALIN(FIR_tilde_class, t_FIR_tilde, x_msi); class_addmethod(FIR_tilde_class, (t_method)FIR_tilde_dsp, gensym("dsp"), 0); class_addmethod(FIR_tilde_class, (t_method)FIR_tilde_set, gensym("set"), A_SYMBOL, A_FLOAT, 0); class_sethelpsymbol(FIR_tilde_class, gensym("iemhelp/help-FIR~")); }
Index: split.c =================================================================== RCS file: /cvsroot/pure-data/externals/iemlib/src/iemlib1/split.c,v retrieving revision 1.5 retrieving revision 1.6 diff -C2 -d -r1.5 -r1.6 *** split.c 11 Apr 2006 16:24:09 -0000 1.5 --- split.c 8 Nov 2006 13:24:10 -0000 1.6 *************** *** 4,18 **** iemlib1 written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2005 */
- #ifdef _MSC_VER - #pragma warning( disable : 4244 ) - #pragma warning( disable : 4305 ) - #endif -
#include "m_pd.h" #include "iemlib.h" ! #include <math.h> ! #include <stdio.h> ! #include <string.h>
/* --------- split is like moses ----------- */ --- 4,11 ---- iemlib1 written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2005 */
#include "m_pd.h" #include "iemlib.h" !
/* --------- split is like moses ----------- */
--- NEW FILE: rvu~.c --- /* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution.
iemlib1 written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2005 */
#include "m_pd.h" #include "iemlib.h" #include <math.h>
/* ---------------- rvu~ - simple peak&rms-vu-meter. ----------------- */
typedef struct _rvu_tilde { t_object x_obj; void *x_clock_metro; t_float x_metro_time; t_float x_sum_rms; t_float x_old_rms; t_float x_rcp; t_float x_sr; t_float x_release_time; t_float x_c1; int x_started; t_float x_msi; } t_rvu_tilde;
t_class *rvu_tilde_class; static void rvu_tilde_tick_metro(t_rvu_tilde *x);
static void rvu_tilde_reset(t_rvu_tilde *x) { outlet_float(x->x_obj.ob_outlet, -99.9f); x->x_sum_rms = 0.0f; x->x_old_rms = 0.0f; clock_delay(x->x_clock_metro, x->x_metro_time); }
static void rvu_tilde_stop(t_rvu_tilde *x) { clock_unset(x->x_clock_metro); x->x_started = 0; }
static void rvu_tilde_start(t_rvu_tilde *x) { clock_delay(x->x_clock_metro, x->x_metro_time); x->x_started = 1; }
static void rvu_tilde_float(t_rvu_tilde *x, t_floatarg f) { if(f == 0.0f) { clock_unset(x->x_clock_metro); x->x_started = 0; } else { clock_delay(x->x_clock_metro, x->x_metro_time); x->x_started = 1; } }
static void rvu_tilde_t_release(t_rvu_tilde *x, t_floatarg release_time) { if(release_time <= 5.0f) release_time = 5.0f; x->x_release_time = release_time; x->x_c1 = exp(-2.0f*x->x_metro_time/x->x_release_time); }
static void rvu_tilde_t_metro(t_rvu_tilde *x, t_floatarg metro_time) { if(metro_time <= 5.0f) metro_time = 5.0f; x->x_metro_time = metro_time; x->x_c1 = exp(-2.0f*x->x_metro_time/x->x_release_time); x->x_rcp = 1.0f/(x->x_sr*x->x_metro_time); }
static t_int *rvu_tilde_perform(t_int *w) { t_float *in = (t_float *)(w[1]); t_rvu_tilde *x = (t_rvu_tilde *)(w[2]); int n = (int)(w[3]); t_float pow, sum=x->x_sum_rms; int i;
if(x->x_started) { for(i=0; i<n; i++) { sum += in[i]*in[i]; } x->x_sum_rms = sum; } return(w+4); }
static void rvu_tilde_dsp(t_rvu_tilde *x, t_signal **sp) { x->x_sr = 0.001*(t_float)sp[0]->s_sr; x->x_rcp = 1.0f/(x->x_sr*x->x_metro_time); dsp_add(rvu_tilde_perform, 3, sp[0]->s_vec, x, sp[0]->s_n); clock_delay(x->x_clock_metro, x->x_metro_time); }
static void rvu_tilde_tick_metro(t_rvu_tilde *x) { t_float dbr, cur_rms, c1=x->x_c1;
cur_rms = (1.0f - c1)*x->x_sum_rms*x->x_rcp + c1*x->x_old_rms; /* NAN protect */ if(IEM_DENORMAL(cur_rms)) cur_rms = 0.0f;
if(cur_rms <= 0.0000000001f) dbr = -99.9f; else if(cur_rms > 1000000.0f) { dbr = 60.0f; x->x_old_rms = 1000000.0f; } else dbr = 4.3429448195f*log(cur_rms); x->x_sum_rms = 0.0f; x->x_old_rms = cur_rms; outlet_float(x->x_obj.ob_outlet, dbr); clock_delay(x->x_clock_metro, x->x_metro_time); }
static void rvu_tilde_ff(t_rvu_tilde *x) { clock_free(x->x_clock_metro); }
static void *rvu_tilde_new(t_floatarg metro_time, t_floatarg release_time) { t_rvu_tilde *x=(t_rvu_tilde *)pd_new(rvu_tilde_class);
if(metro_time <= 0.0f) metro_time = 300.0f; if(metro_time <= 5.0f) metro_time = 5.0f; if(release_time <= 0.0f) release_time = 300.0f; if(release_time <= 5.0f) release_time = 5.0f; x->x_metro_time = metro_time; x->x_release_time = release_time; x->x_c1 = exp(-2.0f*x->x_metro_time/x->x_release_time); x->x_sum_rms = 0.0f; x->x_old_rms = 0.0f; x->x_sr = 44.1f; x->x_rcp = 1.0f/(x->x_sr*x->x_metro_time); x->x_clock_metro = clock_new(x, (t_method)rvu_tilde_tick_metro); x->x_started = 1; outlet_new(&x->x_obj, &s_float); x->x_msi = 0.0f; return(x); }
void rvu_tilde_setup(void) { rvu_tilde_class = class_new(gensym("rvu~"), (t_newmethod)rvu_tilde_new, (t_method)rvu_tilde_ff, sizeof(t_rvu_tilde), 0, A_DEFFLOAT, A_DEFFLOAT, 0); CLASS_MAINSIGNALIN(rvu_tilde_class, t_rvu_tilde, x_msi); class_addmethod(rvu_tilde_class, (t_method)rvu_tilde_dsp, gensym("dsp"), 0); class_addfloat(rvu_tilde_class, rvu_tilde_float); class_addmethod(rvu_tilde_class, (t_method)rvu_tilde_reset, gensym("reset"), 0); class_addmethod(rvu_tilde_class, (t_method)rvu_tilde_start, gensym("start"), 0); class_addmethod(rvu_tilde_class, (t_method)rvu_tilde_stop, gensym("stop"), 0); class_addmethod(rvu_tilde_class, (t_method)rvu_tilde_t_release, gensym("t_release"), A_FLOAT, 0); class_addmethod(rvu_tilde_class, (t_method)rvu_tilde_t_metro, gensym("t_metro"), A_FLOAT, 0); class_sethelpsymbol(rvu_tilde_class, gensym("iemhelp/help-rvu~")); }
--- NEW FILE: pvu~.c --- /* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution.
iemlib1 written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2005 */
#include "m_pd.h" #include "iemlib.h" #include <math.h>
/* ---------------- pvu~ - simple peak-vu-meter. ----------------- */
typedef struct _pvu_tilde { t_object x_obj; void *x_outlet_meter; void *x_outlet_over; void *x_clock; t_float x_cur_peak; t_float x_old_peak; t_float x_threshold_over; t_float x_c1; t_float x_metro_time; t_float x_release_time; int x_overflow_counter; int x_started; t_float x_msi; } t_pvu_tilde;
t_class *pvu_tilde_class; static void pvu_tilde_tick(t_pvu_tilde *x);
static void pvu_tilde_reset(t_pvu_tilde *x) { outlet_float(x->x_outlet_over, 0.0f); outlet_float(x->x_outlet_meter, -199.9f); x->x_overflow_counter = 0; x->x_cur_peak = 0.0f; x->x_old_peak = 0.0f; clock_delay(x->x_clock, x->x_metro_time); }
static void pvu_tilde_stop(t_pvu_tilde *x) { clock_unset(x->x_clock); x->x_started = 0; }
static void pvu_tilde_start(t_pvu_tilde *x) { clock_delay(x->x_clock, x->x_metro_time); x->x_started = 1; }
static void pvu_tilde_float(t_pvu_tilde *x, t_floatarg f) { if(f == 0.0) { clock_unset(x->x_clock); x->x_started = 0; } else { clock_delay(x->x_clock, x->x_metro_time); x->x_started = 1; } }
static void pvu_tilde_t_release(t_pvu_tilde *x, t_floatarg release_time) { if(release_time <= 5.0f) release_time = 5.0f; x->x_release_time = release_time; x->x_c1 = exp(-x->x_metro_time/release_time); }
static void pvu_tilde_t_metro(t_pvu_tilde *x, t_floatarg metro_time) { if(metro_time <= 5.0f) metro_time = 5.0f; x->x_metro_time = (int)metro_time; x->x_c1 = exp(-metro_time/x->x_release_time); }
static void pvu_tilde_threshold(t_pvu_tilde *x, t_floatarg thresh) { x->x_threshold_over = thresh; }
static t_int *pvu_tilde_perform(t_int *w) { t_float *in = (t_float *)(w[1]); t_pvu_tilde *x = (t_pvu_tilde *)(w[2]); int n = (int)(w[3]); t_float peak = x->x_cur_peak; t_float absolute; int i;
if(x->x_started) { for(i=0; i<n; i++) { absolute = fabs(*in++); if(absolute > peak) peak = absolute; } x->x_cur_peak = peak; } return(w+4); }
static void pvu_tilde_dsp(t_pvu_tilde *x, t_signal **sp) { dsp_add(pvu_tilde_perform, 3, sp[0]->s_vec, x, sp[0]->s_n); clock_delay(x->x_clock, x->x_metro_time); }
static void pvu_tilde_tick(t_pvu_tilde *x) { t_float db; int i;
x->x_old_peak *= x->x_c1; /* NAN protect */ if(IEM_DENORMAL(x->x_old_peak)) x->x_old_peak = 0.0f;
if(x->x_cur_peak > x->x_old_peak) x->x_old_peak = x->x_cur_peak; if(x->x_old_peak <= 0.0000000001f) db = -199.9f; else if(x->x_old_peak > 1000000.0f) { db = 120.0f; x->x_old_peak = 1000000.0f; } else db = 8.6858896381f*log(x->x_old_peak); if(db >= x->x_threshold_over) { x->x_overflow_counter++; outlet_float(x->x_outlet_over, (t_float)x->x_overflow_counter); } outlet_float(x->x_outlet_meter, db); x->x_cur_peak = 0.0f; clock_delay(x->x_clock, x->x_metro_time); }
static void *pvu_tilde_new(t_floatarg metro_time, t_floatarg release_time, t_floatarg threshold) { t_pvu_tilde *x; t_float t;
x = (t_pvu_tilde *)pd_new(pvu_tilde_class); if(metro_time <= 0.0f) metro_time = 300.0f; if(metro_time <= 5.0f) metro_time = 5.0f; if(release_time <= 0.0f) release_time = 300.0f; if(release_time <= 5.0f) release_time = 5.0f; if(threshold == 0.0f) threshold = -0.01f; x->x_threshold_over = threshold; x->x_overflow_counter = 0; x->x_metro_time = metro_time; x->x_release_time = release_time; x->x_c1 = exp(-metro_time/release_time); x->x_cur_peak = 0.0f; x->x_old_peak = 0.0f; x->x_clock = clock_new(x, (t_method)pvu_tilde_tick); x->x_outlet_meter = outlet_new(&x->x_obj, &s_float);/* left */ x->x_outlet_over = outlet_new(&x->x_obj, &s_float); /* right */ x->x_started = 1; x->x_msi = 0; return(x); }
static void pvu_tilde_ff(t_pvu_tilde *x) { clock_free(x->x_clock); }
void pvu_tilde_setup(void ) { pvu_tilde_class = class_new(gensym("pvu~"), (t_newmethod)pvu_tilde_new, (t_method)pvu_tilde_ff, sizeof(t_pvu_tilde), 0, A_DEFFLOAT, A_DEFFLOAT, A_DEFFLOAT, 0); CLASS_MAINSIGNALIN(pvu_tilde_class, t_pvu_tilde, x_msi); class_addmethod(pvu_tilde_class, (t_method)pvu_tilde_dsp, gensym("dsp"), 0); class_addfloat(pvu_tilde_class, pvu_tilde_float); class_addmethod(pvu_tilde_class, (t_method)pvu_tilde_reset, gensym("reset"), 0); class_addmethod(pvu_tilde_class, (t_method)pvu_tilde_start, gensym("start"), 0); class_addmethod(pvu_tilde_class, (t_method)pvu_tilde_stop, gensym("stop"), 0); class_addmethod(pvu_tilde_class, (t_method)pvu_tilde_t_release, gensym("t_release"), A_FLOAT, 0); class_addmethod(pvu_tilde_class, (t_method)pvu_tilde_t_metro, gensym("t_metro"), A_FLOAT, 0); class_addmethod(pvu_tilde_class, (t_method)pvu_tilde_threshold, gensym("threshold"), A_FLOAT, 0); class_sethelpsymbol(pvu_tilde_class, gensym("iemhelp/help-pvu~")); }
--- NEW FILE: hml_shelf~.c --- /* For information on usage and redistribution, and for a DISCLAIMER OF ALL * WARRANTIES, see the file, "LICENSE.txt," in this distribution.
iemlib1 written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2005 */
#include "m_pd.h" #include "iemlib.h" #include <math.h>
/* ---------- hml_shelf~ - high-middle-low-shelving filter ----------- */
typedef struct _hml_shelf_tilde { t_object x_obj; t_float wn1; t_float wn2; t_float a0; t_float a1; t_float a2; t_float b1; t_float b2; t_float sr; t_float cur_lf; t_float cur_hf; t_float cur_lg; t_float cur_mg; t_float cur_hg; t_float delta_lf; t_float delta_hf; t_float delta_lg; t_float delta_mg; t_float delta_hg; t_float end_lf; t_float end_hf; t_float end_lg; t_float end_mg; t_float end_hg; t_float ticks_per_interpol_time; t_float rcp_ticks; t_float interpol_time; int ticks; int counter_lf; int counter_hf; int counter_lg; int counter_mg; int counter_hg; int event_mask; void *x_debug_outlet; t_atom x_at[5]; t_float x_msi; } t_hml_shelf_tilde;
t_class *hml_shelf_tilde_class;
static void hml_shelf_tilde_calc(t_hml_shelf_tilde *x) { t_float rf = x->cur_hf/x->cur_lf; t_float mf = x->cur_hf*x->cur_lf; t_float lg = x->cur_lg; t_float rcplg = 1.0f/lg; t_float mg = x->cur_mg; t_float rcpmg = 1.0f/mg; t_float hg = x->cur_hg; t_float rcphg = 1.0f/hg; t_float f = mf*x->sr; t_float l = cos(f)/sin(f); t_float k1 = rf*l; t_float k2 = l/rf; t_float k3 = l*l; t_float k4 = k3*hg; t_float k5 = k3*rcphg; t_float k6 = rcplg + k5; t_float k7 = rcpmg*k1 + k2*rcplg*rcphg*mg; t_float k8 = lg + k4; t_float k9 = mg*k1 + k2*lg*hg*rcpmg; t_float k10 = 1.0f/(k6 + k7);
x->b2 = k10*(k7 - k6); x->b1 = k10*2.0f*(k5 - rcplg); x->a2 = k10*(k8 - k9); x->a1 = k10*2.0f*(lg - k4); x->a0 = k10*(k8 + k9); }
/* high- & low- shelving-filter: L....sqrt(lowlevel); rL...rsqrt(lowlevel); M....sqrt(mediumlevel); rM...rsqrt(mediumlevel); H....sqrt(highlevel); rH...rsqrt(highlevel); V....sqrt(highfrequency/lowfrequency); P....j*2*pi*f/(2*pi*V*lowfrequency);
Y/X = [M/(1/M)] * [(L/M + PV)/(M/L + PV)] * [(1 + HP/(VM))/(1 + MP/(VH))]; Y/X = (L + P*(M*V + L*H/(V*M)) + P*P*H) / (rL + P*(rM*V + rL*rH/(V*rM)) + P*P*rH);
hlshlv: lowlevel: ll; mediumlevel: lm; highlevel: hl; lowfrequency: fl; highfrequency: fh; samplerate: sr;
V = sqrt(fh/fl); f = fl*V; L = sqrt(ll); rL = 1.0/L; M = sqrt(lm); rM = 1.0/M; H = sqrt(lh); rH = 1.0/H;
l = cot(f*3.14159265358979323846/sr); k1 = V*l; k2 = l/V; l2 = l*l; l3 = l2*H; l4 = l2*rH; m1 = k2*L*H*rM; m2 = k2*rL*rH*M; n1 = rL + l4; n2 = rM*k1 + m2; p1 = L + l3; p2 = M*k1 + m1; a012 = 1.0/(n1 + n2);
b2 = a012*(n2 - n1); b1 = a012*2.0*(l4 - rL); a2 = a012*(p1 - p2); a1 = a012*2.0*(L - l3); a0 = a012*(p1 + p2);
rf = sqrt(fh/fl); mf = fl*rf; L = sqrt(ll); rL = 1.0/L; M = sqrt(lm); rM = 1.0/M; H = sqrt(lh); rH = 1.0/H;
l = cot(fm*3.14159265358979323846/sr); k1 = V*l; k2 = l/V; k3 = l*l; k4 = k3*H; k5 = k3*rH; k6 = rL + k5; k7 = rM*k1 + k2*rL*rH*M; k8 = L + k4; k9 = M*k1 + k2*L*H*rM; k10 = 1.0/(k6 + k7);
b2 = k10*(k7 - k6); b1 = k10*2.0*(k5 - rL); a2 = k10*(k8 - k9); a1 = k10*2.0*(L - k4); a0 = k10*(k8 + k9); */
static void hml_shelf_tilde_dsp_tick(t_hml_shelf_tilde *x) { if(x->event_mask) { t_float discriminant;
if(x->counter_lg) { if(x->counter_lg <= 1) { x->cur_lg = x->end_lg; x->counter_lg = 0; x->event_mask &= 30;/*set event_mask_bit 0 = 0*/ } else { x->counter_lg--; x->cur_lg *= x->delta_lg; } } if(x->counter_lf) { if(x->counter_lf <= 1) { x->cur_lf = x->end_lf; x->counter_lf = 0; x->event_mask &= 29;/*set event_mask_bit 1 = 0*/ } else { x->counter_lf--; x->cur_lf *= x->delta_lf; } } if(x->counter_mg) { if(x->counter_mg <= 1) { x->cur_mg = x->end_mg; x->counter_mg = 0; x->event_mask &= 27;/*set event_mask_bit 2 = 0*/ } else { x->counter_mg--; x->cur_mg *= x->delta_mg; } } if(x->counter_hf) { if(x->counter_hf <= 1) { x->cur_hf = x->end_hf; x->counter_hf = 0; x->event_mask &= 23;/*set event_mask_bit 3 = 0*/ } else { x->counter_hf--; x->cur_hf *= x->delta_hf; } } if(x->counter_hg) { if(x->counter_hg <= 1) { x->cur_hg = x->end_hg; x->counter_hg = 0; x->event_mask &= 15;/*set event_mask_bit 4 = 0*/ } else { x->counter_hg--; x->cur_hg *= x->delta_hg; } } hml_shelf_tilde_calc(x);
/* stability check */
discriminant = x->b1 * x->b1 + 4.0f * x->b2; if(x->b1 <= -1.9999996f) x->b1 = -1.9999996f; else if(x->b1 >= 1.9999996f) x->b1 = 1.9999996f;
if(x->b2 <= -0.9999998f) x->b2 = -0.9999998f; else if(x->b2 >= 0.9999998f) x->b2 = 0.9999998f;
if(discriminant >= 0.0f) { if(0.9999998f - x->b1 - x->b2 < 0.0f) x->b2 = 0.9999998f - x->b1; if(0.9999998f + x->b1 - x->b2 < 0.0f) x->b2 = 0.9999998f + x->b1; } } }
static t_int *hml_shelf_tilde_perform(t_int *w) { t_float *in = (t_float *)(w[1]); t_float *out = (t_float *)(w[2]); t_hml_shelf_tilde *x = (t_hml_shelf_tilde *)(w[3]); int i, n = (t_int)(w[4]); t_float wn0, wn1=x->wn1, wn2=x->wn2; t_float a0=x->a0, a1=x->a1, a2=x->a2; t_float b1=x->b1, b2=x->b2;
hml_shelf_tilde_dsp_tick(x); for(i=0; i<n; i++) { wn0 = *in++ + b1*wn1 + b2*wn2; *out++ = a0*wn0 + a1*wn1 + a2*wn2; wn2 = wn1; wn1 = wn0; } /* NAN protect */ if(IEM_DENORMAL(wn2)) wn2 = 0.0f; if(IEM_DENORMAL(wn1)) wn1 = 0.0f;
x->wn1 = wn1; x->wn2 = wn2; return(w+5); }
/* yn0 = *out; xn0 = *in; ************* yn0 = a0*xn0 + a1*xn1 + a2*xn2 + b1*yn1 + b2*yn2; yn2 = yn1; yn1 = yn0; xn2 = xn1; xn1 = xn0; ************************* y/x = (a0 + a1*z-1 + a2*z-2)/(1 - b1*z-1 - b2*z-2); */
static t_int *hml_shelf_tilde_perf8(t_int *w) { t_float *in = (t_float *)(w[1]); t_float *out = (t_float *)(w[2]); t_hml_shelf_tilde *x = (t_hml_shelf_tilde *)(w[3]); int i, n = (t_int)(w[4]); t_float wn[10]; t_float a0=x->a0, a1=x->a1, a2=x->a2; t_float b1=x->b1, b2=x->b2;
hml_shelf_tilde_dsp_tick(x); wn[0] = x->wn2; wn[1] = x->wn1; for(i=0; i<n; i+=8, in+=8, out+=8) { wn[2] = in[0] + b1*wn[1] + b2*wn[0]; out[0] = a0*wn[2] + a1*wn[1] + a2*wn[0]; wn[3] = in[1] + b1*wn[2] + b2*wn[1]; out[1] = a0*wn[3] + a1*wn[2] + a2*wn[1]; wn[4] = in[2] + b1*wn[3] + b2*wn[2]; out[2] = a0*wn[4] + a1*wn[3] + a2*wn[2]; wn[5] = in[3] + b1*wn[4] + b2*wn[3]; out[3] = a0*wn[5] + a1*wn[4] + a2*wn[3]; wn[6] = in[4] + b1*wn[5] + b2*wn[4]; out[4] = a0*wn[6] + a1*wn[5] + a2*wn[4]; wn[7] = in[5] + b1*wn[6] + b2*wn[5]; out[5] = a0*wn[7] + a1*wn[6] + a2*wn[5]; wn[8] = in[6] + b1*wn[7] + b2*wn[6]; out[6] = a0*wn[8] + a1*wn[7] + a2*wn[6]; wn[9] = in[7] + b1*wn[8] + b2*wn[7]; out[7] = a0*wn[9] + a1*wn[8] + a2*wn[7]; wn[0] = wn[8]; wn[1] = wn[9]; } /* NAN protect */ if(IEM_DENORMAL(wn[0])) wn[0] = 0.0f; if(IEM_DENORMAL(wn[1])) wn[1] = 0.0f;
x->wn1 = wn[1]; x->wn2 = wn[0]; return(w+5); }
static void hml_shelf_tilde_ft6(t_hml_shelf_tilde *x, t_floatarg t) { int i = (int)((x->ticks_per_interpol_time)*t);
x->interpol_time = t; if(i <= 0) i = 1; x->ticks = i; x->rcp_ticks = 1.0f / (t_float)i; }
static void hml_shelf_tilde_ft5(t_hml_shelf_tilde *x, t_floatarg hl) { t_float hg = exp(0.057564627325 * hl);
if(hg != x->cur_hg) { x->end_hg = hg; x->counter_hg = x->ticks; x->delta_hg = exp(log(hg/x->cur_hg)*x->rcp_ticks); x->event_mask |= 16;/*set event_mask_bit 4 = 1*/ } }
static void hml_shelf_tilde_ft4(t_hml_shelf_tilde *x, t_floatarg hf) { t_float sqhf;
if(hf <= 0.0f) hf = 0.000001f; sqhf = sqrt(hf); if(sqhf != x->cur_hf) { x->end_hf = sqhf; x->counter_hf = x->ticks; x->delta_hf = exp(log(sqhf/x->cur_hf)*x->rcp_ticks); x->event_mask |= 8;/*set event_mask_bit 3 = 1*/ } }
static void hml_shelf_tilde_ft3(t_hml_shelf_tilde *x, t_floatarg ml) { t_float mg = exp(0.057564627325 * ml);
if(mg != x->cur_mg) { x->end_mg = mg; x->counter_mg = x->ticks; x->delta_mg = exp(log(mg/x->cur_mg)*x->rcp_ticks); x->event_mask |= 4;/*set event_mask_bit 2 = 1*/ } }
static void hml_shelf_tilde_ft2(t_hml_shelf_tilde *x, t_floatarg lf) { t_float sqlf;
if(lf <= 0.0f) lf = 0.000001f; sqlf = sqrt(lf); if(sqlf != x->cur_lf) { x->end_lf = sqlf; x->counter_lf = x->ticks; x->delta_lf = exp(log(sqlf/x->cur_lf)*x->rcp_ticks); x->event_mask |= 2;/*set event_mask_bit 1 = 1*/ } }
static void hml_shelf_tilde_ft1(t_hml_shelf_tilde *x, t_floatarg ll) { t_float lg = exp(0.057564627325 * ll);
if(lg != x->cur_lg) { x->end_lg = lg; x->counter_lg = x->ticks; x->delta_lg = exp(log(lg/x->cur_lg)*x->rcp_ticks); x->event_mask |= 1;/*set event_mask_bit 0 = 1*/ } }
static void hml_shelf_tilde_print(t_hml_shelf_tilde *x) { // post("fb1 = %g, fb2 = %g, ff1 = %g, ff2 = %g, ff3 = %g", x->b1, x->b2, x->a0, x->a1, x->a2); x->x_at[0].a_w.w_float = x->b1; x->x_at[1].a_w.w_float = x->b2; x->x_at[2].a_w.w_float = x->a0; x->x_at[3].a_w.w_float = x->a1; x->x_at[4].a_w.w_float = x->a2; outlet_list(x->x_debug_outlet, &s_list, 5, x->x_at); }
static void hml_shelf_tilde_dsp(t_hml_shelf_tilde *x, t_signal **sp) { int i, n=(int)sp[0]->s_n;
x->sr = 3.14159265358979323846f / (t_float)(sp[0]->s_sr); x->ticks_per_interpol_time = 0.001f * (t_float)(sp[0]->s_sr) / (t_float)n; i = (int)((x->ticks_per_interpol_time)*(x->interpol_time)); if(i <= 0) i = 1; x->ticks = i; x->rcp_ticks = 1.0f / (t_float)i; if(n&7) dsp_add(hml_shelf_tilde_perform, 4, sp[0]->s_vec, sp[1]->s_vec, x, n); else dsp_add(hml_shelf_tilde_perf8, 4, sp[0]->s_vec, sp[1]->s_vec, x, n); }
static void *hml_shelf_tilde_new(t_symbol *s, int argc, t_atom *argv) { t_hml_shelf_tilde *x = (t_hml_shelf_tilde *)pd_new(hml_shelf_tilde_class); int i; t_float lf=200.0f, hf=2000.0f, ll=0.0f, ml=0.0f, hl=0.0f, interpol=0.0f;
inlet_new(&x->x_obj, &x->x_obj.ob_pd, &s_float, gensym("ft1")); inlet_new(&x->x_obj, &x->x_obj.ob_pd, &s_float, gensym("ft2")); inlet_new(&x->x_obj, &x->x_obj.ob_pd, &s_float, gensym("ft3")); inlet_new(&x->x_obj, &x->x_obj.ob_pd, &s_float, gensym("ft4")); inlet_new(&x->x_obj, &x->x_obj.ob_pd, &s_float, gensym("ft5")); inlet_new(&x->x_obj, &x->x_obj.ob_pd, &s_float, gensym("ft6")); outlet_new(&x->x_obj, &s_signal); x->x_debug_outlet = outlet_new(&x->x_obj, &s_list); x->x_msi = 0;
x->x_at[0].a_type = A_FLOAT; x->x_at[1].a_type = A_FLOAT; x->x_at[2].a_type = A_FLOAT; x->x_at[3].a_type = A_FLOAT; x->x_at[4].a_type = A_FLOAT;
x->event_mask = 2; x->counter_lg = 0; x->counter_lf = 1; x->counter_mg = 0; x->counter_hf = 0; x->counter_hg = 0; x->delta_lg = 0.0f; x->delta_lf = 0.0f; x->delta_mg = 0.0f; x->delta_hf = 0.0f; x->delta_hg = 0.0f; x->interpol_time = 0.0f; x->wn1 = 0.0f; x->wn2 = 0.0f; x->a0 = 0.0f; x->a1 = 0.0f; x->a2 = 0.0f; x->b1 = 0.0f; x->b2 = 0.0f; x->sr = 3.14159265358979323846f / 44100.0f; if((argc == 6)&&IS_A_FLOAT(argv,5)&&IS_A_FLOAT(argv,4)&&IS_A_FLOAT(argv,3) &&IS_A_FLOAT(argv,2)&&IS_A_FLOAT(argv,1)&&IS_A_FLOAT(argv,0)) { ll = (t_float)atom_getfloatarg(0, argc, argv); lf = (t_float)atom_getfloatarg(1, argc, argv); ml = (t_float)atom_getfloatarg(2, argc, argv); hf = (t_float)atom_getfloatarg(3, argc, argv); hl = (t_float)atom_getfloatarg(4, argc, argv); interpol = (t_float)atom_getfloatarg(5, argc, argv); } x->cur_lg = exp(0.057564627325 * ll); x->cur_mg = exp(0.057564627325 * ml); x->cur_hg = exp(0.057564627325 * hl); if(lf <= 0.0f) lf = 0.000001f; if(hf <= 0.0f) hf = 0.000001f; x->cur_lf = sqrt(lf); x->cur_hf = sqrt(hf); if(interpol < 0.0f) interpol = 0.0f; x->interpol_time = interpol; x->ticks_per_interpol_time = 0.5f; i = (int)((x->ticks_per_interpol_time)*(x->interpol_time)); if(i <= 0) i = 1; x->ticks = i; x->rcp_ticks = 1.0f / (t_float)i; x->end_lf = x->cur_lf; x->end_hf = x->cur_hf; x->end_lg = x->cur_lg; x->end_mg = x->cur_mg; x->end_hg = x->cur_hg; return(x); }
void hml_shelf_tilde_setup(void) { hml_shelf_tilde_class = class_new(gensym("hml_shelf~"), (t_newmethod)hml_shelf_tilde_new, 0, sizeof(t_hml_shelf_tilde), 0, A_GIMME, 0); CLASS_MAINSIGNALIN(hml_shelf_tilde_class, t_hml_shelf_tilde, x_msi); class_addmethod(hml_shelf_tilde_class, (t_method)hml_shelf_tilde_dsp, gensym("dsp"), 0); class_addmethod(hml_shelf_tilde_class, (t_method)hml_shelf_tilde_ft1, gensym("ft1"), A_FLOAT, 0); class_addmethod(hml_shelf_tilde_class, (t_method)hml_shelf_tilde_ft2, gensym("ft2"), A_FLOAT, 0); class_addmethod(hml_shelf_tilde_class, (t_method)hml_shelf_tilde_ft3, gensym("ft3"), A_FLOAT, 0); class_addmethod(hml_shelf_tilde_class, (t_method)hml_shelf_tilde_ft4, gensym("ft4"), A_FLOAT, 0); class_addmethod(hml_shelf_tilde_class, (t_method)hml_shelf_tilde_ft5, gensym("ft5"), A_FLOAT, 0); class_addmethod(hml_shelf_tilde_class, (t_method)hml_shelf_tilde_ft6, gensym("ft6"), A_FLOAT, 0); class_addmethod(hml_shelf_tilde_class, (t_method)hml_shelf_tilde_print, gensym("print"), 0); class_sethelpsymbol(hml_shelf_tilde_class, gensym("iemhelp/help-hml_shelf~")); }
Index: v2db.c =================================================================== RCS file: /cvsroot/pure-data/externals/iemlib/src/iemlib1/v2db.c,v retrieving revision 1.4 retrieving revision 1.5 diff -C2 -d -r1.4 -r1.5 *** v2db.c 11 Apr 2006 16:24:09 -0000 1.4 --- v2db.c 8 Nov 2006 13:24:10 -0000 1.5 *************** *** 4,18 **** iemlib1 written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2005 */
- #ifdef _MSC_VER - #pragma warning( disable : 4244 ) - #pragma warning( disable : 4305 ) - #endif -
#include "m_pd.h" #include "iemlib.h" #include <math.h> ! #include <stdio.h> ! #include <string.h>
/* -------- v2db - a rms-value to techn. dB converter. --------- */ --- 4,12 ---- iemlib1 written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2005 */
#include "m_pd.h" #include "iemlib.h" #include <math.h> !
/* -------- v2db - a rms-value to techn. dB converter. --------- */ *************** *** 20,24 **** static t_class *v2db_class;
! float v2db(float f) { return (f <= 0 ? -199.9 : 8.6858896381*log(f)); --- 14,18 ---- static t_class *v2db_class;
! t_float v2db(t_float f) { return (f <= 0 ? -199.9 : 8.6858896381*log(f));
Index: f2note.c =================================================================== RCS file: /cvsroot/pure-data/externals/iemlib/src/iemlib1/f2note.c,v retrieving revision 1.4 retrieving revision 1.5 diff -C2 -d -r1.4 -r1.5 *** f2note.c 11 Apr 2006 16:24:09 -0000 1.4 --- f2note.c 8 Nov 2006 13:24:09 -0000 1.5 *************** *** 4,18 **** iemlib1 written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2005 */
- #ifdef _MSC_VER - #pragma warning( disable : 4244 ) - #pragma warning( disable : 4305 ) - #endif -
#include "m_pd.h" #include "iemlib.h" #include <math.h> - #include <stdio.h> - #include <string.h>
/* ------------------------- f2note ---------------------- */ --- 4,11 ---- *************** *** 26,32 **** void *x_outlet_cent; int x_centomidi; ! float x_refhz; ! float x_refexp; ! float x_reflog; t_symbol *x_set; } t_f2note; --- 19,25 ---- void *x_outlet_cent; int x_centomidi; ! t_float x_refhz; ! t_float x_refexp; ! t_float x_reflog; t_symbol *x_set; } t_f2note; *************** *** 34,43 **** static t_class *f2note_class;
! float f2note_mtof(t_f2note *x, float midi) { return(x->x_refexp * exp(0.057762265047 * midi)); }
! float f2note_ftom(t_f2note *x, float freq) { return (freq > 0 ? 17.31234049 * log(x->x_reflog * freq) : -1500); --- 27,36 ---- static t_class *f2note_class;
! t_float f2note_mtof(t_f2note *x, t_float midi) { return(x->x_refexp * exp(0.057762265047 * midi)); }
! t_float f2note_ftom(t_f2note *x, t_float freq) { return (freq > 0 ? 17.31234049 * log(x->x_reflog * freq) : -1500); *************** *** 46,50 **** void f2note_calc_ref(t_f2note *x) { ! float ln2=log(2.0);
x->x_refexp = x->x_refhz*exp(-5.75*ln2); --- 39,43 ---- void f2note_calc_ref(t_f2note *x) { ! t_float ln2=log(2.0);
x->x_refexp = x->x_refhz*exp(-5.75*ln2); *************** *** 141,154 **** i = (x->x_centomidi + 50)/100; j = x->x_centomidi - 100*i; ! outlet_float(x->x_outlet_cent, (float)j); f2note_make_note(s, i); SETSYMBOL(&at, gensym(s)); outlet_anything(x->x_outlet_note, x->x_set, 1, &at); ! outlet_float(x->x_outlet_midi, 0.01*(float)(x->x_centomidi)); }
static void f2note_float(t_f2note *x, t_floatarg freq) { ! x->x_centomidi = (int)(100.0*f2note_ftom(x, freq) + 0.5); f2note_bang(x); } --- 134,147 ---- i = (x->x_centomidi + 50)/100; j = x->x_centomidi - 100*i; ! outlet_float(x->x_outlet_cent, (t_float)j); f2note_make_note(s, i); SETSYMBOL(&at, gensym(s)); outlet_anything(x->x_outlet_note, x->x_set, 1, &at); ! outlet_float(x->x_outlet_midi, 0.01f*(t_float)(x->x_centomidi)); }
static void f2note_float(t_f2note *x, t_floatarg freq) { ! x->x_centomidi = (int)(100.0f*f2note_ftom(x, freq) + 0.5f); f2note_bang(x); } *************** *** 164,171 **** t_f2note *x = (t_f2note *)pd_new(f2note_class);
! if(ref == 0.0) ! ref=440.0; x->x_refhz = ref; ! x->x_centomidi = (int)(100.0*ref + 0.499); f2note_calc_ref(x); x->x_outlet_midi = outlet_new(&x->x_obj, &s_float); --- 157,164 ---- t_f2note *x = (t_f2note *)pd_new(f2note_class);
! if(ref == 0.0f) ! ref=440.0f; x->x_refhz = ref; ! x->x_centomidi = (int)(100.0f*ref + 0.499f); f2note_calc_ref(x); x->x_outlet_midi = outlet_new(&x->x_obj, &s_float);