From 7f2d278fcb3f5db3b6a69b0c711bf04a57d65158 Mon Sep 17 00:00:00 2001 From: Christian Colglazier Date: Mon, 28 Sep 2020 20:17:14 -0400 Subject: [PATCH] Start of droplet splitting --- src/droplets/droplet.cpp | 2 ++ src/main.cpp | 58 ++++++++++++++++++++++++++++------------ src/main.h | 12 ++++++--- src/menu.cpp | 23 +++++++++++++--- src/menu.h | 16 +++++++++-- 5 files changed, 84 insertions(+), 27 deletions(-) diff --git a/src/droplets/droplet.cpp b/src/droplets/droplet.cpp index 831136f..4dba2bc 100644 --- a/src/droplets/droplet.cpp +++ b/src/droplets/droplet.cpp @@ -40,6 +40,8 @@ void Droplet::DrawName(std::string name) { void Droplet::UpdateState(DropletState m_state) { state = m_state; + chn_min = 0; + chn_max = 4; screen_min = 0; screen_max = SSD1309_WIDTH; if (state == DropletState::kLeft) { diff --git a/src/main.cpp b/src/main.cpp index 6abd8d5..7196779 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -5,7 +5,7 @@ using namespace daisy; int main(void) { patch.Init(); sample_rate = patch.AudioSampleRate(); - droplet = GetDroplet(); + droplet_left = GetDroplet(DropletState::kFull); patch.StartAdc(); patch.StartAudio(AudioThrough); @@ -19,35 +19,56 @@ int main(void) { void ProcessControls() { patch.UpdateAnalogControls(); patch.DebounceControls(); - if (menu.InMenu()) { - menu.UpdateMenuPosition(); + if (left_menu.InMenu()) { + left_menu.UpdateMenuPosition(); if (patch.encoder.RisingEdge()) { - menu.SetInMenu(false); - delete droplet; - droplet = GetDroplet(); + left_menu.SetInMenu(false); + if(left_menu.GetState() == MenuState::kSplit) { + split = !split; + if (split) { + droplet_left->UpdateState(DropletState::kLeft); + droplet_right = GetDroplet(DropletState::kRight); + } else { + droplet_left->UpdateState(DropletState::kFull); + delete droplet_right; + } + } else { + delete droplet_left; + if(split) { + droplet_left = GetDroplet(DropletState::kLeft); + } else { + droplet_left = GetDroplet(DropletState::kFull); + } + } } } else { if (patch.encoder.Pressed()) { if (patch.encoder.TimeHeldMs() > 500 && patch.encoder.TimeHeldMs() < 505) { - menu.SetInMenu(true); + left_menu.SetInMenu(true); } } } } void ProcessOutputs() { - if(!menu.InMenu()) { - droplet->Control(); + if(!left_menu.InMenu()) { + droplet_left->Control(); + if (split) { + droplet_right->Control(); + } } } void ProcessOled() { patch.display.Fill(false); - if (menu.InMenu()) { - menu.ProcessMenuOled(); + if (left_menu.InMenu()) { + left_menu.ProcessMenuOled(); } else { - droplet->Draw(); + droplet_left->Draw(); + if (split) { + droplet_right->Draw(); + } } patch.display.Update(); } @@ -55,18 +76,21 @@ void ProcessOled() { static void AudioThrough(float **in, float **out, size_t size) { - droplet->Process(in, out, size); + droplet_left->Process(in, out, size); + if (split) { + droplet_right->Process(in, out, size); + } } -Droplet* GetDroplet() { - switch(menu.GetState()) { +Droplet* GetDroplet(DropletState state) { + switch(left_menu.GetState()) { case MenuState::kVCO: return new VCODroplet(&patch, - DropletState::kFull, + state, sample_rate); case MenuState::kNoise: default: return new NoiseDroplet(&patch, - DropletState::kFull); + state); } } diff --git a/src/main.h b/src/main.h index cfdcd3d..02d6de4 100644 --- a/src/main.h +++ b/src/main.h @@ -15,8 +15,11 @@ #include "droplets/vco_droplet.h" DaisyPatch patch; -Menu menu(&patch); -Droplet* droplet; +bool split = false; +Menu left_menu(&patch, "Right", &split); +Menu right_menu(&patch, "Left", &split); +Droplet* droplet_left; +Droplet* droplet_right; float sample_rate; /* @@ -49,8 +52,9 @@ static void AudioThrough(float** in, /* * Initializes a new audio processing droplet based on menu state. * - * @return a droplet + * @param state new droplet state + * @return droplet */ -Droplet* GetDroplet(); +Droplet* GetDroplet(DropletState state); #endif // CASCADE_MAIN_H_ diff --git a/src/menu.cpp b/src/menu.cpp index a53536c..017308b 100644 --- a/src/menu.cpp +++ b/src/menu.cpp @@ -1,10 +1,16 @@ #include "menu.h" -Menu::Menu(DaisyPatch* m_patch) { +Menu::Menu(DaisyPatch* m_patch, + std::string m_name, + bool* m_split) { patch = m_patch; + name = m_name; + split = m_split; } -const std::string MENU_ITEMS[] = {"VCO", - "Noise"}; +const std::string MENU_ITEMS[] = {"Split", + "Change", + "VCO", + "Noise"}; const int MENU_SIZE = sizeof(MENU_ITEMS)/sizeof(*MENU_ITEMS); const int MAX_CHAR_LENGTH = 15; const int MENU_X[] = {0, 5, 10, 5, 0}; @@ -32,6 +38,11 @@ std::string Menu::FilterMenuText(int position) { if (position >= MENU_SIZE || position < 0) { return ""; } else { + if (ConvertState(position) == MenuState::kSplit && *split) { + return "Merge"; + } else if (ConvertState(position) == MenuState::kChange) { + return name; + } return MENU_ITEMS[position]; } } @@ -69,5 +80,9 @@ std::string Menu::SelectedName() { } MenuState Menu::GetState() { - return static_cast(selectedMenuItem); + return ConvertState(selectedMenuItem); +} + +MenuState Menu::ConvertState(int menu_state) { + return static_cast(menu_state); } diff --git a/src/menu.h b/src/menu.h index e7800c4..1287634 100644 --- a/src/menu.h +++ b/src/menu.h @@ -10,18 +10,30 @@ using namespace daisy; -enum class MenuState {kVCO, kNoise}; +enum class MenuState {kSplit, kChange, kVCO, kNoise}; class Menu { private: DaisyPatch* patch; + bool* split; + std::string name; + + /* + * Converts a number to the related menu state. + * + * @param menu_state state number + * @return menu state + */ + MenuState ConvertState(int menu_state); public: /* * Constructor for a menu system to control the state of the patch. * * @param m_patch pointer to patch + * @param m_name name of the menu + * @param m_split one or two droplets */ - Menu(DaisyPatch* m_patch); + Menu(DaisyPatch* m_patch, std::string m_name, bool* m_split); /* * Gives if the user is currently in the menu.