From bfdde1b4c210e0bbb2aef6f6bce9eecea8286575 Mon Sep 17 00:00:00 2001 From: Ed Kelly Date: Tue, 18 Sep 2007 16:39:04 +0000 Subject: This commit was generated by cvs2svn to compensate for changes in r8733, which included commits to RCS files with non-trunk default branches. svn path=/trunk/externals/ekext/; revision=8734 --- maskxor/maskxor.c | 196 +++++++++++++++++++++++++++++++++++++++--------------- 1 file changed, 144 insertions(+), 52 deletions(-) (limited to 'maskxor/maskxor.c') diff --git a/maskxor/maskxor.c b/maskxor/maskxor.c index b75379f..e6d1f36 100755 --- a/maskxor/maskxor.c +++ b/maskxor/maskxor.c @@ -1,102 +1,192 @@ #include "m_pd.h" -#include -#define MAXENTRIES 512 static t_class *maskxor_class; -typedef struct _mask -{ - t_atom maskxor[MAXENTRIES]; - t_atom maskl[MAXENTRIES]; - t_atom maskr[MAXENTRIES]; -} t_mask; - typedef struct _maskxor { t_object x_obj; - t_mask masking; - t_float total; + t_atom *maskl, *maskr, *maskxor; + int lengthl, lengthr, lengthm; + t_float suml, sumr; t_float f_in, yes; - t_outlet *thru, *bool, *mask; + t_float mode; + t_outlet *thru, *bool, *maskout; } t_maskxor; void maskxor_float(t_maskxor *x, t_floatarg fin) { int input = (int)fin; - if(input>=0 && inputf_in = fin; - x->yes = atom_getfloatarg(input, MAXENTRIES, x->masking.maskxor); - outlet_float(x->bool, x->yes); - if(x->yes) outlet_float(x->thru, x->f_in); - } + if (input >= 0 && input < x->lengthm) { + if(x->mode == 0) + { + x->f_in = fin; + x->yes = atom_getfloatarg(input, x->lengthm, x->maskxor); + outlet_float(x->bool, x->yes); + if(x->yes != 0) + { + outlet_float(x->thru, x->f_in); + } + } + else if(x->sumr>x->suml) + { + x->f_in = fin; + x->yes = atom_getfloatarg(input, x->lengthm, x->maskxor); + outlet_float(x->bool, x->yes); + if(x->yes != 0) + { + outlet_float(x->thru, x->f_in); + } + } + } } void maskxor_bang(t_maskxor *x, t_symbol *s) { - outlet_list(x->mask, &s_list, x->total, x->masking.maskxor); + outlet_list(x->maskout, &s_list, x->lengthm, x->maskxor); outlet_float(x->bool, x->yes); - if(x->yes)outlet_float(x->thru, x->f_in); + if(x->yes != 0) + { + outlet_float(x->thru, x->f_in); + } } void maskxor_listl(t_maskxor *x, t_symbol *s, int argc, t_atom *argv) { int i; + x->suml = 0; float listr_element, listl_element, xor_element; - if(x->total < argc && argc < MAXENTRIES) x->total = argc; - for(i=0;itotal;i++) + if (x->maskl) { + freebytes(x->maskl, x->lengthl * sizeof(t_atom)); + x->maskl = 0; + x->lengthl = 0; + } + + x->maskl = copybytes(argv, argc * sizeof(t_atom)); + x->lengthl = argc; + + if (x->maskxor) { + freebytes(x->maskxor, x->lengthm * sizeof(t_atom)); + x->maskxor = 0; + x->lengthm = 0; + } + + x->maskxor = copybytes(argv, argc * sizeof(t_atom)); + x->lengthm = x->lengthl; + + for(i=0;imasking.maskl[i], listl_element); - listr_element = atom_getfloatarg(i,MAXENTRIES,x->masking.maskr); + if(listl_element != 0) + { + x->suml++; + } + if(i>=x->lengthr) + { + listr_element = 0; + } + else + { + listr_element = atom_getfloatarg(i,x->lengthr,x->maskr); + } xor_element = (float)((int)listl_element ^ (int)listr_element); - SETFLOAT(&x->masking.maskxor[i], xor_element); + SETFLOAT(&x->maskxor[i], xor_element); } - outlet_list(x->mask, &s_list, x->total, x->masking.maskxor); + outlet_list(x->maskout, &s_list, x->lengthm, x->maskxor); } void maskxor_listr(t_maskxor *x, t_symbol *s, int argc, t_atom *argv) { int i; + x->sumr = 0; + + if (x->maskr) { + freebytes(x->maskr, x->lengthr * sizeof(t_atom)); + x->maskr = 0; + x->lengthr = 0; + } + + x->maskr = copybytes(argv, argc * sizeof(t_atom)); + x->lengthr = argc; + + float listr_element; - if(x->total < argc && argc < MAXENTRIES) - { - x->total = argc; - } - for(i=0;itotal;i++) - { - listr_element = atom_getfloat(argv+i); - SETFLOAT(&x->masking.maskr[i], listr_element); - } + for(i=0;isumr++; + } + } +} + +void maskxor_mode(t_maskxor *x, t_floatarg fmode) +{ + x->mode = fmode; } void maskxor_clear(t_maskxor *x) { int i; - for(i=0;i<=MAXENTRIES;i++) - { - SETFLOAT(&x->masking.maskl[i], 0); - SETFLOAT(&x->masking.maskr[i], 0); - SETFLOAT(&x->masking.maskxor[i], 0); - } - x->total=1; + if (x->maskl) { + freebytes(x->maskl, x->lengthl * sizeof(t_atom)); + x->maskl = 0; + x->lengthl = 0; + } + if (x->maskr) { + freebytes(x->maskr, x->lengthr * sizeof(t_atom)); + x->maskr = 0; + x->lengthr = 0; + } + if (x->maskxor) { + freebytes(x->maskxor, x->lengthm * sizeof(t_atom)); + x->maskxor = 0; + x->lengthm = 0; + } + x->yes = x->f_in = 0; } -void *maskxor_new(t_symbol *s) +void maskxor_print(t_maskxor *x) { int i; - t_maskxor *x = (t_maskxor *)pd_new(maskxor_class); - x->total = 1; - for(i=0;imasking.maskr[i], 0); - SETFLOAT(&x->masking.maskl[i], 0); - SETFLOAT(&x->masking.maskxor[i], 0); + float element; + if (x->maskl) { + for(i=0;ilengthl;i++) { + element = atom_getfloatarg(i, x->lengthl, x->maskl); + post("maskl element %d = %f",i,element); + } + } + if (x->maskr) { + for(i=0;ilengthr;i++) { + element = atom_getfloatarg(i, x->lengthr, x->maskr); + post("maskr element %d = %f",i,element); } + } + if (x->maskxor) { + for(i=0;ilengthm;i++) { + element = atom_getfloatarg(i, x->lengthm, x->maskxor); + post("maskxor element %d = %f",i,element); + } + } + post("mode = %f",x->mode); +} + +void *maskxor_new(t_symbol *s, t_floatarg fmode) +{ + int i; + t_maskxor *x = (t_maskxor *)pd_new(maskxor_class); + x->mode = fmode != 0 ? 1 : 0; + + x->maskl = 0; + x->lengthl = 0; + x->maskr = 0; + x->lengthr = 0; + x->maskxor = 0; + x->lengthm = 0; + x->thru = outlet_new(&x->x_obj, &s_float); x->bool = outlet_new(&x->x_obj, &s_float); - x->mask = outlet_new(&x->x_obj, &s_list); + x->maskout = outlet_new(&x->x_obj, &s_list); return (void *)x; } @@ -114,5 +204,7 @@ void maskxor_setup(void) class_addmethod(maskxor_class, (t_method)maskxor_listl, gensym("listl"), A_GIMME, 0, 0); class_addmethod(maskxor_class, (t_method)maskxor_listr, gensym("listr"), A_GIMME, 0, 0); class_addbang(maskxor_class, (t_method)maskxor_bang); + class_addmethod(maskxor_class, (t_method)maskxor_mode, gensym("mode"), A_DEFFLOAT, 0); class_addmethod(maskxor_class, (t_method)maskxor_clear, gensym("clear"), A_DEFFLOAT, 0); + class_addmethod(maskxor_class, (t_method)maskxor_print, gensym("print"), A_DEFFLOAT, 0); } -- cgit v1.2.1