Closed sindarknave closed 1 year ago
As an example, I took the TripleSaw
oscillator example in patch_sm
and just replaced the import with VariableShapeOscillator, and was unable to change the freq:
#include "daisy_patch_sm.h"
#include "daisysp.h"
/** TODO: ADD CALIBRATION */
using namespace daisy;
using namespace patch_sm;
using namespace daisysp;
DaisyPatchSM patch;
VariableShapeOscillator osc_a, osc_b, osc_c;
void AudioCallback(AudioHandle::InputBuffer in,
AudioHandle::OutputBuffer out,
size_t size)
{
patch.ProcessAllControls();
/** Get Coarse, Fine, and V/OCT inputs from hardware
* MIDI Note number are easy to use for defining ranges */
float knob_coarse = patch.GetAdcValue(CV_1);
float coarse_tune = fmap(knob_coarse, 12, 84);
float knob_fine = patch.GetAdcValue(CV_2);
float fine_tune = fmap(knob_fine, 0, 10);
float cv_voct = patch.GetAdcValue(CV_5);
float voct = fmap(cv_voct, 0, 60);
/** Convert from MIDI note number to frequency */
float midi_nn = fclamp(coarse_tune + fine_tune + voct, 0.f, 127.f);
float freq_a = mtof(midi_nn);
/** Calculate a detune amount */
float detune_amt = patch.GetAdcValue(CV_3);
float freq_b = freq_a + (0.05 * freq_a * detune_amt);
float freq_c = freq_a - (0.05 * freq_a * detune_amt);
/** Set all three oscillators' frequencies */
osc_a.SetFreq(freq_a);
osc_b.SetFreq(freq_b);
osc_c.SetFreq(freq_c);
/** Process each sample of the oscillator and send to the hardware outputs */
for(size_t i = 0; i < size; i++)
{
float sig = osc_a.Process() + osc_b.Process() + osc_c.Process();
OUT_L[i] = sig;
OUT_R[i] = sig;
}
}
int main(void)
{
patch.Init();
osc_a.Init(patch.AudioSampleRate());
osc_b.Init(patch.AudioSampleRate());
osc_c.Init(patch.AudioSampleRate());
patch.StartAudio(AudioCallback);
while(1) {}
}
Update: setSyncFreq
works to set the base frequency.
The function
SetFreq
on VariableShapeOscillator seems to not be able to change the frequency (remains at 440Hz). Might be because PW isn't being accounted for?