#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) : FXElement(sampling_rate), params_(params), frequency_(frequency), phase_(0.0f) { this->phase_increment_ = 2.0f * PI * frequency / this->getSamplingRate(); } 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 = sin(this->phase_); // Update the phase of the oscillator this->phase_ += this->phase_increment_; if(this->phase_ > 2.0f * PI) { this->phase_ -= 2.0f * PI; } // Apply feedback to the stage's input outL = inL + osc * this->params_->getFeedback(); outR = inR + osc * this->params_->getFeedback(); } // Orbitone implementation Orbitone::Orbitone(float32_t sampling_rate, float32_t feedback) : FXElement(sampling_rate), params_(sampling_rate, feedback) { 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 this->stages_[i] = new OrbitoneStage(sampling_rate, &this->params_, frequency); } } 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(); }