owl_patch 0.8.0

Rust SDK for Rebel Technology Owl2/3 devices
Documentation
#include "WavetableOscillator.h"
#include <stdint.h>

WavetableOscillator::WavetableOscillator(float sr, const FloatArray wavetable):
  mul(1.0f/sr),
  wave(wavetable),
  acc(0.0f), inc(0.1f)
{}
 
void WavetableOscillator::setSampleRate(float sr){
  mul = 1.0f/sr;
}

float WavetableOscillator::getSampleRate(){
  return 1.0f/mul;
}

void WavetableOscillator::setFrequency(float freq){
  inc = freq*mul;
}

float WavetableOscillator::getFrequency(){
  return inc/mul;
}

float WavetableOscillator::getSample(float phase){
  uint32_t size = wave.getSize();
  uint32_t index = phase*(size-1);
  index = min(index, size-1);
  return wave[index];
}

void WavetableOscillator::setPhase(float phase){
  acc = phase/(2*M_PI);
}

float WavetableOscillator::getPhase(){
  return acc*2*M_PI;
}

float WavetableOscillator::generate(){
  float s = getSample(acc);
  acc += inc;
  if(acc >= 1.0f)
    acc -= 1.0f;
  return s;
}

float WavetableOscillator::generate(float fm){
  float s = getSample(acc);
  acc += inc * (1 + fm);
  if(acc > 1.0f)
    acc -= 1.0f;
  return s;
}

void WavetableOscillator::generate(FloatArray samples){
  for(size_t i=0; i<samples.getSize();++i)
    samples[i] = generate();
}

void WavetableOscillator::generate(FloatArray output, FloatArray fm){
  for(size_t i=0; i<output.getSize(); ++i){
    output[i] = getSample(acc);
    acc += inc * (1 + fm[i]);
    if(acc > 1.0f)
      acc -= 1.0f;
  }
}

WavetableOscillator* WavetableOscillator::create(float sr, size_t size) {
  FloatArray wave = FloatArray::create(size);
  for(size_t i=0; i<size; ++i)
    wave[i] = sinf(2*M_PI*i/(size-1));    
  return new WavetableOscillator(sr, wave);
}

void WavetableOscillator::destroy(WavetableOscillator* osc){
  FloatArray::destroy(osc->wave);
  delete osc;
}