diff options
author | IOhannes m zmölnig <zmoelnig@users.sourceforge.net> | 2007-10-31 10:26:11 +0000 |
---|---|---|
committer | IOhannes m zmölnig <zmoelnig@users.sourceforge.net> | 2007-10-31 10:26:11 +0000 |
commit | 2de6b6c4318ecdff9461f24f74b0a57a46d459dd (patch) | |
tree | 4f41c19583ff84c293b394059e4c829a69c5829d | |
parent | d4b37914b7f2218bd2be75178722bf625e06bb8f (diff) |
added [tabread4~~] for higher-precision tabread
svn path=/trunk/externals/zexy/; revision=8914
-rwxr-xr-x | src/makesource.sh | 2 | ||||
-rw-r--r-- | src/multiplex.c | 2 | ||||
-rw-r--r-- | src/tabread4~~.c | 164 | ||||
-rw-r--r-- | src/z_zexy.c | 1 | ||||
-rw-r--r-- | src/z_zexy.h | 1 |
5 files changed, 168 insertions, 2 deletions
diff --git a/src/makesource.sh b/src/makesource.sh index 3e29540..5caafeb 100755 --- a/src/makesource.sh +++ b/src/makesource.sh @@ -58,7 +58,7 @@ do ## any non-alpha-numeric-character is replaced by "_" ## e.g. "multiplex~.c" -> "z_multiplex__setup()" i=${f%.c} - SETUPNAME=$(echo $i | sed -e "s/.*0x.*/setup_&/g" -e "s/~$/_tilde/g" -e "/0x/! s/.*/&_setup/") + SETUPNAME=$(echo $i | sed -e "s/.*0x.*/setup_&/g" -e "s/~/_tilde/g" -e "/0x/! s/.*/&_setup/") if grep -w ${SETUPNAME} $f > /dev/null; then echo "void ${SETUPNAME}(void); /* $i */" >> $ZEXY_H echo " ${SETUPNAME}(); /* $i */" >> $ZEXY_C diff --git a/src/multiplex.c b/src/multiplex.c index 8f65ee6..05849ea 100644 --- a/src/multiplex.c +++ b/src/multiplex.c @@ -118,7 +118,7 @@ void multiplex_setup(void) class_addmethod (mux_class, (t_method)mux_select, gensym(""), A_DEFFLOAT, 0); - muxproxy_class = class_new(gensym("mux proxy"), 0, 0, + muxproxy_class = class_new(0, 0, 0, sizeof(t_muxproxy), CLASS_PD | CLASS_NOINLET, 0); class_addanything(muxproxy_class, mux_anything); diff --git a/src/tabread4~~.c b/src/tabread4~~.c new file mode 100644 index 0000000..dbcf4bf --- /dev/null +++ b/src/tabread4~~.c @@ -0,0 +1,164 @@ +/****************************************************** + * + * zexy - implementation file + * + * copyleft (c) IOhannes m zm-bölnig-A + * + * 1999:forum::f-bür::umläute:2007-A + * + * institute of electronic music and acoustics (iem) + * + ****************************************************** + * + * license: GNU General Public License v.2 + * + ******************************************************/ + +/* based on tabread4~ which is part of pd */ + +#include "zexy.h" + +/******************** tabread4~~ ***********************/ + + +static t_class *tabread4_tilde_class; + +#ifdef Z_USE_WORD_ARRAYS +# define zarray_t t_word +# define zarray_getarray garray_getfloatwords +# define zarray_getfloat(pointer, index) (pointer[index].w_float) +#else +# define zarray_t t_float +# define zarray_getarray garray_getfloatarray +# define zarray_getfloat(pointer, index) (pointer[index]) +#endif + + +typedef struct _tabread4_tilde +{ + t_object x_obj; + int x_npoints; + zarray_t *x_vec; + t_symbol *x_arrayname; + t_float x_f; +} t_tabread4_tilde; + +static void *tabread4_tilde_new(t_symbol *s) +{ + t_tabread4_tilde *x = (t_tabread4_tilde *)pd_new(tabread4_tilde_class); + x->x_arrayname = s; + x->x_vec = 0; + x->x_npoints=0; + + inlet_new(&x->x_obj, &x->x_obj.ob_pd, &s_signal, &s_signal); + outlet_new(&x->x_obj, &s_signal); + x->x_f = 0; + return (x); +} + +static t_int *tabread4_tilde_perform(t_int *w) +{ + t_tabread4_tilde *x = (t_tabread4_tilde *)(w[1]); + t_sample *in = (t_sample *)(w[2]); + t_sample *in1 = (t_sample *)(w[3]); + t_sample *out = (t_sample *)(w[4]); + int n = (int)(w[5]); + int maxindex; + zarray_t *buf = x->x_vec, *wp; + int i; + + maxindex = x->x_npoints - 3; + if (!buf){ + while (n--) *out++ = 0; + return (w+6); + } + // post("xxx"); + for (i = 0; i < n; i++) + { + t_sample in0_s=*in++; + t_sample in1_s=*in1++; + double findex = (double)in0_s + (double)in1_s; + long int index = findex; + double frac; + t_sample a, b, c, d, cminusb; + if (index < 1) + index = 1, frac = 0; + else if (index > maxindex) + index = maxindex, frac = 1; + else frac = findex - index; + + //post("%f + %f = %f", in0_s, in1_s, findex); + // post("%f - %f = %d", findex, frac, index); + + wp = buf + index; + + a = zarray_getfloat(wp,-1); + b = zarray_getfloat(wp, 0); + c = zarray_getfloat(wp, 1); + d = zarray_getfloat(wp, 2); + + cminusb = c-b; + *out++ = b + frac * ( + cminusb - 0.1666667f * (1.-frac) * ( + (d - a - 3.0f * cminusb) * frac + (d + 2.0f*a - 3.0f*b) + ) + ); + } + return (w+6); +} + +static void tabread4_tilde_set(t_tabread4_tilde *x, t_symbol *s) +{ + t_garray *a; + + x->x_arrayname = s; + if (!(a = (t_garray *)pd_findbyclass(x->x_arrayname, garray_class))) + { + if (*s->s_name) + pd_error(x, "tabread4~~: %s: no such array", x->x_arrayname->s_name); + x->x_vec = 0; + } + else if (!zarray_getarray(a, &x->x_npoints, &x->x_vec)) + { + pd_error(x, "%s: bad template for tabread4~~", x->x_arrayname->s_name); + x->x_vec = 0; + } + else garray_usedindsp(a); +} + +static void tabread4_tilde_dsp(t_tabread4_tilde *x, t_signal **sp) +{ + tabread4_tilde_set(x, x->x_arrayname); + + dsp_add(tabread4_tilde_perform, 5, x, + sp[0]->s_vec, sp[1]->s_vec, sp[2]->s_vec, sp[0]->s_n); + +} + +static void tabread4_tilde_free(t_tabread4_tilde *x) +{ +} + +void tabread4_tilde_tilde_setup(void) +{ + tabread4_tilde_class = class_new(gensym("tabread4~~"), + (t_newmethod)tabread4_tilde_new, (t_method)tabread4_tilde_free, + sizeof(t_tabread4_tilde), 0, A_DEFSYM, 0); + CLASS_MAINSIGNALIN(tabread4_tilde_class, t_tabread4_tilde, x_f); + class_addmethod(tabread4_tilde_class, (t_method)tabread4_tilde_dsp, + gensym("dsp"), 0); + class_addmethod(tabread4_tilde_class, (t_method)tabread4_tilde_set, + gensym("set"), A_SYMBOL, 0); + + zexy_register("tabread4~~"); +} + +void setup_tabread40x7e_tilde(void) +{ + tabread4_tilde_tilde_setup(); +} + +void setup_tabread40x7e0x7e(void) +{ + tabread4_tilde_tilde_setup(); +} diff --git a/src/z_zexy.c b/src/z_zexy.c index a02063b..0297b29 100644 --- a/src/z_zexy.c +++ b/src/z_zexy.c @@ -76,6 +76,7 @@ void z_zexy_setup(void) symbol2list_setup(); /* symbol2list */ tabdump_setup(); /* tabdump */ tabminmax_setup(); /* tabminmax */ + tabread4_tilde_tilde_setup(); /* tabread4~~ */ tabset_setup(); /* tabset */ tavg_tilde_setup(); /* tavg~ */ time_setup(); /* time */ diff --git a/src/z_zexy.h b/src/z_zexy.h index 686c612..518cb62 100644 --- a/src/z_zexy.h +++ b/src/z_zexy.h @@ -74,6 +74,7 @@ void swap_tilde_setup(void); /* swap~ */ void symbol2list_setup(void); /* symbol2list */ void tabdump_setup(void); /* tabdump */ void tabminmax_setup(void); /* tabminmax */ +void tabread4_tilde_tilde_setup(void); /* tabread4~~ */ void tabset_setup(void); /* tabset */ void tavg_tilde_setup(void); /* tavg~ */ void time_setup(void); /* time */ |