1 #ifndef __SampleOscillator_h
2 #define __SampleOscillator_h
6 template<InterpolationMethod im>
21 static constexpr
float MIDDLE_C = 261.6;
26 , buffer(sample), pos(0), size(sample.getSize() - 1) {}
28 rate = copysignf(freq / MIDDLE_C, rate);
49 pos = size*phase/(2*
M_PI);
52 return pos*2*
M_PI/size;
83 while(pos + rate*len > size){
84 float remain = size - pos;
85 size_t steps = (size_t)(remain/rate);
86 for(
size_t i=0; i<steps; ++i){
101 while(pos + rate*len < 0){
103 size_t steps = (size_t)(remain/rate);
104 for(
size_t i=0; i<steps; ++i){
117 for(
size_t i=0; i<len; ++i){
126 size_t len = buffer.
getSize()-1;
127 size_t i =
min(index, len);
129 while (i < len && buffer[i] > 0)
132 while (i < len && buffer[i] < 0)
154 size_t idx = (int)index;
155 float low = data[idx];
156 float high = data[idx + 1];
157 float frac = index - idx;
163 size_t idx = (int)index;
SampleOscillator< COSINE_INTERPOLATION > CosineSampleOscillator
SampleOscillator< LINEAR_INTERPOLATION > LinearSampleOscillator
This class contains useful methods for manipulating arrays of floats.
static float linear(float y1, float y2, float mu)
static float cosine(float y1, float y2, float mu)
An Oscillator is a SignalGenerator that operates at a given frequency and that can be frequency modul...
void generate(FloatArray output, FloatArray fm)
Produce a block of samples with frequency modulation.
static SampleOscillator * create(float sr, FloatArray buf)
SampleOscillator(float sr, FloatArray sample)
void setDuration(float duration)
static void destroy(SampleOscillator *obj)
void generate(FloatArray output)
Produce a block of samples.
float getPhase()
Get current oscillator phase in radians.
float getFrequency()
Get oscillator frequency in Hertz.
float generate()
Produce the next consecutive sample.
size_t findZeroCrossing(size_t index)
void setFrequency(float freq)
Set oscillator frequency in Hertz.
void setPhase(float phase)
Set current oscillator phase in radians.
float generate(float fm)
Produce a sample with frequency modulation.
void setSample(FloatArray sample)
void setRepeatMode(RepeatMode mode)
void reset()
Reset oscillator (typically resets phase)
float interpolate(float index, FloatArray data)