diff options
author | Hans-Christoph Steiner <eighthave@users.sourceforge.net> | 2006-05-25 16:40:19 +0000 |
---|---|---|
committer | Hans-Christoph Steiner <eighthave@users.sourceforge.net> | 2006-05-25 16:40:19 +0000 |
commit | d962ed33f6b5fe3040cfbd798f63ab9aa36d1f9e (patch) | |
tree | f700234efa8d57c28ce9be56e0db5f6526921fbe /modules/dynwav.c | |
parent | 2994949cca515f63fb82fa1d114ce07eb213220d (diff) |
renamed files to match their class names
svn path=/trunk/externals/creb/; revision=5127
Diffstat (limited to 'modules/dynwav.c')
-rw-r--r-- | modules/dynwav.c | 318 |
1 files changed, 0 insertions, 318 deletions
diff --git a/modules/dynwav.c b/modules/dynwav.c deleted file mode 100644 index 9157f12..0000000 --- a/modules/dynwav.c +++ /dev/null @@ -1,318 +0,0 @@ -/* - * blosc.c - bandlimited oscillators - * 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 <math.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> - -#define MAXORDER 1024 - -typedef struct dynwavctl -{ - t_float *c_buf1; /* current */ - t_float *c_buf2; /* old */ - t_int c_order; - -} t_dynwavctl; - -typedef struct dynwav -{ - t_object x_obj; - t_float x_f; - t_dynwavctl x_ctl; -} t_dynwav; - - -static t_int *dynwav_perform(t_int *w) -{ - - - t_float *wave = (float *)(w[3]); - t_float *freq = (float *)(w[4]); - t_float *out = (float *)(w[5]); - t_dynwavctl *ctl = (t_dynwavctl *)(w[1]); - t_int n = (t_int)(w[2]); - - t_float *buf, *dbuf, *swap; - - int i; - int mask = n-1; - - - /* swap buffer pointers */ - swap = ctl->c_buf1; /* this is the last one stored */ - buf = ctl->c_buf1 = ctl->c_buf2; /* put oldest in newest to overwrite */ - dbuf = ctl->c_buf2 = swap; /* put last one in oldest */ - - - if (buf && dbuf) - { - - /* store input wavetable in buffer */ - memcpy(buf, wave, n*sizeof(t_float)); - - - for (i = 0; i < n; i++) - { - float findex = *freq++ * (t_float)n; - int index = findex; - float frac, a, b, c, d, cminusb, q, r; - int ia, ib, ic, id; - - frac = findex - index; - - ia = (index-1) & mask; - ib = (index ) & mask; - ic = (index+1) & mask; - id = (index+2) & mask; - - q = i+1; - q /= n; - - r = n-1-i; - r /= n; - - /* get 4 points, wrap index */ - a = q * buf[ia] + r * dbuf[ia]; - b = q * buf[ib] + r * dbuf[ib]; - c = q * buf[ic] + r * dbuf[ic]; - d = q * buf[id] + r * dbuf[id]; - - cminusb = c-b; - *out++ = b + frac * (cminusb - 0.5f * (frac-1.) * - ((a - d + 3.0f * cminusb) * frac + - (b - a - cminusb))); - } - - } - return (w+6); -} - -static t_int *dynwav_perform_8point(t_int *w) /* werkt nog nie tegoei */ -{ - - - t_float *wave = (float *)(w[3]); - t_float *freq = (float *)(w[4]); - t_float *out = (float *)(w[5]); - t_dynwavctl *ctl = (t_dynwavctl *)(w[1]); - t_int n = (t_int)(w[2]); - - t_float *buf, *dbuf, *swap; - - int i; - int mask = n-1; - - - /* swap buffer pointers */ - swap = ctl->c_buf1; /* this is the last one stored */ - buf = ctl->c_buf1 = ctl->c_buf2; /* put oldest in newest to overwrite */ - dbuf = ctl->c_buf2 = swap; /* put last one in oldest */ - - - if (buf && dbuf) - { - - /* const float N1 = 1 / ( 2 * (1-(1/9)) * (1-(1/25)) * (1-(1/49)) ); - ** const float N2 = 1 / ( (1-(9)) * 2 * (1-(9/25)) * (1-(9/49)) ); - ** const float N3 = 1 / ( (1-(25)) * (1-(25/9)) * 2 * (1-(25/49)) ); - ** const float N4 = 1 / ( (1-(49)) * (1-(49/9)) * (1-(49/25)) * 2 ); - */ - - const float N1 = 0.59814453125; - const float N2 = -0.11962890625; - const float N3 = 0.02392578125; - const float N4 = -0.00244140625; - - - /* store input wavetable in buffer */ - memcpy(buf, wave, n*sizeof(t_float)); - - - for (i = 0; i < n; i++) - { - float findex = *freq++ * (t_float)n; - int index = findex; - float frac, q, r, fm, fp, fe, fo; - float x1, x2, x3, x4; - float g1, g2, g3, g4; - float gg, g2g3g4, g1g3g4, g1g2g4, g1g2g3; - float acc; - int im, ip; - - frac = 2 *(findex - index) - 1; - - x1 = frac; - x2 = frac/3; - x3 = frac/5; - x4 = frac/7; - - g1 = 1 - x1*x1; - g2 = 1 - x2*x2; - g3 = 1 - x3*x3; - g4 = 1 - x4*x4; - - gg = g3 * g4; - g2g3g4 = g2 * gg; /* 1 */ - g1g3g4 = g1 * gg; /* 2 */ - gg = g1 * g2; - g1g2g4 = g4 * gg; /* 3 */ - g1g2g3 = g3 * gg; /* 4 */ - - - /* triangle interpolation between current and past wavetable*/ - q = i+1; - q /= n; - - r = n-1-i; - r /= n; - - - /* 1, -1*/ - im = (index ) & mask; - ip = (index+1) & mask; - fm = q * buf[im] + r * dbuf[im]; - fp = q * buf[ip] + r * dbuf[ip]; - fe = fp + fm; - fo = fp - fm; - - acc = N1 * g2g3g4 * (fe + x1*fo); - - /* 2, -2 */ - im = (index-1) & mask; - ip = (index+2) & mask; - fm = q * buf[im] + r * dbuf[im]; - fp = q * buf[ip] + r * dbuf[ip]; - fe = fp + fm; - fo = fp - fm; - - acc += N2 * g1g3g4 * (fe + x2*fo); - - /* 3, -3 */ - im = (index-2) & mask; - ip = (index+3) & mask; - fm = q * buf[im] + r * dbuf[im]; - fp = q * buf[ip] + r * dbuf[ip]; - fe = fp + fm; - fo = fp - fm; - - acc += N3 * g1g2g4 * (fe + x3*fo); - - /* 4, -4 */ - im = (index-3) & mask; - ip = (index+4) & mask; - fm = q * buf[im] + r * dbuf[im]; - fp = q * buf[ip] + r * dbuf[ip]; - fe = fp + fm; - fo = fp - fm; - - acc += N4 * g1g2g3 * (fe + x4*fo); - - - *out++ = acc; - - } - - } - return (w+6); -} - - -static void dynwav_dsp(t_dynwav *x, t_signal **sp) -{ - int n = sp[0]->s_n; - int k; - - if (x->x_ctl.c_order != n) - { - if (x->x_ctl.c_buf1) free (x->x_ctl.c_buf1); - if (x->x_ctl.c_buf2) free (x->x_ctl.c_buf2); - - x->x_ctl.c_buf1 = (t_float *)malloc(n*sizeof(t_float)); - x->x_ctl.c_buf2 = (t_float *)malloc(n*sizeof(t_float)); - - for(k=0; k<n; k++) - { - x->x_ctl.c_buf1[k] = 0; - x->x_ctl.c_buf2[k] = 0; - } - - x->x_ctl.c_order = n; - } - - - dsp_add(dynwav_perform_8point, 5, &x->x_ctl, sp[0]->s_n, sp[0]->s_vec, sp[1]->s_vec, sp[2]->s_vec); - - -} -static void dynwav_free(t_dynwav *x) -{ - - if (x->x_ctl.c_buf1) free (x->x_ctl.c_buf1); - if (x->x_ctl.c_buf2) free (x->x_ctl.c_buf2); - -} - -t_class *dynwav_class; - -static void *dynwav_new(t_floatarg order) -{ - t_dynwav *x = (t_dynwav *)pd_new(dynwav_class); - int iorder = (int)order; - int i, n=64, k; - - /* in 2 */ - inlet_new(&x->x_obj, &x->x_obj.ob_pd, gensym("signal"), gensym("signal")); - - /* out 1 */ - outlet_new(&x->x_obj, gensym("signal")); - - - - /* init data */ - x->x_ctl.c_buf1 = (t_float *)malloc(n*sizeof(t_float)); - x->x_ctl.c_buf2 = (t_float *)malloc(n*sizeof(t_float)); - - for(k=0; k<n; k++) - { - x->x_ctl.c_buf1[k] = 0; - x->x_ctl.c_buf2[k] = 0; - } - - x->x_ctl.c_order = n; - - return (void *)x; -} - -void dynwav_tilde_setup(void) -{ - //post("dynwav~ v0.1"); - dynwav_class = class_new(gensym("dynwav~"), (t_newmethod)dynwav_new, - (t_method)dynwav_free, sizeof(t_dynwav), 0, A_DEFFLOAT, 0); - CLASS_MAINSIGNALIN(dynwav_class, t_dynwav, x_f); - class_addmethod(dynwav_class, (t_method)dynwav_dsp, gensym("dsp"), 0); - - -} - |