From 3c5e5b46a36b3fd44a0c714926d12411176d5685 Mon Sep 17 00:00:00 2001 From: Christian Colglazier Date: Mon, 1 Nov 2021 21:08:10 -0400 Subject: [PATCH] Basic VCA --- src/droplets/vca_droplet.cpp | 50 ++++++++++++++++++++++++++++++++ src/droplets/vca_droplet.h | 56 ++++++++++++++++++++++++++++++++++++ src/main.cpp | 3 ++ src/main.h | 1 + src/menu.cpp | 1 + src/menu_item.h | 2 +- 6 files changed, 112 insertions(+), 1 deletion(-) create mode 100644 src/droplets/vca_droplet.cpp create mode 100644 src/droplets/vca_droplet.h diff --git a/src/droplets/vca_droplet.cpp b/src/droplets/vca_droplet.cpp new file mode 100644 index 0000000..9d7af64 --- /dev/null +++ b/src/droplets/vca_droplet.cpp @@ -0,0 +1,50 @@ +#include "vca_droplet.h" + +VCADroplet::VCADroplet(DaisyPatch* m_patch, + DropletState m_state) : + Droplet(m_patch, + m_state) { + switch (GetState()) { + default: + case DropletState::kFull: + vca[0].Init(Patch()->controls[Patch()->CTRL_1], + 0.0, 1.0f, Parameter::LINEAR); + vca[1].Init(Patch()->controls[Patch()->CTRL_2], + 0.0, 1.0f, Parameter::LINEAR); + vca[2].Init(Patch()->controls[Patch()->CTRL_3], + 0.0, 1.0f, Parameter::LINEAR); + vca[3].Init(Patch()->controls[Patch()->CTRL_4], + 0.0, 1.0f, Parameter::LINEAR); + break; + case DropletState::kLeft: + vca[0].Init(Patch()->controls[Patch()->CTRL_1], + 0.0, 1.0f, Parameter::LINEAR); + vca[1].Init(Patch()->controls[Patch()->CTRL_2], + 0.0, 1.0f, Parameter::LINEAR); + break; + case DropletState::kRight: + vca[2].Init(Patch()->controls[Patch()->CTRL_3], + 0.0, 1.0f, Parameter::LINEAR); + vca[3].Init(Patch()->controls[Patch()->CTRL_3], + 0.0, 1.0f, Parameter::LINEAR); + break; + } +} + +VCADroplet::~VCADroplet() {} + +void VCADroplet::Control() {} + +void VCADroplet::Process(AudioHandle::InputBuffer in, AudioHandle::OutputBuffer out, size_t size) { + Patch()->ProcessAnalogControls(); + + for (size_t i = 0; i < size; i++) { + for (size_t chn = GetChannelMin(); chn < GetChannelMax(); chn++) { + out[chn][i] = in[chn][i] * vca[chn].Process(); + } + } +} + +void VCADroplet::Draw() { + DrawName("VCA"); +} diff --git a/src/droplets/vca_droplet.h b/src/droplets/vca_droplet.h new file mode 100644 index 0000000..a00ce64 --- /dev/null +++ b/src/droplets/vca_droplet.h @@ -0,0 +1,56 @@ +#pragma once + +#ifndef CASCADE_DROPLETS_VCA_DROPLET_H_ +#define CASCADE_DROPLETS_VCA_DROPLET_H_ + +#include "daisysp.h" +#include "daisy_patch.h" + +#include "droplet.h" +#include "../util.h" + +using namespace daisy; +using namespace daisysp; + +class VCADroplet: public Droplet { +private: + Parameter vca[4]; + +public: + /* + * Constructor for voltage amplifier droplet. + * + * @param m_patch pointer to patch + * @param m_state droplet position + */ + VCADroplet(DaisyPatch* m_patch, + DropletState m_state); + + /* + * Destructor for vco droplet. + */ + ~VCADroplet(); + + /* + * Processes user controls and inputs. + */ + void Control(); + + /* + * Processes audio input and outputs. + * + * @param in the audio inputs for the patch + * @param out the audio outputs for the patch + * @param size the number of inputs and outputs + */ + void Process(AudioHandle::InputBuffer in, + AudioHandle::OutputBuffer out, + size_t size); + + /* + * Processes information to be shown on the display. + */ + void Draw(); +}; + +#endif // CASCADE_DROPLETS_VCA_DROPLET_H_ diff --git a/src/main.cpp b/src/main.cpp index 05d2295..31d3ea4 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -114,6 +114,9 @@ static void AudioThrough(AudioHandle::InputBuffer in, Droplet* GetDroplet(DropletState state) { switch(selected_menu->GetState()) { + case MenuState::kVCA: + return new VCADroplet(&patch, + state); case MenuState::kVCO: return new VCODroplet(&patch, state, diff --git a/src/main.h b/src/main.h index bb8052f..2055715 100644 --- a/src/main.h +++ b/src/main.h @@ -13,6 +13,7 @@ #include "droplets/droplet.h" #include "droplets/droplet_manager.h" #include "droplets/noise_droplet.h" +#include "droplets/vca_droplet.h" #include "droplets/vco_droplet.h" DaisyPatch patch; diff --git a/src/menu.cpp b/src/menu.cpp index ffc75a8..dd87dac 100644 --- a/src/menu.cpp +++ b/src/menu.cpp @@ -10,6 +10,7 @@ Menu::Menu(DaisyPatch* m_patch, head = new MenuItem(MenuState::kSplit, "Split"); head->AddItemEnd(new MenuItem(MenuState::kChange, "")); head->AddItemEnd(new MenuItem(MenuState::kVCO, "VCO")); + head->AddItemEnd(new MenuItem(MenuState::kVCA, "VCA")); head->AddItemEnd(new MenuItem(MenuState::kNoise, "Noise")); selected = head; diff --git a/src/menu_item.h b/src/menu_item.h index eb95ada..c0519b4 100644 --- a/src/menu_item.h +++ b/src/menu_item.h @@ -5,7 +5,7 @@ #include -enum class MenuState {kSplit, kChange, kVCO, kNoise}; +enum class MenuState {kSplit, kChange, kVCA, kVCO, kNoise}; class MenuItem { private: