#include "fx_orbitone.h" #include OrbitoneParameter::OrbitoneParameter(float32_t sampling_rate, float32_t feedback) : FXBase(sampling_rate), feedback_(feedback) { } OrbitoneParameter::~OrbitoneParameter() { } void OrbitoneParameter::setFeedback(float32_t feedback) { this->feedback_ = constrain(feedback, 0.0f, 1.0f); } inline float32_t OrbitoneParameter::getFeedback() const { return this->feedback_; } // OrbitoneStage implementation OrbitoneStage::OrbitoneStage(float32_t sampling_rate, OrbitoneParameter* params, float32_t frequency, float32_t level) : FXElement(sampling_rate), params_(params), lfo_(sampling_rate, LFO::Waveform::Sine, 0.0f, 20000.0f), level_(level) { this->lfo_.setFrequency(frequency); this->x_[0] = this->x_[1] = 0.0f; } OrbitoneStage::~OrbitoneStage() { } void OrbitoneStage::processSample(float32_t inL, float32_t inR, float32_t& outL, float32_t& outR) { // Generate a sine wave using the stage's oscillator float32_t osc = this->level_ * this->lfo_.process(); // Apply feedback to the stage's input outL = inL + inL * osc + this->params_->getFeedback() * this->x_[0]; outR = inR + inR * osc + this->params_->getFeedback() * this->x_[1]; } // Orbitone implementation Orbitone::Orbitone(float32_t sampling_rate, float32_t feedback) : FXElement(sampling_rate), params_(sampling_rate, feedback) { float32_t level = 1.0f; for(unsigned i = 0; i < NUM_ORBITONR_STAGES; ++i) { float32_t frequency = 440.0 * pow(2.0f, (i - 1) / 12.0f); // Sets the frequency of each stage to be a multiple of 440 Hz level /= 2.0f; this->stages_[i] = new OrbitoneStage(sampling_rate, &this->params_, frequency, level); } } Orbitone::~Orbitone() { for(unsigned i = 0; i < NUM_ORBITONR_STAGES; ++i) { delete this->stages_[i]; } } void Orbitone::processSample(float32_t inL, float32_t inR, float32_t& outL, float32_t& outR) { // Process the input sample through each stage of the phaser float32_t sampleL = inL; float32_t sampleR = inR; for(unsigned s = 0; s < NUM_ORBITONR_STAGES; ++s) { this->stages_[s]->processSample(sampleL, sampleR, sampleL, sampleR); } // Modulate the output of the phaser using the LFO outL = sampleL; outR = sampleR; } void Orbitone::setFeedback(float32_t feedback) { this->params_.setFeedback(feedback); } float32_t Orbitone::getFeedback() const { return this->params_.getFeedback(); }