From d962ed33f6b5fe3040cfbd798f63ab9aa36d1f9e Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Thu, 25 May 2006 16:40:19 +0000 Subject: renamed files to match their class names svn path=/trunk/externals/creb/; revision=5127 --- modules/statwav~.c | 153 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 153 insertions(+) create mode 100644 modules/statwav~.c (limited to 'modules/statwav~.c') diff --git a/modules/statwav~.c b/modules/statwav~.c new file mode 100644 index 0000000..13d9c9f --- /dev/null +++ b/modules/statwav~.c @@ -0,0 +1,153 @@ +/* + * dynwav.c - static wavetable oscillator (scale + tabread) + * data organization is in (real, imag) pairs + * the first 2 components are (DC, NY) + * Copyright (c) 2000-2003 by Tom Schouten + * + * 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., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#include "m_pd.h" +#include +#include +#include +#include + +static t_class *statwav_tilde_class; + +typedef struct _statwav_tilde +{ + t_object x_obj; + int x_npoints; + float *x_vec; + t_symbol *x_arrayname; + float x_f; +} t_statwav_tilde; + +static void *statwav_tilde_new(t_symbol *s) +{ + t_statwav_tilde *x = (t_statwav_tilde *)pd_new(statwav_tilde_class); + x->x_arrayname = s; + x->x_vec = 0; + outlet_new(&x->x_obj, gensym("signal")); + x->x_f = 0; + return (x); +} + +static t_int *statwav_tilde_perform(t_int *w) +{ + t_statwav_tilde *x = (t_statwav_tilde *)(w[1]); + t_float *in = (t_float *)(w[2]); + t_float *out = (t_float *)(w[3]); + int n = (int)(w[4]); + float maxindex; + int imaxindex; + float *buf = x->x_vec, *fp; + int i; + + maxindex = x->x_npoints; + imaxindex = x->x_npoints; + + if (!buf) goto zero; + + + for (i = 0; i < n; i++) + { + float phase = *in++; + float modphase = phase - (int)phase; + float findex; + int index; + int ia, ib, ic, id; + float frac, a, b, c, d, cminusb; + static int count; + + if (modphase < 0.0f) modphase += 1.0f; + findex = modphase * maxindex; + index = findex; + + + frac = findex - index; + ia = (imaxindex+index-1) % imaxindex; + ib = index; + ic = (index+1) % imaxindex; + id = (index+2) % imaxindex; + + a = buf[ia]; + b = buf[ib]; + c = buf[ic]; + d = buf[id]; + /* if (!i && !(count++ & 1023)) + post("fp = %lx, shit = %lx, b = %f", fp, buf->b_shit, b); */ + cminusb = c-b; + + *out++ = b + frac * ( + cminusb - 0.5f * (frac-1.) * ( + (a - d + 3.0f * cminusb) * frac + (b - a - cminusb) + ) + ); + } + + return (w+5); + zero: + while (n--) *out++ = 0; + + return (w+5); +} + +static void statwav_tilde_set(t_statwav_tilde *x, t_symbol *s) +{ + t_garray *a; + + x->x_arrayname = s; + if (!(a = (t_garray *)pd_findbyclass(x->x_arrayname, garray_class))) + { + if (*s->s_name) + error("statwav~: %s: no such array", x->x_arrayname->s_name); + x->x_vec = 0; + } + else if (!garray_getfloatarray(a, &x->x_npoints, &x->x_vec)) + { + error("%s: bad template for statwav~", x->x_arrayname->s_name); + x->x_vec = 0; + } + else garray_usedindsp(a); +} + +static void statwav_tilde_dsp(t_statwav_tilde *x, t_signal **sp) +{ + statwav_tilde_set(x, x->x_arrayname); + + dsp_add(statwav_tilde_perform, 4, x, + sp[0]->s_vec, sp[1]->s_vec, sp[0]->s_n); + +} + +static void statwav_tilde_free(t_statwav_tilde *x) +{ +} + +void statwav_tilde_setup(void) +{ + //post("statwav~ v0.1"); + statwav_tilde_class = class_new(gensym("statwav~"), + (t_newmethod)statwav_tilde_new, (t_method)statwav_tilde_free, + sizeof(t_statwav_tilde), 0, A_DEFSYM, 0); + CLASS_MAINSIGNALIN(statwav_tilde_class, t_statwav_tilde, x_f); + class_addmethod(statwav_tilde_class, (t_method)statwav_tilde_dsp, + gensym("dsp"), 0); + class_addmethod(statwav_tilde_class, (t_method)statwav_tilde_set, + gensym("set"), A_SYMBOL, 0); +} + -- cgit v1.2.1