#ifndef __RampOscillator_h
#define __RampOscillator_h
#include "Oscillator.h"
class RampOscillator : public OscillatorTemplate<RampOscillator> {
public:
static constexpr float begin_phase = -1;
static constexpr float end_phase = 1;
RampOscillator(){}
RampOscillator(float sr){
setSampleRate(sr);
}
float getSample(){
return phase;
}
};
class InvertedRampOscillator : public OscillatorTemplate<InvertedRampOscillator> {
public:
static constexpr float begin_phase = -1;
static constexpr float end_phase = 1;
InvertedRampOscillator(){}
InvertedRampOscillator(float sr){
setSampleRate(sr);
}
float getSample(){
return -phase;
}
};
class AntialiasedRampOscillator : public OscillatorTemplate<AntialiasedRampOscillator> {
protected:
float lastblep;
public:
static constexpr float begin_phase = 0;
static constexpr float end_phase = 1;
AntialiasedRampOscillator(){}
AntialiasedRampOscillator(float sr){
setSampleRate(sr);
}
void setPhase(float ph){
lastblep = 0;
OscillatorTemplate<AntialiasedRampOscillator>::setPhase(ph);
}
void reset(){
lastblep = 0;
OscillatorTemplate<AntialiasedRampOscillator>::reset();
}
float getSample(){
float sample = 2*phase-1; sample -= polyblep(phase, incr);
return sample;
}
void generate(FloatArray output){
size_t len = output.getSize();
float blep = lastblep;
for(size_t i=0; i<len; ++i){
float sample = 2*phase-1;
sample -= blep;
phase += incr;
if(phase >= 1){
phase -= 1;
float t = (phase - incr) / incr;
sample -= t*t + t+t + 1;
t = phase / incr;
blep = t+t - t*t - 1;
}else{
blep = 0;
}
output[i] = sample;
}
lastblep = blep; }
using OscillatorTemplate<AntialiasedRampOscillator>::generate;
};
#endif