-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy pathdelay.c
79 lines (69 loc) · 1.99 KB
/
delay.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
//delay.c Basic time delay
#include "DSK6416_AIC23.h" //codec support
Uint32 fs=DSK6416_AIC23_FREQ_8KHZ; //set sampling rate
#define DSK6416_AIC23_INPUT_MIC 0x0015
#define DSK6416_AIC23_INPUT_LINE 0x0011
Uint16 inputsource=DSK6416_AIC23_INPUT_LINE; // select input
#define BUF_SIZE 8000
float sr = 48000.f;
short input,output,delayed;
short delay[BUF_SIZE];
int i;
float env[BUF_SIZE];
float gain, pitch, rp, fdb;
int taps, dsize, wp;
gain = 0.5;
pitch = 1.0;
fdb = 0.0;
taps = 2;
dsize = (int)(0.045*sr);
wp = 0;
rp = 0.f;
void setDsize(float d) {
dsize = (int)(sr*d);
for(i = 0; i < dsize/2; i++) env[i] = i*2./dsize;
for(i=dsize/2; i>= 0; i--) env[dsize-i-1] = i*2./dsize;
}
int rpi, ep;
float s=0.f,rpf, frac, next, p=(pitch*1.5) + 0.5;
interrupt void c_int11() // interrupt service routine
{
input = input_left_sample(); //read new input sample
for(i=0; i < taps; i++) {
rpf = rp + i*size/taps;
if(rpf > dsize) rpf -= disze;
rpi = (int) rpf;
frac = rpf - rpi;
if(rpi != dsize-1) next = delay[rpi+1];
else next = delay[0];
// envelop index
ep = rpi - wp;
if(ep < 0) ep += dsize;
s += (delay[rpi] + frac*(next - delay[rpi]))*env[ep];
}
// inc reader pointer and check bounds
rp += p;
rp = rp < dsize ? rp : rp - dsize;
// feed the delay line
delay[wp] = input + s*fdb;
// output the signal
output = (s/taps)*gain;
//output = input + delayed; //output sum of new and delayed samples
//delay[i] = input; //replace delayed sample with
//if(++i >= BUF_SIZE) i=0; //new input sample then increment
if(++wp >= dsize) wp = 0;
output_left_sample(output); //buffer index
output_right_sample(output);
return; //return from ISR
}
void main()
{
for(i=0 ; i<BUF_SIZE ; i++)
buffer[i] = 0;
for(i=0; i<dsize/2; i++) env[i] = i*2./dsize;
for(i=dsize/2; i >= 0; i--) env[dsize-i-1] = i*2./dsize;
rp = 0.;
wp = 0;
comm_intr(); //init DSK, codec, McBSP
while(1); //infinite loop
}