|
|
@@ -8,27 +8,10 @@ |
|
|
|
#include "pffft.h" |
|
|
|
|
|
|
|
|
|
|
|
float *springReverbIR; |
|
|
|
int springReverbIRLen; |
|
|
|
|
|
|
|
void springReverbInit() { |
|
|
|
std::string irFilename = assetPlugin(plugin, "res/SpringReverbIR.pcm"); |
|
|
|
FILE *f = fopen(irFilename.c_str(), "rb"); |
|
|
|
assert(f); |
|
|
|
fseek(f, 0, SEEK_END); |
|
|
|
int size = ftell(f); |
|
|
|
fseek(f, 0, SEEK_SET); |
|
|
|
|
|
|
|
springReverbIRLen = size / sizeof(float); |
|
|
|
springReverbIR = new float[springReverbIRLen]; |
|
|
|
fread(springReverbIR, sizeof(float), springReverbIRLen, f); |
|
|
|
fclose(f); |
|
|
|
|
|
|
|
// TODO Add springReverbDestroy() function once plugins have destroy() callbacks |
|
|
|
} |
|
|
|
BINARY(src_SpringReverbIR_pcm); |
|
|
|
|
|
|
|
|
|
|
|
#define BLOCKSIZE 1024 |
|
|
|
static const size_t BLOCK_SIZE = 1024; |
|
|
|
|
|
|
|
struct SpringReverb : Module { |
|
|
|
enum ParamIds { |
|
|
@@ -60,8 +43,8 @@ struct SpringReverb : Module { |
|
|
|
RealTimeConvolver *convolver = NULL; |
|
|
|
SampleRateConverter<1> inputSrc; |
|
|
|
SampleRateConverter<1> outputSrc; |
|
|
|
DoubleRingBuffer<Frame<1>, 16*BLOCKSIZE> inputBuffer; |
|
|
|
DoubleRingBuffer<Frame<1>, 16*BLOCKSIZE> outputBuffer; |
|
|
|
DoubleRingBuffer<Frame<1>, 16*BLOCK_SIZE> inputBuffer; |
|
|
|
DoubleRingBuffer<Frame<1>, 16*BLOCK_SIZE> outputBuffer; |
|
|
|
|
|
|
|
RCFilter dryFilter; |
|
|
|
PeakFilter vuFilter; |
|
|
@@ -74,8 +57,11 @@ struct SpringReverb : Module { |
|
|
|
|
|
|
|
|
|
|
|
SpringReverb::SpringReverb() : Module(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS) { |
|
|
|
convolver = new RealTimeConvolver(BLOCKSIZE); |
|
|
|
convolver->setKernel(springReverbIR, springReverbIRLen); |
|
|
|
convolver = new RealTimeConvolver(BLOCK_SIZE); |
|
|
|
|
|
|
|
const float *kernel = (const float*) BINARY_START(src_SpringReverbIR_pcm); |
|
|
|
size_t kernelLen = BINARY_SIZE(src_SpringReverbIR_pcm) / sizeof(float); |
|
|
|
convolver->setKernel(kernel, kernelLen); |
|
|
|
} |
|
|
|
|
|
|
|
SpringReverb::~SpringReverb() { |
|
|
@@ -105,13 +91,13 @@ void SpringReverb::step() { |
|
|
|
|
|
|
|
|
|
|
|
if (outputBuffer.empty()) { |
|
|
|
float input[BLOCKSIZE] = {}; |
|
|
|
float output[BLOCKSIZE]; |
|
|
|
float input[BLOCK_SIZE] = {}; |
|
|
|
float output[BLOCK_SIZE]; |
|
|
|
// Convert input buffer |
|
|
|
{ |
|
|
|
inputSrc.setRates(engineGetSampleRate(), 48000); |
|
|
|
int inLen = inputBuffer.size(); |
|
|
|
int outLen = BLOCKSIZE; |
|
|
|
int outLen = BLOCK_SIZE; |
|
|
|
inputSrc.process(inputBuffer.startData(), &inLen, (Frame<1>*) input, &outLen); |
|
|
|
inputBuffer.startIncr(inLen); |
|
|
|
} |
|
|
@@ -122,7 +108,7 @@ void SpringReverb::step() { |
|
|
|
// Convert output buffer |
|
|
|
{ |
|
|
|
outputSrc.setRates(48000, engineGetSampleRate()); |
|
|
|
int inLen = BLOCKSIZE; |
|
|
|
int inLen = BLOCK_SIZE; |
|
|
|
int outLen = outputBuffer.capacity(); |
|
|
|
outputSrc.process((Frame<1>*) output, &inLen, outputBuffer.endData(), &outLen); |
|
|
|
outputBuffer.endIncr(outLen); |
|
|
|