diff options
author | IOhannes m zmölnig <zmoelnig@users.sourceforge.net> | 2008-02-08 13:00:32 +0000 |
---|---|---|
committer | IOhannes m zmölnig <zmoelnig@users.sourceforge.net> | 2008-02-08 13:00:32 +0000 |
commit | 4d84d14ac1aa13958eaa2971b03f7f929a519105 (patch) | |
tree | 6579d3f2cea5410a10c4baac8d0f372fb0dff372 /desiredata/extra/lrshift~ | |
parent | b334d38aefbd8e0e159d7af6c20d63c5d2b64859 (diff) |
reorganized
svn path=/trunk/; revision=9400
Diffstat (limited to 'desiredata/extra/lrshift~')
-rw-r--r-- | desiredata/extra/lrshift~/lrshift~.c | 74 | ||||
-rw-r--r-- | desiredata/extra/lrshift~/makefile | 4 |
2 files changed, 78 insertions, 0 deletions
diff --git a/desiredata/extra/lrshift~/lrshift~.c b/desiredata/extra/lrshift~/lrshift~.c new file mode 100644 index 00000000..ba1d5eeb --- /dev/null +++ b/desiredata/extra/lrshift~/lrshift~.c @@ -0,0 +1,74 @@ +#include "m_pd.h" + +/* ------------------------ lrshift~ ----------------------------- */ + +static t_class *lrshift_tilde_class; + +typedef struct _lrshift_tilde +{ + t_object x_obj; + int x_n; +} t_lrshift_tilde; + +static t_int *leftshift_perform(t_int *w) +{ + t_float *in = (t_float *)(w[1]); + t_float *out= (t_float *)(w[2]); + int n = (int)(w[3]); + int shift = (int)(w[4]); + in += shift; + n -= shift; + while (n--) + *out++ = *in++; + while (shift--) + *out++ = 0; + return (w+5); +} + +static t_int *rightshift_perform(t_int *w) +{ + t_float *in = (t_float *)(w[1]); + t_float *out= (t_float *)(w[2]); + int n = (int)(w[3]); + int shift = (int)(w[4]); + n -= shift; + in -= shift; + while (n--) + *--out = *--in; + while (shift--) + *--out = 0; + return (w+5); +} + +static void lrshift_tilde_dsp(t_lrshift_tilde *x, t_signal **sp) +{ + int n = sp[0]->s_n; + int shift = x->x_n; + if (shift > n) + shift = n; + if (shift < -n) + shift = -n; + if (shift < 0) + dsp_add(rightshift_perform, 4, + sp[0]->s_vec + n, sp[1]->s_vec + n, n, -shift); + else dsp_add(leftshift_perform, 4, + sp[0]->s_vec, sp[1]->s_vec, n, shift); +} + +static void *lrshift_tilde_new(t_floatarg f) +{ + t_lrshift_tilde *x = (t_lrshift_tilde *)pd_new(lrshift_tilde_class); + x->x_n = f; + outlet_new(&x->x_obj, gensym("signal")); + return (x); +} + +void lrshift_tilde_setup(void) +{ + lrshift_tilde_class = class_new(gensym("lrshift~"), + (t_newmethod)lrshift_tilde_new, 0, sizeof(t_lrshift_tilde), 0, + A_DEFFLOAT, 0); + class_addmethod(lrshift_tilde_class, nullfn, gensym("signal"), 0); + class_addmethod(lrshift_tilde_class, (t_method)lrshift_tilde_dsp, + gensym("dsp"), 0); +} diff --git a/desiredata/extra/lrshift~/makefile b/desiredata/extra/lrshift~/makefile new file mode 100644 index 00000000..d6a24cfe --- /dev/null +++ b/desiredata/extra/lrshift~/makefile @@ -0,0 +1,4 @@ +NAME=lrshift~ +CSYM=lrshift_tilde + +include ../makefile |