Droplets/src/droplets/lfo_droplet.cpp

111 lines
2.6 KiB
C++

#include "lfo_droplet.h"
void LFO::Init(DaisyPatch* m_patch,
float samplerate,
AnalogControl freqKnob,
AnalogControl ampKnob) {
patch = m_patch;
osc.Init(samplerate);
osc.SetAmp(1);
wave = 0;
freqCtrl.Init(freqKnob, 0.1f, 35.0f, Parameter::LOGARITHMIC);
ampCtrl.Init(ampKnob, 0.0f, 1.0f, Parameter::LINEAR);
}
void LFO::Process(DacHandle::Channel chn) {
osc.SetFreq(freqCtrl.Process());
osc.SetWaveform(wave);
patch->seed.dac.WriteValue(
chn,
uint16_t((osc.Process() + 1.f) *
.5f * ampCtrl.Process() * 4095.f));
}
void LFO::UpdateWave(int change) {
wave = (MAX_WAVE + wave + change) % MAX_WAVE;
}
uint8_t LFO::GetWave() {
return wave;
}
LFODroplet::LFODroplet(DaisyPatch* m_patch,
DropletState m_state,
float sample_rate) :
Droplet(m_patch,
m_state) {
switch (GetState()) {
default:
case DropletState::kFull:
lfo[0].Init(Patch(),
sample_rate,
Patch()->controls[Patch()->CTRL_1],
Patch()->controls[Patch()->CTRL_2]);
lfo[1].Init(Patch(),
sample_rate,
Patch()->controls[Patch()->CTRL_3],
Patch()->controls[Patch()->CTRL_4]);
break;
case DropletState::kLeft:
lfo[0].Init(Patch(),
sample_rate,
Patch()->controls[Patch()->CTRL_1],
Patch()->controls[Patch()->CTRL_2]);
break;
case DropletState::kRight:
lfo[0].Init(Patch(),
sample_rate,
Patch()->controls[Patch()->CTRL_3],
Patch()->controls[Patch()->CTRL_4]);
break;
}
}
LFODroplet::~LFODroplet() {}
void LFODroplet::Control() {
Patch()->ProcessAnalogControls();
Patch()->encoder.Debounce();
lfo[0].UpdateWave(Patch()->encoder.Increment());
if (GetState() == DropletState::kFull) {
lfo[1].UpdateWave(Patch()->encoder.Increment());
}
}
void LFODroplet::Process(AudioHandle::InputBuffer in, AudioHandle::OutputBuffer out, size_t size) {
Patch()->ProcessAnalogControls();
for(size_t i = 0; i < size; i++) {
if (GetState() == DropletState::kRight) {
lfo[0].Process(DacHandle::Channel::TWO);
} else {
lfo[0].Process(DacHandle::Channel::ONE);
}
if (GetState() == DropletState::kFull) {
lfo[1].Process(DacHandle::Channel::TWO);
}
}
}
void LFODroplet::Draw() {
if (GetState() == DropletState::kFull) {
WriteCenteredString(Patch(),
(GetScreenMax()-GetScreenMin())/2,
54,
Font_6x8,
WaveToString(lfo[0].GetWave()));
} else {
WriteDoubleCentered(Patch(),
GetScreenMin() +
(GetScreenMax()-GetScreenMin())/2,
54,
GetScreenMax()-GetScreenMin(),
Font_6x8,
WaveToString(lfo[0].GetWave()));
}
DrawName("LFO");
}
void LFODroplet::UpdateStateCallback() {}