You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
MiniDexed/src/fx_orbitone.cpp

99 lines
2.4 KiB

#include "fx_orbitone.h"
#include <cmath>
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);
}
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();
}