From 79096fd626b946efd6947fa94ab15d30bf003ba0 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Thu, 19 Aug 2010 05:04:28 +0000 Subject: converted to new library template and debianized svn path=/trunk/externals/ekext/; revision=13835 --- listmoses.c | 149 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 149 insertions(+) create mode 100644 listmoses.c (limited to 'listmoses.c') diff --git a/listmoses.c b/listmoses.c new file mode 100644 index 0000000..8426540 --- /dev/null +++ b/listmoses.c @@ -0,0 +1,149 @@ +/* listmoses - separate a list according to its contents' values + * Copyright (C) 2005 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 *listmoses_class; + +typedef struct _listmoses +{ + t_object x_obj; + t_atom lowlist[1024]; + t_atom midlist[1024]; + t_atom highlist[1024]; + t_atom lowamps[1024]; + t_atom midamps[1024]; + t_atom highamps[1024]; + t_atom ampslist[1024]; + t_float lowsplit, highsplit; + t_int low_argc, mid_argc, high_argc; + t_outlet *low_list, *mid_list, *high_list, *low_buddy, *mid_buddy, *high_buddy; +} t_listmoses; + +void listmoses_list(t_listmoses *x, t_symbol *s, int argc, t_atom *argv) +{ + float temp; + if (x->highsplit < x->lowsplit) + { + temp = x->highsplit; + x->highsplit = x->lowsplit; + x->lowsplit = temp; + } + float current, curamps; + int i; + x->low_argc = 0; + x->mid_argc = 0; + x->high_argc = 0; + for (i=0; iampslist); + if (current < x->lowsplit) + { + SETFLOAT(&x->lowlist[x->low_argc], current); + SETFLOAT(&x->lowamps[x->low_argc], curamps); + x->low_argc++; + } + else if (current >= x->lowsplit && current < x->highsplit) + { + SETFLOAT(&x->midlist[x->mid_argc], current); + SETFLOAT(&x->midamps[x->mid_argc], curamps); + x->mid_argc++; + } + else + { + SETFLOAT(&x->highlist[x->high_argc], current); + SETFLOAT(&x->highamps[x->high_argc], curamps); + x->high_argc++; + } + } + outlet_list(x->high_buddy, gensym("list"), x->high_argc, x->highamps); + outlet_list(x->mid_buddy, gensym("list"), x->mid_argc, x->midamps); + outlet_list(x->low_buddy, gensym("list"), x->low_argc, x->lowamps); + outlet_list(x->high_list, gensym("list"), x->high_argc, x->highlist); + outlet_list(x->mid_list, gensym("list"), x->mid_argc, x->midlist); + outlet_list(x->low_list, gensym("list"), x->low_argc, x->lowlist); +} + +void listmoses_amps(t_listmoses *x, t_symbol *s, int argc, t_atom *argv) +{ + float curamp; + int i; + for (i=0; iampslist[i], curamp); + } +} + +void listmoses_bang(t_listmoses *x) +{ + outlet_list(x->high_buddy, gensym("list"), x->high_argc, x->highamps); + outlet_list(x->mid_buddy, gensym("list"), x->mid_argc, x->midamps); + outlet_list(x->low_buddy, gensym("list"), x->low_argc, x->lowamps); + outlet_list(x->high_list, gensym("list"), x->high_argc, x->highlist); + outlet_list(x->mid_list, gensym("list"), x->mid_argc, x->midlist); + outlet_list(x->low_list, gensym("list"), x->low_argc, x->lowlist); +} + +void *listmoses_new(t_symbol *s, int argc, t_atom *argv) +{ + t_listmoses *x = (t_listmoses *)pd_new(listmoses_class); + x->highsplit = 96; + x->lowsplit = 36; +/* switch(argc) + { + default: + case 2: + x->highsplit = atom_getfloat(argv+1); + //x->lowsplit = atom_getfloat(argv); + case 1: + //x->highsplit = atom_getfloat(argv); + x->lowsplit = atom_getfloat(argv); + break; + case 0: + } */ // I don't know why it doesn't work with args! + + x->low_argc = 0; + x->mid_argc = 0; + x->high_argc = 0; + + x->low_list = outlet_new(&x->x_obj, gensym("list")); + x->mid_list = outlet_new(&x->x_obj, gensym("list")); + x->high_list = outlet_new(&x->x_obj, gensym("list")); + x->low_buddy = outlet_new(&x->x_obj, gensym("list")); + x->mid_buddy = outlet_new(&x->x_obj, gensym("list")); + x->high_buddy = outlet_new(&x->x_obj, gensym("list")); + inlet_new(&x->x_obj, &x->x_obj.ob_pd, &s_list, gensym("amps")); + floatinlet_new(&x->x_obj, &x->lowsplit); + floatinlet_new(&x->x_obj, &x->highsplit); + return (void *)x; +} + +void listmoses_setup(void) { + listmoses_class = class_new(gensym("listmoses"), + (t_newmethod)listmoses_new, + 0, sizeof(t_listmoses), + 0, A_DEFFLOAT, 0); + post("|<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>|"); + post("|<>|"); + post("|<<<<<<<<<<<>>>>>>>>>>>|"); + + class_addbang(listmoses_class, listmoses_bang); + class_addlist(listmoses_class, listmoses_list); + class_addmethod(listmoses_class, (t_method)listmoses_amps, gensym("amps"), A_GIMME, 0); +} -- cgit v1.2.1