I am a beginner so forgive me if this is a little jumbled up.
I would like some guidance on creating a multitap delay in C++.
I have created a simple delay with feedback like this
Code: Select all
gwsNewDelay::gwsNewDelay() {
memset( memory, 0, 88200*sizeof (double) );
}
double gwsNewDelay::gwsNdl(double input, int size, double feedback) {
output=input*0.5 - (feedback* memory[phase]);
memory[phase]=output;
phase=(phase+1)%size;
return(output);
}
Code: Select all
double maxiDelayline::dl(double input, int size, double feedback) {
if ( phase >=size ) {
phase = 0;
}
output=memory[phase];
memory[phase]=(memory[phase]*feedback)+(input*feedback)*0.5;
phase+=1;
return(output);
}
WHen I was messing around in reaper's JS language I found it easy to create a mulitap delay by just reading the ring buffer from different points.
Code: Select all
slider1:30000<0,88200,100> delay 1
@slider
echolength = slider1 ;
tapone = floor (echolength*0.333); // attempt at delay tap 1 1/3 echolength
taptwo = floor (echolength*0.666); // attempt at delay tap 2 2/3 echolength
tapthree = floor (echolength*0.25); // attempt at delay tap 3 1/4 echolength
tapfour = floor (echolength*0.5);
@sample
bufpos[0] = spl0 ;
bufpos = bufpos + 1 ;
bufpos > echolength ? bufpos = 0;
spl0 = bufpos[0] + bufpos[tapone] + bufpos[taptwo] ; // put delay taps 1 and 2 on the left
spl1 = bufpos[0] + bufpos[tapthree] + bufpos[tapfour] ; // put delay taps 3 and 4 on the right
However I am struggling to do a similar thing in C++
I cannot seem to read a ring buffer from multiple points in C++ I keep getting a tickig sound which means I have done it wrong.
e.g.
This does not work
Code: Select all
gwsPointerDelay::gwsPointerDelay() {
memset( memory, 0, 88200*sizeof (double) );
}
double gwsPointerDelay::gwsPdl(double input, int size, double feedback) {
int size2 = (int) size/2;
int size3 = (int) size/3;
//cout<<"size2 is" <<size2 <<endl;
output=input*0.5 - (feedback* memory[phase]);
memory[phase]=output;
phase=(phase+1)%size;
return(output + memory[size2] + memory[size3]);
}
I have been experimenting with pointers but get a similar result.
Does anyone have a good example of a multitap delay in C++?
I seem to be making myself more confused rather than less confused.
I can make a delay with multi time like this
Code: Select all
gwsPointerDelay::gwsPointerDelay() {
memset( memory, 0, 88200*sizeof (double) );
}
double gwsPointerDelay::gwsPdl(double input, int size, double feedback) {
int size2 = (int) size/2;
int size3 = (int) size/3;
//cout<<"size2 is" <<size2 <<endl;
output=input*0.5 - (feedback* memory[phase]);
memory[phase]=output;
phase=(phase+1)%size;
output2=memory[phase];
memory[phase]=input*0.5;
phase=(phase+1)%size2;
output3=memory[phase];
memory[phase]=input*0.5;
phase=(phase+1)%size3;
return(output + output2 + output3 );
}
Any guidance appreciated.
GEoff