From d145fa6f792d6c44da2feec90507adb94e40323e Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Sun, 31 Jul 2011 03:59:16 +0000 Subject: got everything building using the template Makefile svn path=/trunk/externals/unauthorized/; revision=15173 --- wahwah~/wahwah~.c | 408 ------------------------------------------------------ 1 file changed, 408 deletions(-) delete mode 100644 wahwah~/wahwah~.c (limited to 'wahwah~/wahwah~.c') diff --git a/wahwah~/wahwah~.c b/wahwah~/wahwah~.c deleted file mode 100644 index 7f9a9ed..0000000 --- a/wahwah~/wahwah~.c +++ /dev/null @@ -1,408 +0,0 @@ -/* Copyright (c) 2002 Yves Degoyon. */ -/* For information on usage and redistribution, and for a DISCLAIMER OF ALL */ -/* WARRANTIES, see the file, "COPYING" in this distribution. */ -/* */ -/* wahwah~ -- a kind of effect used in psychedelic music */ -/* the algorithm was taken from Digital Effects, */ -/* a guitar effects software for DOS which rocks, written by Alexey Smoli */ -/* ( http://st.karelia.ru/~smlalx/ ) */ -/* */ -/* 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. */ -/* */ -/* See file LICENSE for further informations on licensing terms. */ -/* */ -/* 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -/* */ -/* Based on PureData by Miller Puckette and others. */ -/* */ -/* Made while listening to : */ -/* */ -/* Crass -- "Shaved Women ( Collaborators )" */ -/* Zounds -- "Can't Cheat Karma" */ -/* */ -/* Special message for the french : */ -/* "Delay all your work...and go vote against national front" */ -/* ---------------------------------------------------------------------------- */ - -#include "m_pd.h" -#include -#include - -#ifdef NT -#define M_PI 3.14159265358979323846 -#endif - -#define BFSZ 4096 /* main delay buffer */ -#define BLOCK_DELAY 10 /* number of blocks to delay */ -#define NA 0.0 /* param not applicable */ -#define COEFFSIZE 3000 /* coefficients size */ -#define NBCOEFFS 5 /* number of coefficients */ - -static char *wahwah_version = "wahwah~: an audio wahwah, version 0.1 (ydegoyon@free.fr)"; - -typedef struct _wahwah -{ - t_object x_obj; - double *x_buf; - t_int x_samplerate; - t_float *x_coeffs; - double x_minfc; /* min frequency Hz */ /* 0< <3000 */ - double x_maxfc; /* max frequency Hz */ /* 0< <3000 */ - double x_sense; /* increase/decrease frequency change by one mouse movement Hz */ /* 0< <=1000 */ - double x_maxstep; /* maximum frequency change step KHz */ /* 0< <=100 */ - double x_dbgain; /* peaking filter gain dB */ /* -15<= <=15 */ - double x_bandwidth; /* bandwidth in octaves (between midpoint (dBgain/2) - gain frequencies) or */ /* 0< <10 */ - double x_Q; /* the EE kinda definition */ /* 0< <=1 */ - - /* variables for audio computation */ - double min_coef,max_coef,cur_coef,step,maxstep; - t_int down; - /* amplitudes */ - short x0,x1,x2; - t_int y0,y1,y2; - - t_float x_f; -} t_wahwah; - -static t_class *wahwah_class; - -static void wahwah_set_coeffs (t_wahwah *x) -{ - t_int i; - double omega; - double sn,cs; - double alpha = 0.0; - /* filter coefficients */ - double a0,a1,a2,b0,b1,b2; - double A; - - A = exp(x->x_dbgain/40.0)*log(10.0); - for (i = 0; i < COEFFSIZE; i++) - { - omega = 2.0*M_PI*(double)i/(double)x->x_samplerate; - sn = sin(omega); - cs = cos(omega); - if (x->x_bandwidth) - alpha = sn*sin(log(2.0)/2.0*x->x_bandwidth*omega/sn); - else - /* if Q is specified instead of bandwidth */ - if (x->x_Q) - alpha = sn/(2.0*x->x_Q); - - /* then compute the coefs for whichever filter type you want */ - b0 = 1.0 + alpha*A; - b1 = -2.0*cs ; - b2 = 1.0 - alpha*A; - a0 = 1.0 + alpha/A; - a1 = -2.0*cs ; - a2 = 1.0 - alpha/A; - - *(x->x_coeffs+i*NBCOEFFS) = (b0/a0); - *(x->x_coeffs+i*NBCOEFFS+1) = (b1/a0); - *(x->x_coeffs+i*NBCOEFFS+2) = (b2/a0); - *(x->x_coeffs+i*NBCOEFFS+3) = (a1/a0); - *(x->x_coeffs+i*NBCOEFFS+4) = (a2/a0); - // post( "wahwah~ : coeff : %f", *(x->x_coeffs+i*NBCOEFFS+4) ); - } - x->min_coef = x->x_minfc; - x->max_coef = x->x_maxfc; - x->cur_coef = x->min_coef; - x->down = 1; - x->step = 0; - x->maxstep = x->x_maxstep/(double)x->x_samplerate*1000.0; -} - -static void wahwah_bandwidth(t_wahwah *x, t_floatarg fbandwidth ) -{ - if ( fbandwidth > 10.0 ) - { - fbandwidth = 10.0; - } - if ( fbandwidth < 0.0 ) - { - fbandwidth = 0.0; - } - x->x_bandwidth = fbandwidth; - // post( "wahwah~ : bandwidth: %f", x->x_bandwidth ); - wahwah_set_coeffs( x ); -} - -static void wahwah_dbgain(t_wahwah *x, t_floatarg fdbgain ) -{ - if ( fdbgain > 15.0 ) - { - fdbgain = 15.0; - } - if ( fdbgain < -15.0 ) - { - fdbgain = -15.0; - } - x->x_dbgain = fdbgain; - // post( "wahwah~ : dbgain: %f", x->x_dbgain ); - wahwah_set_coeffs( x ); -} - -static void wahwah_maxstep(t_wahwah *x, t_floatarg fmaxstep ) -{ - if ( fmaxstep > 100.0 ) - { - fmaxstep = 100.0; - } - if ( fmaxstep < 0.0 ) - { - fmaxstep = 0.0; - } - x->x_maxstep = fmaxstep; - // post( "wahwah~ : maxstep: %f", x->x_maxstep ); - wahwah_set_coeffs( x ); -} - -static void wahwah_sensibility(t_wahwah *x, t_floatarg fsensibility ) -{ - if ( fsensibility > 1000.0 ) - { - fsensibility = 1000.0; - } - if ( fsensibility < 0.0 ) - { - fsensibility = 0.0; - } - x->x_sense = fsensibility; - // post( "wahwah~ : sensibility: %f", x->x_sense ); - wahwah_set_coeffs( x ); -} - -static void wahwah_maxfreq(t_wahwah *x, t_floatarg fmaxfreq ) -{ - if ( fmaxfreq > 3000.0 ) - { - fmaxfreq = 3000.0; - } - if ( fmaxfreq < 0.0 ) - { - fmaxfreq = 0.0; - } - x->x_maxfc = fmaxfreq; - // post( "wahwah~ : maxfreq: %f", x->x_maxfc ); - wahwah_set_coeffs( x ); -} - -static void wahwah_minfreq(t_wahwah *x, t_floatarg fminfreq ) -{ - if ( fminfreq > 3000.0 ) - { - fminfreq = 3000.0; - } - if ( fminfreq < 0.0 ) - { - fminfreq = 0.0; - } - x->x_minfc = fminfreq; - // post( "wahwah~ : minfreq: %f", x->x_minfc ); - wahwah_set_coeffs( x ); -} - -static void wahwah_step(t_wahwah *x, t_floatarg fstep ) -{ - if ( fstep > x->x_maxstep ) - { - fstep = x->x_maxstep; - } - if ( fstep < 0 ) - { - fstep = 0; - } - x->step = fstep*x->x_sense/x->x_samplerate; -} - -static t_int *wahwah_perform(t_int *w) -{ - t_float *in = (t_float *)(w[1]); - t_float *out = (t_float *)(w[2]); - t_int n = (int)(w[3]); - t_wahwah *x = (t_wahwah*)(w[4]); - t_int i; - - for (i=0; ix0 = (int)((*(in+i))*32768); - - x->y0 = (*(x->x_coeffs+(int)x->cur_coef*NBCOEFFS))*x->x0 - + (*(x->x_coeffs+(int)x->cur_coef*NBCOEFFS+1))*x->x1 - + (*(x->x_coeffs+(int)x->cur_coef*NBCOEFFS+2))*x->x2 - - (*(x->x_coeffs+(int)x->cur_coef*NBCOEFFS+3))*x->y1 - - (*(x->x_coeffs+(int)x->cur_coef*NBCOEFFS+4))*x->y2; - - x->y2 = x->y1; - x->y1 = x->y0; - x->x2 = x->x1; - x->x1 = x->x0; - - if(x->y0 > 32767.0) - x->y0 = 32767.0; - else if(x->y0 < -32768.0) - x->y0 = -32768.0; - - *(out+i) = (t_float)(x->y0) / 32768.0; - - x->cur_coef = x->cur_coef+x->down*x->step*(abs(x->x0)/(0.5*32768.0)); - // post ( "wahwah~ : cur coeff : %f", x->cur_coef ); - if(x->cur_coef > x->max_coef) - { - x->cur_coef = x->max_coef; - x->down = -1; - } - else if(x->cur_coef < x->min_coef) - { - x->cur_coef = x->min_coef; - x->down = 1; - } - - } - - return (w+5); -} - -static void wahwah_preset(t_wahwah *x, t_float pnumber) -{ - switch ( (int)pnumber ) - { - /* fast change medium wah wah */ - case 1: - x->x_minfc = 100.0; - x->x_maxfc = 1600.0; - x->x_sense = 100.0; - x->x_maxstep = 60.0; - x->x_dbgain = 15.0; - x->x_Q = 1.0; - break; - - /* slow change medium wah wah */ - case 2: - x->x_minfc = 100.0; - x->x_maxfc = 1600.0; - x->x_sense = 50.0; - x->x_maxstep = 36.0; - x->x_dbgain = 15.0; - x->x_Q = 1.0; - break; - - /* fast wah wah */ - case 3: - x->x_minfc = 100.0; - x->x_maxfc = 600.0; - x->x_sense = 100.0; - x->x_maxstep = 66.0; - x->x_dbgain = 15.0; - x->x_Q = 1.0; - break; - - /* ranged wah wah */ - case 4: - x->x_minfc = 10.0; - x->x_maxfc = 2900.0; - x->x_sense = 100.0; - x->x_maxstep = 66.0; - x->x_dbgain = 15.0; - x->x_Q = 1.0; - break; - - /* wah wah 400 - 2000 */ - case 5: - x->x_minfc = 400.0; - x->x_maxfc = 2000.0; - x->x_sense = 100.0; - x->x_maxstep = 66.0; - x->x_dbgain = 15.0; - x->x_Q = 1.0; - break; - - default: - post( "wahwah~ : unknown preset requested : %d", pnumber ); - return; - break; - } - wahwah_set_coeffs( x ); -} - -static void wahwah_dsp(t_wahwah *x, t_signal **sp) -{ - dsp_add(wahwah_perform, 4, sp[0]->s_vec, sp[1]->s_vec, sp[0]->s_n, x ); -} - - /* clean up */ -static void wahwah_free(t_wahwah *x) -{ - if ( x->x_buf != NULL ) { - freebytes(x->x_buf, BFSZ*sizeof( double ) ); - post( "Freed %d bytes", BFSZ*sizeof( double ) ); - x->x_buf = NULL; - } - if ( x->x_coeffs != NULL ) { - freebytes(x->x_coeffs, COEFFSIZE*NBCOEFFS*sizeof( t_float ) ); - post( "Freed %d bytes", COEFFSIZE*NBCOEFFS*sizeof( t_float )); - x->x_coeffs = NULL; - } -} - -static void *wahwah_new(void) -{ - t_wahwah *x = (t_wahwah *)pd_new(wahwah_class); - outlet_new(&x->x_obj, &s_signal); - inlet_new(&x->x_obj, &x->x_obj.ob_pd, &s_float, gensym("minfreq")); - inlet_new(&x->x_obj, &x->x_obj.ob_pd, &s_float, gensym("maxfreq")); - inlet_new(&x->x_obj, &x->x_obj.ob_pd, &s_float, gensym("sensibility")); - inlet_new(&x->x_obj, &x->x_obj.ob_pd, &s_float, gensym("maxstep")); - inlet_new(&x->x_obj, &x->x_obj.ob_pd, &s_float, gensym("dbgain")); - inlet_new(&x->x_obj, &x->x_obj.ob_pd, &s_float, gensym("bandwidth")); - inlet_new(&x->x_obj, &x->x_obj.ob_pd, &s_float, gensym("step")); - - x->x_samplerate = (int)sys_getsr(); - - if ( !( x->x_buf = ( double* ) getbytes( BFSZ*sizeof( double ) ) ) ) - { - post ("wahwah~ : could not allocate buffer" ); - return NULL; - } - if ( !( x->x_coeffs = ( t_float* ) getbytes( COEFFSIZE*NBCOEFFS*sizeof( t_float ) ) ) ) - { - post ("wahwah~ : could not allocate coeffs" ); - return NULL; - } - - // set default parameters - wahwah_preset( x, 1 ); - wahwah_set_coeffs( x ); - - return (x); -} - -void wahwah_tilde_setup(void) -{ - post( wahwah_version ); - wahwah_class = class_new(gensym("wahwah~"), (t_newmethod)wahwah_new, (t_method)wahwah_free, - sizeof(t_wahwah), 0, 0); - - CLASS_MAINSIGNALIN( wahwah_class, t_wahwah, x_f ); - class_addmethod(wahwah_class, (t_method)wahwah_step, gensym("step"), A_FLOAT, 0); - class_addmethod(wahwah_class, (t_method)wahwah_minfreq, gensym("minfreq"), A_FLOAT, 0); - class_addmethod(wahwah_class, (t_method)wahwah_maxfreq, gensym("maxfreq"), A_FLOAT, 0); - class_addmethod(wahwah_class, (t_method)wahwah_sensibility, gensym("sensibility"), A_FLOAT, 0); - class_addmethod(wahwah_class, (t_method)wahwah_maxstep, gensym("maxstep"), A_FLOAT, 0); - class_addmethod(wahwah_class, (t_method)wahwah_dbgain, gensym("dbgain"), A_FLOAT, 0); - class_addmethod(wahwah_class, (t_method)wahwah_bandwidth, gensym("bandwidth"), A_FLOAT, 0); - class_addmethod(wahwah_class, (t_method)wahwah_dsp, gensym("dsp"), 0); - class_addmethod(wahwah_class, (t_method)wahwah_preset, gensym("preset"), A_FLOAT, 0); -} -- cgit v1.2.1