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 --- simile.c | 69 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 69 insertions(+) create mode 100644 simile.c (limited to 'simile.c') diff --git a/simile.c b/simile.c new file mode 100644 index 0000000..5ac1ac5 --- /dev/null +++ b/simile.c @@ -0,0 +1,69 @@ +/* + * simile : windowed similarity comparison + * 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" + +typedef struct _simile { + t_object x_obj; + t_float x_win; + t_float min; + t_float sign; + t_float x_in1; + t_float x_in2; + t_float x_result; + t_outlet *x_sim, *x_sign; +} t_simile; + +void simile_float(t_simile *x, t_floatarg in1) { + x->x_in1 = in1; + x->x_win = x->x_win > 0 ? x->x_win : 0.01; /* defaults to 0.01 so that we avoid /0 errors */ + x->min = ( x->x_in1 > x->x_in2 ) ? (x->x_in1 - x->x_in2) : (x->x_in2 - x->x_in1); + x->sign = ( x->x_in1 >= x->x_in2 ) ? 1 : -1; + x->x_result = 1 / ((x->min / x->x_win) + 1); + outlet_float(x->x_sign, x->sign); + outlet_float(x->x_sim, x->x_result); +} + +void simile_bang(t_simile *x) { + outlet_float(x->x_sign, x->sign); + outlet_float(x->x_sim, x->x_result); +} + +t_class *simile_class; + +void *simile_new(t_floatarg x_win) { + t_simile *x = (t_simile *)pd_new(simile_class); + x->x_sim = outlet_new(&x->x_obj, gensym("float")); + x->x_sign = outlet_new(&x->x_obj, gensym("float")); + floatinlet_new(&x->x_obj, &x->x_in2); + floatinlet_new(&x->x_obj, &x->x_win); + return (void *)x; +} + +void simile_setup(void) { + simile_class = class_new(gensym("simile"), + (t_newmethod)simile_new, + 0, sizeof(t_simile), + 0, A_DEFFLOAT, 0); + post("|------------->simile<--------------|"); + post("|->weighted similarity measurement<-|"); + post("|-->edward<----->kelly<----->2005<--|"); + + class_addbang(simile_class, simile_bang); + class_addfloat(simile_class, simile_float); +} -- cgit v1.2.1