From 98e6c002e5b6b8a3c45eb014e000e4dd13f3dd8e Mon Sep 17 00:00:00 2001 From: musil Date: Wed, 24 Nov 2010 18:23:10 +0000 Subject: now with internal double precision rendering svn path=/trunk/externals/iemlib/; revision=14523 --- iemlib1/src/lp1_t~.c | 125 ++++++++++++++++++++++++++------------------------- 1 file changed, 64 insertions(+), 61 deletions(-) (limited to 'iemlib1/src/lp1_t~.c') diff --git a/iemlib1/src/lp1_t~.c b/iemlib1/src/lp1_t~.c index 5eb86a4..96e4a4e 100644 --- a/iemlib1/src/lp1_t~.c +++ b/iemlib1/src/lp1_t~.c @@ -1,7 +1,7 @@ /* 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 - 2006 */ +iemlib1 written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2010 */ #include "m_pd.h" #include "iemlib.h" @@ -12,13 +12,13 @@ iemlib1 written by Thomas Musil, Copyright (c) IEM KUG Graz Austria 2000 - 2006 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; + double yn1; + double c0; + double c1; + double sr; + double cur_t; + double delta_t; + double end_t; t_float ticks_per_interpol_time; t_float rcp_ticks; t_float interpol_time; @@ -43,11 +43,11 @@ static void lp1_t_tilde_dsp_tick(t_lp1_t_tilde *x) x->counter_t--; x->cur_t += x->delta_t; } - if(x->cur_t == 0.0f) - x->c1 = 0.0f; + if(x->cur_t == 0.0) + x->c1 = 0.0; else x->c1 = exp((x->sr)/x->cur_t); - x->c0 = 1.0f - x->c1; + x->c0 = 1.0 - x->c1; } } @@ -57,19 +57,19 @@ static t_int *lp1_t_tilde_perform(t_int *w) 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; + double yn0, yn1=x->yn1; + double c0=x->c0, c1=x->c1; lp1_t_tilde_dsp_tick(x); for(i=0; iyn1 = yn1; return(w+5); } @@ -80,59 +80,62 @@ static t_int *lp1_t_tilde_perf8(t_int *w) 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 ynn[9]; - t_float c0=x->c0, c1=x->c1; + double ynn[9]; + double c0=x->c0, c1=x->c1; lp1_t_tilde_dsp_tick(x); ynn[0] = x->yn1; for(i=0; iyn1 = ynn[0]; return(w+5); } -static void lp1_t_tilde_ft2(t_lp1_t_tilde *x, t_floatarg t) +static void lp1_t_tilde_ft2(t_lp1_t_tilde *x, t_floatarg interpol) { - int i = (int)((x->ticks_per_interpol_time)*t); + int i = (int)((x->ticks_per_interpol_time)*interpol); - x->interpol_time = t; + x->interpol_time = interpol; 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) +static void lp1_t_tilde_ft1(t_lp1_t_tilde *x, t_floatarg f_time_const) { - if(time_const < 0.0f) - time_const = 0.0f; - if(time_const != x->cur_t) + double d_time_const; + + if(f_time_const < 0.0f) + f_time_const = 0.0f; + d_time_const = (double)f_time_const; + if(d_time_const != x->cur_t) { - x->end_t = time_const; + x->end_t = d_time_const; x->counter_t = x->ticks; - x->delta_t = (time_const - x->cur_t) * x->rcp_ticks; + x->delta_t = (d_time_const - x->cur_t) * (double)x->rcp_ticks; } } @@ -140,18 +143,18 @@ 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->sr = -1000.0 / (double)(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; + if(x->cur_t == 0.0) + x->c1 = 0.0; else x->c1 = exp((x->sr)/x->cur_t); - x->c0 = 1.0f - x->c1; + x->c0 = 1.0 - x->c1; if(n&7) dsp_add(lp1_t_tilde_perform, 4, sp[0]->s_vec, sp[1]->s_vec, x, n); else @@ -162,29 +165,30 @@ 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; + t_float interpol=0.0f; + double time_const=0.0; 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->delta_t = 0.0; x->interpol_time = 0.0f; - x->yn1 = 0.0f; - x->sr = -1.0f / 44.1f; + x->yn1 = 0.0; + x->sr = -1.0 / 44.1; if((argc >= 1)&&IS_A_FLOAT(argv,0)) - time_const = (t_float)atom_getfloatarg(0, argc, argv); + time_const = (double)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; + if(time_const < 0.0) + time_const = 0.0; x->cur_t = time_const; - if(time_const == 0.0f) - x->c1 = 0.0f; + if(time_const == 0.0) + x->c1 = 0.0; else x->c1 = exp((x->sr)/time_const); - x->c0 = 1.0f - x->c1; + x->c0 = 1.0 - x->c1; if(interpol < 0.0f) interpol = 0.0f; x->interpol_time = interpol; @@ -206,5 +210,4 @@ void lp1_t_tilde_setup(void) 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~")); } -- cgit v1.2.1