From 67bc30104584a4a949f1ad02cecbdf7db5491049 Mon Sep 17 00:00:00 2001 From: Ed Kelly Date: Fri, 14 Sep 2007 15:26:42 +0000 Subject: This commit was generated by cvs2svn to compensate for changes in r8726, which included commits to RCS files with non-trunk default branches. svn path=/trunk/externals/ekext/; revision=8727 --- list_sum/help-list_sum.pd | 22 ++++++ list_sum/list_sum.c | 178 ++++++++++++++++++++++++++++++++++++++++++++++ list_sum/makefile | 105 +++++++++++++++++++++++++++ 3 files changed, 305 insertions(+) create mode 100644 list_sum/help-list_sum.pd create mode 100644 list_sum/list_sum.c create mode 100644 list_sum/makefile diff --git a/list_sum/help-list_sum.pd b/list_sum/help-list_sum.pd new file mode 100644 index 0000000..4b98f79 --- /dev/null +++ b/list_sum/help-list_sum.pd @@ -0,0 +1,22 @@ +#N canvas 0 0 520 251 10; +#X obj 84 137 list_sum; +#X floatatom 127 166 0 0 0 3 length - -; +#X floatatom 84 186 0 0 0 3 total - -; +#X msg 84 55 200.5 498 166.3 81.7 94.4; +#X msg 150 82 set 2 100; +#X msg 149 98 set 2 498; +#X msg 32 106 clear; +#X msg 149 121 set 5 777; +#X text 87 40 a list in the inlet calculates the sum of its elements. +; +#X text 215 81 individual elements can be set; +#X text 206 168 list_sum; +#X text 206 183 calculate the sum of elements in a list.; +#X text 207 198 Edward Kelly 2007; +#X connect 0 0 2 0; +#X connect 0 1 1 0; +#X connect 3 0 0 0; +#X connect 4 0 0 0; +#X connect 5 0 0 0; +#X connect 6 0 0 0; +#X connect 7 0 0 0; diff --git a/list_sum/list_sum.c b/list_sum/list_sum.c new file mode 100644 index 0000000..81aef40 --- /dev/null +++ b/list_sum/list_sum.c @@ -0,0 +1,178 @@ +/* list_sum - total sum of list values, with setting on each element independently + * Copyright (C) 2007 Edward Kelly + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include "m_pd.h" + +static t_class *list_sum_class; + +typedef struct _contents +{ + t_atom list[1024]; +} t_contents; + +typedef struct _list_sum +{ + t_object x_obj; + t_contents contents; + t_float total, highest, maxlen, wrap, reset, accum, remainder, firsttime; + t_outlet *sum, *length, *remains, *diff; +} t_list_sum; + +void list_sum_all(t_list_sum *x, int argc, t_atom *argv) +{ + argc = argc < 1024 ? argc : 1024; + int i, j, maxindex; + float current; + x->total = 0; + maxindex = argc > x->maxlen ? x->maxlen-1 : argc-1; + for(i=0;icontents.list[i], current); + if(i<=maxindex) + { + x->total += current; + } + else if (i > maxindex && x->wrap > x->maxlen && i < x->wrap) + { + j = i % (int)x->maxlen; + current = atom_getfloat(argv+j); + x->total += current; + } + } + x->highest = (float)argc-1; + outlet_float(x->length, (float)argc); + outlet_float(x->sum, x->total); +} + +void list_sum_set(t_list_sum *x, t_floatarg element, t_floatarg value) +{ + int i, j, indx, top; + float current; + if(element < 1024) + { + x->total = 0; + float f_indx = element-1; + indx = (int)f_indx; + x->highest = f_indx > x->highest ? f_indx : x->highest; + if(x->wrap <= x->maxlen) + { + top = x->highest >= x->maxlen ? x->maxlen : x->highest + 1; + } + else + { + top = x->highest >= x->wrap ? x->wrap : x->highest + 1; + } + SETFLOAT(&x->contents.list[indx], value); + for(i=0;imaxlen) + { + current = atom_getfloatarg(i, 1024, x->contents.list); + x->total += current; + } + else + { + j = i % (int)x->maxlen; + current = atom_getfloatarg(j, 1024, x->contents.list); + x->total += current; + } + } + outlet_float(x->length, x->highest+1); + outlet_float(x->sum, x->total); + } +} + +//next: list_sum_follow - clock based? +void list_sum_follow(t_list_sum *x, t_floatarg index, t_floatarg value) +{ + int i = (int) index; + if(index == (int)x->reset || x->firsttime == 1) + { + x->accum = 0; + x->remainder = total; + } + float current = atom_getfloatarg(i, 1024, x->contents.list); + float diff = value - current; + x->accum += diff; + outlet_float(x->diff, x->accum); + x->remainder -=current; + outlet_float(x->remains, x->remainder); + x->firsttime = 0; +} + + +void list_sum_clear(t_list_sum *x) +{ + int i; + for(i=0;i<1024;i++) + { + SETFLOAT(&x->contents.list[i], 0); + } + x->highest=0; + x->total=0; +} + +void list_sum_print(t_list_sum *x) +{ + int i; + float element; + for(i=0;i<=x->highest;i++) + { + element = atom_getfloatarg(i, 1024, x->contents.list); + post("%d ", element); + } +} + +void *list_sum_new(t_symbol *s, int argc, t_atom *argv) +{ + int i; + t_list_sum *x = (t_list_sum *)pd_new(list_sum_class); + x->total = 0; + x->highest = 0; + x->maxlen = 1024; + x->wrap = 1024; + x->firsttime = 1; + for(i=0;i<1024;i++) + { + SETFLOAT(&x->contents.list[i], 0); + } + floatinlet_new(&x->x_obj, &x->maxlen); + floatinlet_new(&x->x_obj, &x->wrap); + floatinlet_new(&x->x_obj, &x->reset); + x->sum = outlet_new(&x->x_obj, &s_float); + x->length = outlet_new(&x->x_obj, &s_float); + x->remains = outlet_new(&x->x_obj, &s_float); + x->diff = outlet_new(&x->x_obj, &s_float); + return (void *)x; +} + +void list_sum_setup(void) { + list_sum_class = class_new(gensym("list_sum"), + (t_newmethod)list_sum_new, + 0, sizeof(t_list_sum), + 0, A_DEFFLOAT, 0); + post("|<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>|"); + post("|<<>>|"); + post("|<<<<<<<<>>>>>>>>>|"); + class_sethelpsymbol(list_sum_class, gensym("help-list_sum")); + class_addmethod(list_sum_class, (t_method)list_sum_follow, gensym("follow"), A_DEFFLOAT, A_DEFFLOAT, 0); + class_addmethod(list_sum_class, (t_method)list_sum_all, gensym("all"), A_GIMME, 0); + class_addmethod(list_sum_class, (t_method)list_sum_clear, gensym("clear"), A_DEFFLOAT, 0); + class_addmethod(list_sum_class, (t_method)list_sum_print, gensym("print"), A_DEFFLOAT, 0); + class_addmethod(list_sum_class, (t_method)list_sum_set, gensym("set"), A_DEFFLOAT, A_DEFFLOAT, 0); +} diff --git a/list_sum/makefile b/list_sum/makefile new file mode 100644 index 0000000..9fd12f9 --- /dev/null +++ b/list_sum/makefile @@ -0,0 +1,105 @@ +current: + echo make pd_linux, pd_nt, pd_irix5, pd_irix6 or pd_darwin, then make install + +clean: ; rm -f *.pd_* *.o + +# ----------------------- NT ----------------------- + +pd_nt: list_sum.dll + +INSTALL_PREFIX="C:\pd\extra" +EXT=dll +.SUFFIXES: .obj .dll + +PDNTCFLAGS = /W3 /WX /DNT /DPD /nologo +VC="D:\Program Files\Microsoft Visual Studio\Vc98" + +PDNTINCLUDE = /I. /I\tcl\include /I..\..\src /I$(VC)\include + +PDNTLDIR = $(VC)\lib +PDNTLIB = $(PDNTLDIR)\libc.lib \ + $(PDNTLDIR)\oldnames.lib \ + $(PDNTLDIR)\kernel32.lib \ + ..\..\bin\pd.lib + +.c.dll: + cl $(PDNTCFLAGS) $(PDNTINCLUDE) /c $*.c + link /dll /export:$*_setup $*.obj $(PDNTLIB) + +# ----------------------- IRIX 5.x ----------------------- + +pd_irix5: list_sum.pd_irix5 + +INSTALL_PREFIX=/usr/local +EXT=pd_irix5 +.SUFFIXES: .pd_irix5 + +SGICFLAGS5 = -o32 -DPD -DUNIX -DIRIX -O2 + +SGIINCLUDE = -I/usr/local/include + +.c.pd_irix5: + cc $(SGICFLAGS5) $(SGIINCLUDE) -o $*.o -c $*.c + ld -elf -shared -rdata_shared -o $*.pd_irix5 $*.o + rm $*.o + +# ----------------------- IRIX 5.x ----------------------- + +pd_irix6: list_sum.pd_irix6 + +INSTALL_PREFIX=/usr/local +EXT=pd_irix6 +.SUFFIXES: .pd_irix6 + +SGICFLAGS5 = -o32 -DPD -DUNIX -DIRIX -O2 + +SGIINCLUDE = -I/usr/local/include + +.c.pd_irix6: + cc $(SGICFLAGS5) $(SGIINCLUDE) -o $*.o -c $*.c + ld -elf -shared -rdata_shared -o $*.pd_irix6 $*.o + rm $*.o + +# ----------------------- LINUX i386 ----------------------- + +pd_linux: list_sum.pd_linux + +INSTALL_PREFIX=/usr/local +EXT=pd_linux +.SUFFIXES: .pd_linux + +LINUXCFLAGS = -DPD -O2 -funroll-loops -fomit-frame-pointer \ + -Wall -W -Wshadow -Wstrict-prototypes -Werror \ + -Wno-unused -Wno-parentheses -Wno-switch + +LINUXINCLUDE = -I/usr/local/include + +.c.pd_linux: + cc $(LINUXCFLAGS) $(LINUXINCLUDE) -o $*.o -c $*.c + ld -export_dynamic -shared -o $*.pd_linux $*.o -lc -lm + strip --strip-unneeded $*.pd_linux + rm $*.o + +# ----------------------- Mac OSX ----------------------- + +pd_darwin: list_sum.pd_darwin + +INSTALL_PREFIX=/usr/local +EXT=pd_darwin +.SUFFIXES: .pd_darwin + +DARWINCFLAGS = -DPD -O2 -Wall -W -Wshadow -Wstrict-prototypes \ + -Wno-unused -Wno-parentheses -Wno-switch + +.c.pd_darwin: + cc $(DARWINCFLAGS) $(LINUXINCLUDE) -o $*.o -c $*.c + cc -bundle -undefined suppress -flat_namespace -o $*.pd_darwin $*.o + rm -f $*.o + +# ---------------------------------------------- + +install:: + install -d $(INSTALL_PREFIX)/lib/pd/extra +# install -m 644 *.$(EXT) $(INSTALL_PREFIX)/lib/pd/externs + -install -m 644 list_sum.$(EXT) $(INSTALL_PREFIX)/lib/pd/extra + install -m 644 *.pd $(INSTALL_PREFIX)/lib/pd/doc/5.reference -- cgit v1.2.1