From 01314ebc83191b68a8b4b31b7b9efbf531f3b1d9 Mon Sep 17 00:00:00 2001 From: Jamie Bullock Date: Tue, 10 Jan 2006 11:49:01 +0000 Subject: This commit was generated by cvs2svn to compensate for changes in r4382, which included commits to RCS files with non-trunk default branches. svn path=/trunk/externals/postlude/; revision=4383 --- flib/src/trist~.c | 92 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 92 insertions(+) create mode 100644 flib/src/trist~.c (limited to 'flib/src/trist~.c') diff --git a/flib/src/trist~.c b/flib/src/trist~.c new file mode 100644 index 0000000..93fd3b9 --- /dev/null +++ b/flib/src/trist~.c @@ -0,0 +1,92 @@ +/* flib - PD library for feature extraction +Copyright (C) 2005 Jamie Bullock + +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 Street, Fifth Floor, Boston, MA 02110-1301, USA. +*/ + + + +/* calculates tristimulus of one frame according to method outlined by Pollard and Jansson. First argument determines method used (x,y, or z) */ + +#include "flib.h" +static t_class *trist_class; + +typedef struct _trist { + t_object x_obj; + t_float f,x; + t_symbol *t; +} t_trist; + +static t_int *trist_perform(t_int *w) +{ + t_sample *in = (t_sample *)(w[1]); + t_trist *x = (t_trist *)(w[2]); + t_int N = (t_int)(w[3]),M = (N >> 1) - 1,n,i = 0; + t_float T, A = 0,p1 = 0,p2 = 0,p3 = 0,p4 = 0,p5 = 0; + + for(n = 0; n < M; n++){ + A += in[n]; + if (in[n] != 0 && i < 5){ + switch(i){ + case 4: p5 = in[n]; i++; + break; + case 3: p4 = in[n]; i++; + break; + case 2: p3 = in[n]; i++; + break; + case 1: p2 = in[n]; i++; + break; + case 0: p1 = in[n]; i++; + break; + } + } + } + if (*x->t->s_name == 'z') + T = p1 / A; + else if (*x->t->s_name == 'y') + T = (p2 + p3 + p4) / A; + else + T = (A - p1 + p2 + p3 + p4 + p5) / A; + + outlet_float(x->x_obj.ob_outlet, T); + return (w+4); +} + +static void trist_dsp(t_trist *x, t_signal **sp) +{ + dsp_add(trist_perform, 3, + sp[0]->s_vec, x, sp[0]->s_n); +} + +static void *trist_new(t_symbol *s) +{ + t_trist *x = (t_trist *)pd_new(trist_class); + x->t = s; + outlet_new(&x->x_obj, &s_float); + return (void *)x; +} + + +void trist_tilde_setup(void) { + trist_class = class_new(gensym("trist~"), + (t_newmethod)trist_new, + 0, sizeof(t_trist), + CLASS_DEFAULT, A_DEFSYMBOL, 0); + + class_addmethod(trist_class, + (t_method)trist_dsp, gensym("dsp"), 0); + CLASS_MAINSIGNALIN(trist_class, t_trist,f); + class_sethelpsymbol(trist_class, gensym("help-flib")); +} -- cgit v1.2.1