mirror of
https://github.com/AquaMorph/Droplets.git
synced 2025-04-29 17:35:33 +00:00
164 lines
3.8 KiB
C++
164 lines
3.8 KiB
C++
#include "main.h"
|
|
|
|
using namespace daisy;
|
|
|
|
int main(void) {
|
|
patch.Init();
|
|
sample_rate = patch.AudioSampleRate();
|
|
selected_menu = left_menu;
|
|
droplet_left = GetDroplet(DropletState::kFull,
|
|
selected_menu->GetState());
|
|
|
|
patch.StartAdc();
|
|
patch.StartAudio(AudioThrough);
|
|
|
|
while(true) {
|
|
ProcessControls();
|
|
ProcessOled();
|
|
ProcessOutputs();
|
|
}
|
|
}
|
|
|
|
void ProcessControls() {
|
|
patch.ProcessAnalogControls();
|
|
patch.encoder.Debounce();
|
|
// Handle menu interactions
|
|
if (selected_menu->InMenu()) {
|
|
selected_menu->UpdateMenuPosition();
|
|
// Handle menu selection
|
|
if (patch.encoder.RisingEdge()) {
|
|
selected_menu->SetInMenu(false);
|
|
selected_menu->Select();
|
|
// Split selected
|
|
if(selected_menu->GetState() == MenuState::kSplit) {
|
|
manager->ToggleSplit();
|
|
left_menu->UpdateMenuState();
|
|
right_menu->UpdateMenuState();
|
|
// Enable split
|
|
if (manager->GetSplitMode()) {
|
|
droplet_left->UpdateState(DropletState::kLeft);
|
|
droplet_right = GetDroplet(DropletState::kRight,
|
|
left_menu->GetBufferState());
|
|
}
|
|
// Merge
|
|
else {
|
|
if (selected_menu == left_menu) {
|
|
droplet_left->UpdateState(DropletState::kFull);
|
|
delete droplet_right;
|
|
} else {
|
|
droplet_right->UpdateState(DropletState::kFull);
|
|
delete droplet_left;
|
|
droplet_left = droplet_right;
|
|
left_menu->SetState(right_menu->GetBufferState());
|
|
selected_menu = left_menu;
|
|
}
|
|
}
|
|
}
|
|
// Switch side
|
|
else if (selected_menu->GetState() == MenuState::kChange) {
|
|
if (selected_menu == left_menu) {
|
|
selected_menu = right_menu;
|
|
} else {
|
|
selected_menu = left_menu;
|
|
}
|
|
}
|
|
// Enable new mode
|
|
else {
|
|
if(manager->GetSplitMode()) {
|
|
if (selected_menu == left_menu) {
|
|
delete droplet_left;
|
|
droplet_left = GetDroplet(DropletState::kLeft,
|
|
selected_menu->GetState());
|
|
} else {
|
|
delete droplet_right;
|
|
droplet_right = GetDroplet(DropletState::kRight,
|
|
selected_menu->GetState());
|
|
}
|
|
} else {
|
|
delete droplet_left;
|
|
droplet_left = GetDroplet(DropletState::kFull,
|
|
selected_menu->GetState());
|
|
}
|
|
}
|
|
}
|
|
}
|
|
// Check if entering menu
|
|
else {
|
|
if (patch.encoder.Pressed()) {
|
|
if (patch.encoder.TimeHeldMs() > 500 &&
|
|
patch.encoder.TimeHeldMs() < 505) {
|
|
selected_menu->SetInMenu(true);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
void ProcessOutputs() {
|
|
if(!selected_menu->InMenu()) {
|
|
if (manager->GetSplitMode() &&
|
|
selected_menu == right_menu) {
|
|
droplet_right->Control();
|
|
} else {
|
|
droplet_left->Control();
|
|
}
|
|
}
|
|
}
|
|
|
|
void ProcessOled() {
|
|
patch.display.Fill(false);
|
|
if (selected_menu->InMenu()) {
|
|
selected_menu->ProcessMenuOled();
|
|
} else {
|
|
droplet_left->Draw();
|
|
if (manager->GetSplitMode()) {
|
|
droplet_right->Draw();
|
|
}
|
|
}
|
|
patch.display.Update();
|
|
}
|
|
|
|
static void AudioThrough(AudioHandle::InputBuffer in,
|
|
AudioHandle::OutputBuffer out,
|
|
size_t size) {
|
|
droplet_left->Process(in, out, size);
|
|
if (manager->GetSplitMode()) {
|
|
droplet_right->Process(in, out, size);
|
|
}
|
|
}
|
|
|
|
Droplet* GetDroplet(DropletState state,
|
|
MenuState menu) {
|
|
switch(menu) {
|
|
default:
|
|
case MenuState::kAD:
|
|
return new ADDroplet(&patch,
|
|
state,
|
|
sample_rate);
|
|
case MenuState::kLadderFilter:
|
|
return new LadderFilterDroplet(&patch,
|
|
state,
|
|
sample_rate);
|
|
case MenuState::kLFO:
|
|
return new LFODroplet(&patch,
|
|
state,
|
|
sample_rate);
|
|
case MenuState::kMixer:
|
|
return new MixerDroplet(&patch,
|
|
state);
|
|
case MenuState::kNoise:
|
|
return new NoiseDroplet(&patch,
|
|
state);
|
|
case MenuState::kSequencer:
|
|
return new SequencerDroplet(&patch,
|
|
state,
|
|
sample_rate);
|
|
case MenuState::kVCA:
|
|
return new VCADroplet(&patch,
|
|
state);
|
|
case MenuState::kVCO:
|
|
return new VCODroplet(&patch,
|
|
state,
|
|
sample_rate);
|
|
}
|
|
}
|