From f40d8c3d61e9ac6a7a4e06f6bfc7a2567c38bb33 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Tue, 29 Apr 2003 16:52:44 +0000 Subject: sources from motex_1_1_3.tar.gz svn path=/trunk/externals/motex/; revision=603 --- pansig~.c | 136 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 136 insertions(+) create mode 100644 pansig~.c (limited to 'pansig~.c') diff --git a/pansig~.c b/pansig~.c new file mode 100644 index 0000000..346e94b --- /dev/null +++ b/pansig~.c @@ -0,0 +1,136 @@ +#include "m_pd.h" +#include + +static t_class *pansig_class; + +/* #define RADCONST 0.017453293 */ +#define RADCONST 0.785398163 +#define ROOT2DIV2 0.707106781 + +typedef struct _pansig +{ + t_object x_obj; + float x_f; + float pan; + float left; + float right; +} t_pansig; + +static void *pansig_new(t_symbol *s, int argc, t_atom *argv) +{ + t_pansig *x = (t_pansig *)pd_new(pansig_class); + inlet_new(&x->x_obj, &x->x_obj.ob_pd, &s_signal, &s_signal); + outlet_new(&x->x_obj, gensym("signal")); + outlet_new(&x->x_obj, gensym("signal")); + // inlet_new(&x->x_obj, &x->x_obj.ob_pd, gensym("float"), gensym("pansigf")); + + x->x_f = 0; + return (x); +} + +static void pansig_getpan(t_floatarg signal, t_floatarg *left, t_floatarg *right) +{ + double tmp, result; + double angle; + signal = signal < -1 ? -1 : signal; + signal = signal > 1 ? 1 : signal; + angle = signal * RADCONST; + *right = ROOT2DIV2 * (cos(angle) + sin(angle)); + *left = ROOT2DIV2 * (cos(angle) - sin(angle)); + +/* if(signal < 0) */ +/* signal = 0; */ +/* if(signal > 0.999) */ +/* signal = 0.999; */ +/* tmp = (tan(1.5866 * signal - 0.785398) + 1) / 2; */ +/* result = sqrt(tmp); */ +/* if (result < 0) */ +/* *right = 0; */ +/* else if (result > 1) */ +/* *right = 1; */ +/* else */ +/* *right = result; */ +/* tmp = tmp * -1 + 1; */ +/* if(tmp < 0) */ +/* tmp = 0; */ +/* result = sqrt(tmp); */ +/* if (result < 0) */ +/* *left = 0; */ +/* else if (result > 1) */ +/* *left = 1; */ +/* else */ +/* *left = result; */ +} + +static t_int *pansig_perform(t_int *w) +{ + float *in1 = (t_float *)(w[1]); + float *in2 = (t_float *)(w[2]); + float *out1 = (t_float *)(w[3]); + float *out2 = (t_float *)(w[4]); + int n = (int)(w[5]); + t_pansig *x = (t_pansig *)(w[6]); + float value, value2, left, right; + while (n--) + { + value = *in1++; + value2 = *in2++; + pansig_getpan(value2, &left, &right); +/* *out1++ = value * x->left; */ +/* *out2++ = value * x->right; */ + *out1++ = value * left; + *out2++ = value * right; +/* *out1++ = value; */ +/* *out2++ = value; */ + } + return (w+7); +} + +static void pansig_dsp(t_pansig *x, t_signal **sp) +{ + int n = sp[0]->s_n; + float *in1 = sp[0]->s_vec; + float *in2 = sp[1]->s_vec; + float *out1 = sp[2]->s_vec; + float *out2 = sp[3]->s_vec; + + dsp_add(pansig_perform, 6, + in1, in2, out1, out2, n, x); +} + +void pansig_f(t_pansig *x, t_floatarg f) +{ + double tmp, result; + if(f < 0) + f = 0; + if(f > 0.999) + f = 0.999; + tmp = (tan(1.5866 * f - 0.785398) + 1) / 2; + result = sqrt(tmp); + if (result < 0) + x->right = 0; + else if (result > 1) + x->right = 1; + else + x->right = result; + tmp = tmp * -1 + 1; + if(tmp < 0) + tmp = 0; + result = sqrt(tmp); + if (result < 0) + x->left = 0; + else if (result > 1) + x->left = 1; + else + x->left = result; +} + +void pansig_tilde_setup(void) +{ + pansig_class = class_new(gensym("pansig~"), (t_newmethod)pansig_new, 0, + sizeof(t_pansig), 0, A_GIMME, 0); + class_addmethod(pansig_class, nullfn, gensym("signal"), 0); + + class_addmethod(pansig_class, (t_method)pansig_dsp, gensym("dsp"), 0); + // class_addmethod(pansig_class, (t_method)pansig_f, gensym("pansigf"), A_FLOAT, 0); +} -- cgit v1.2.1