Flanging revisited.
[ahxm.git] / effect.c
blob1ecbcf4bcb941f6a128aa2d103e499e5918b84ee
1 /*
3 PROGRAM_NAME PROGRAM_VERSION - PROGRAM_DESCRIPTION
5 Copyright (C) 2003 Angel Ortega <angel@triptico.com>
7 This program is free software; you can redistribute it and/or
8 modify it under the terms of the GNU General Public License
9 as published by the Free Software Foundation; either version 2
10 of the License, or (at your option) any later version.
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software
19 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
21 http://www.triptico.com
25 #include "config.h"
27 #include <stdlib.h>
28 #include <math.h>
30 #include "effect.h"
32 /*******************
33 Data
34 ********************/
36 /*******************
37 Code
38 ********************/
40 void init_delay(struct effect_delay * e, int size, double vol)
42 e->lbuffer=(int *) malloc(size * sizeof(int));
43 memset(e->lbuffer, '\0', size * sizeof(int));
44 e->rbuffer=(int *) malloc(size * sizeof(int));
45 memset(e->rbuffer, '\0', size * sizeof(int));
47 e->size=size;
48 e->vol=vol;
49 e->cursor=0;
53 void process_delay(struct effect_delay * e, int * lsample, int * rsample)
55 int l,r;
57 l=e->lbuffer[e->cursor];
58 r=e->lbuffer[e->cursor];
60 l=*lsample + (int)(e->vol * (double)l);
61 r=*rsample + (int)(e->vol * (double)r);
63 e->lbuffer[e->cursor]=*lsample;
64 e->rbuffer[e->cursor]=*rsample;
66 if(++e->cursor == e->size) e->cursor=0;
68 *lsample=l;
69 *rsample=r;
73 void process_reverb(struct effect_delay * e, int * lsample, int * rsample)
75 int l,r;
77 l=e->lbuffer[e->cursor];
78 r=e->lbuffer[e->cursor];
80 e->lbuffer[e->cursor]=*lsample + (int)(e->vol * (double)l);
81 e->rbuffer[e->cursor]=*rsample + (int)(e->vol * (double)r);
83 l+=*lsample;
84 r+=*rsample;
86 if(++e->cursor == e->size) e->cursor=0;
88 *lsample=l;
89 *rsample=r;
93 void process_flanger(struct effect_delay * e, int * lsample, int * rsample)
95 int l,r;
96 double c;
98 c=(double) (e->cursor / 2);
99 c+=c * sin((c * 6.28) / (double) e->size);
101 e->lbuffer[e->cursor]=*lsample;
102 e->rbuffer[e->cursor]=*rsample;
104 if(++e->cursor == e->size) e->cursor=0;
106 *lsample=l;
107 *rsample=r;