mirror of
https://github.com/AquaMorph/Droplets.git
synced 2025-04-29 17:35:33 +00:00
111 lines
2.6 KiB
C++
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() {}
|