#include <Bela.h>
#include <algorithm>
#include <libraries/Gui/Gui.h>
#include <libraries/GuiController/GuiController.h>
#include <libraries/Scope/Scope.h>
#include <cmath>
unsigned int gAudioChannelNum;
float *gInBuffer;
float *gOutBuffer;
//Delay params
std::vector<float> gDelayBuffer;
unsigned int gWritePointer = 0;
unsigned int gOffset = 0;
unsigned int gReadPointer = 0;
float feedback = 0.0;
float gAmp = 5.0;
//Gui
Gui gui;
GuiController controller;
bool setup(BelaContext *context, void *userData)
{
gui.setup(context->projectName);
//Set up Gui
controller.setup(&gui, "delayTest");
controller.addSlider("Delay", 0.1, 0, 0.49, 0);//Delay Slider
controller.addSlider("FeedBack", 0.1, 0, 0.99, 0);//Feedback Slider
//Allocate gDelayBuffer
gDelayBuffer.resize( 0.5 * context->audioSampleRate);
//Set input and output buffer size
gInBuffer = new float[context->audioFrames];
gOutBuffer = new float[context->audioFrames];
//Check input and output number
if(context->audioInChannels != context->audioOutChannels){
printf("Input not mathcing output.\n");
}
gAudioChannelNum = std::min(context->audioInChannels, context->audioOutChannels);
return true;
}
void render(BelaContext *context, void *userData)
{
//Delay Slider
float delay = controller.getSliderValue(0);
feedback = controller.getSliderValue(1);
int gOffset = delay * context->audioSampleRate;
//Set Delay Buffer ReadPointer
gReadPointer = (gWritePointer - gOffset + gDelayBuffer.size()) % gDelayBuffer.size();
for(unsigned int n = 0; n < context->audioFrames; n++){
//Porcessing
//Read sample(cause less noise)
gInBuffer[n] = audioRead(context, n, 0) - audioRead(context, n, 1);
// //Input Buffer
float in = gInBuffer[n] * gAmp;
// //Apply Delay
float outDelay = gDelayBuffer[gReadPointer];//Read from buffer
gDelayBuffer[gWritePointer] = in + (outDelay *feedback);//Write into buffer with feedback
gWritePointer ++;//Increase writer pointer
if(gWritePointer >= gDelayBuffer.size()){
gWritePointer -= gDelayBuffer.size();
}
gOutBuffer[n] = in;
// //Write audio to output
audioWrite(context, n, 0, gOutBuffer[n]);
audioWrite(context, n, 1, outDelay);
// scope.log(gOutBuffer[n]);
//}
}
}
void cleanup(BelaContext *context, void *userData)
{
}