#include "fx_rack.h" FXUnit::FXUnit(float32_t sampling_rate, FX& fx, float32_t wet_level) : FX(sampling_rate), fx_(fx) { this->setWetLevel(wet_level); } FXUnit::~FXUnit() { } void FXUnit::process(float32_t* left_input, float32_t* right_input, float32_t* left_output, float32_t* right_output, size_t nSamples) { this->fx_.process(left_input, right_input, left_output, right_output, nSamples); for(unsigned i = 0; i < nSamples; ++i) { // Mix wet and dry signals *left_output = this->getWetLevel() * *left_output + (1.0f - this->getWetLevel()) * *left_input; *right_output = this->getWetLevel() * *right_output + (1.0f - this->getWetLevel()) * *left_input; // Move to next input sample ++left_input; ++right_input; // Move to next output sample ++left_output; ++right_output; } } void FXUnit::setWetLevel(float32_t wet_level) { this->wet_level_ = constrain(wet_level, 0.0f, 1.0f); } float32_t FXUnit::getWetLevel() const { return this->wet_level_; } FXRack::FXRack(float32_t sampling_rate) : FX(sampling_rate), fx_chain_() { this->registerFX(new Phaser(sampling_rate)); this->registerFX(new TapeDelay(sampling_rate)); this->registerFX(new ShimmerReverb(sampling_rate)); } FXRack::~FXRack() { for(FXChain::iterator it = this->fx_chain_.begin(); it != this->fx_chain_.end(); it++) { delete *it; } this->fx_chain_.clear(); } void FXRack::process(float32_t* left_input, float32_t* right_input, float32_t* left_output, float32_t* right_output, size_t nSamples) { for(FXChain::iterator it = this->fx_chain_.begin(); it != this->fx_chain_.end(); it++) { (*it)->process(left_input, right_input, left_output, right_output, nSamples); left_input = left_output; right_input = right_output; } } void FXRack::registerFX(FX* fx) { this->fx_chain_.push_back(new FXUnit(this->getSamplingRate(), *fx)); }