aboutsummaryrefslogtreecommitdiff
path: root/iemlib1/src/lp1_t~.c
diff options
context:
space:
mode:
authormusil <tmusil@users.sourceforge.net>2010-11-24 18:23:10 +0000
committermusil <tmusil@users.sourceforge.net>2010-11-24 18:23:10 +0000
commit98e6c002e5b6b8a3c45eb014e000e4dd13f3dd8e (patch)
tree3f45d3e40757caafcbc75ad9be38225af588a0e3 /iemlib1/src/lp1_t~.c
parentfaec4ffea914580d0722a3f29286863fbafeac0b (diff)
now with internal double precision rendering
svn path=/trunk/externals/iemlib/; revision=14523
Diffstat (limited to 'iemlib1/src/lp1_t~.c')
-rw-r--r--iemlib1/src/lp1_t~.c125
1 files changed, 64 insertions, 61 deletions
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; i<n; i++)
{
- yn0 = (*in++)*c0 + yn1*c1;
- *out++ = yn0;
+ yn0 = (double)(*in++)*c0 + yn1*c1;
+ *out++ = (t_float)yn0;
yn1 = yn0;
}
/* NAN protect */
- if(IEM_DENORMAL(yn1))
- yn1 = 0.0f;
+ //if(IEM_DENORMAL(yn1))
+ // yn1 = 0.0;
x->yn1 = 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; i<n; i+=8, in+=8, out+=8)
{
- ynn[1] = in[0]*c0 + ynn[0]*c1;
- out[0] = ynn[1];
- ynn[2] = in[1]*c0 + ynn[1]*c1;
- out[1] = ynn[2];
- ynn[3] = in[2]*c0 + ynn[2]*c1;
- out[2] = ynn[3];
- ynn[4] = in[3]*c0 + ynn[3]*c1;
- out[3] = ynn[4];
- ynn[5] = in[4]*c0 + ynn[4]*c1;
- out[4] = ynn[5];
- ynn[6] = in[5]*c0 + ynn[5]*c1;
- out[5] = ynn[6];
- ynn[7] = in[6]*c0 + ynn[6]*c1;
- out[6] = ynn[7];
- ynn[8] = in[7]*c0 + ynn[7]*c1;
- out[7] = ynn[8];
+ ynn[1] = (double)in[0]*c0 + ynn[0]*c1;
+ out[0] = (t_float)ynn[1];
+ ynn[2] = (double)in[1]*c0 + ynn[1]*c1;
+ out[1] = (t_float)ynn[2];
+ ynn[3] = (double)in[2]*c0 + ynn[2]*c1;
+ out[2] = (t_float)ynn[3];
+ ynn[4] = (double)in[3]*c0 + ynn[3]*c1;
+ out[3] = (t_float)ynn[4];
+ ynn[5] = (double)in[4]*c0 + ynn[4]*c1;
+ out[4] = (t_float)ynn[5];
+ ynn[6] = (double)in[5]*c0 + ynn[5]*c1;
+ out[5] = (t_float)ynn[6];
+ ynn[7] = (double)in[6]*c0 + ynn[6]*c1;
+ out[6] = (t_float)ynn[7];
+ ynn[8] = (double)in[7]*c0 + ynn[7]*c1;
+ out[7] = (t_float)ynn[8];
ynn[0] = ynn[8];
}
/* NAN protect */
- if(IEM_DENORMAL(ynn[0]))
- ynn[0] = 0.0f;
+ //if(IEM_DENORMAL(ynn[0]))
+ // ynn[0] = 0.0f;
x->yn1 = 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~"));
}