aboutsummaryrefslogtreecommitdiff
path: root/src/iemlib1/lp1_t~.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/iemlib1/lp1_t~.c')
-rw-r--r--src/iemlib1/lp1_t~.c210
1 files changed, 0 insertions, 210 deletions
diff --git a/src/iemlib1/lp1_t~.c b/src/iemlib1/lp1_t~.c
deleted file mode 100644
index b7d7685..0000000
--- a/src/iemlib1/lp1_t~.c
+++ /dev/null
@@ -1,210 +0,0 @@
-/* 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~"));
-}