From 1f758b177246b2d6b3a07463851b4bf2952148d3 Mon Sep 17 00:00:00 2001
From: Christian Colglazier <christian@cacolglazier.com>
Date: Tue, 15 Sep 2020 22:04:36 -0400
Subject: [PATCH] VCO droplet outline

---
 Makefile                     |  3 ++-
 src/droplets/droplet.h       |  1 +
 src/droplets/noise_droplet.h |  1 -
 src/droplets/vco_droplet.cpp | 48 ++++++++++++++++++++++++++++++++++++
 src/droplets/vco_droplet.h   | 26 +++++++++++++++++++
 src/main.cpp                 |  7 +++---
 6 files changed, 81 insertions(+), 5 deletions(-)
 create mode 100644 src/droplets/vco_droplet.cpp
 create mode 100644 src/droplets/vco_droplet.h

diff --git a/Makefile b/Makefile
index 51b923e..7ff305a 100644
--- a/Makefile
+++ b/Makefile
@@ -4,7 +4,8 @@ CPP_SOURCES = src/main.cpp \
               src/util.cpp \
               src/menu.cpp \
               src/droplets/droplet.cpp \
-              src/droplets/noise_droplet.cpp
+              src/droplets/noise_droplet.cpp \
+              src/droplets/vco_droplet.cpp
 
 LIBDAISY_DIR = ./lib/libDaisy
 DAISYSP_DIR = ./lib/daisySP
diff --git a/src/droplets/droplet.h b/src/droplets/droplet.h
index 68f42da..e9e6573 100644
--- a/src/droplets/droplet.h
+++ b/src/droplets/droplet.h
@@ -15,6 +15,7 @@ enum class DropletState {kFull, kLeft, kRight};
 
 class Droplet {
  public:
+  DaisyPatch* patch;
   DropletState state;
   virtual ~Droplet() {};
   virtual void Control()=0;
diff --git a/src/droplets/noise_droplet.h b/src/droplets/noise_droplet.h
index 4ef697c..fc3dd9e 100644
--- a/src/droplets/noise_droplet.h
+++ b/src/droplets/noise_droplet.h
@@ -11,7 +11,6 @@
 
 class NoiseDroplet: public Droplet {
  private:
-  DaisyPatch* patch;
   daisysp::WhiteNoise noise;
   daisysp::NlFilt filter;
  public:
diff --git a/src/droplets/vco_droplet.cpp b/src/droplets/vco_droplet.cpp
new file mode 100644
index 0000000..0018f49
--- /dev/null
+++ b/src/droplets/vco_droplet.cpp
@@ -0,0 +1,48 @@
+#include "vco_droplet.h"
+
+VCODroplet::VCODroplet(DaisyPatch* m_patch,
+		       float sample_rate,
+		       DropletState m_state) {
+  UpdateState(m_state);
+  int num_waves = Oscillator::WAVE_LAST - 1;
+  osc.Init(sample_rate);
+  freqctrl.Init(patch->controls[patch->CTRL_1], 10.0,
+		110.0f, Parameter::LINEAR);
+  finectrl.Init(patch->controls[patch->CTRL_2], 0.f,
+		7.f, Parameter::LINEAR);
+  wavectrl.Init(patch->controls[patch->CTRL_3], 0.0,
+		num_waves, Parameter::LINEAR);
+  ampctrl.Init(patch->controls[patch->CTRL_4], 0.0,
+	       0.5f, Parameter::LINEAR);
+}
+
+void VCODroplet::Control() {}
+
+void VCODroplet::Process(float** in, float** out, size_t size) {
+  float sig, freq, amp;
+  size_t wave;
+  
+  patch->UpdateAnalogControls();
+  
+  for (size_t i = 0; i < size; i += 2) {
+    // Read Knobs
+    freq = mtof(freqctrl.Process() + finectrl.Process());
+    wave = wavectrl.Process();
+    amp = ampctrl.Process();
+    // Set osc params
+    
+    osc.SetFreq(freq);
+    osc.SetWaveform(wave);
+    osc.SetAmp(amp);
+    // Process
+    sig = osc.Process();
+    // Assign Synthesized Waveform to all four outputs.
+    for (size_t chn = 0; chn < 4; chn++) {
+      out[chn][i] = sig;
+    }
+  }
+}
+
+void VCODroplet::Draw() {
+  DrawName(patch, "VCO");
+}
diff --git a/src/droplets/vco_droplet.h b/src/droplets/vco_droplet.h
new file mode 100644
index 0000000..e56d488
--- /dev/null
+++ b/src/droplets/vco_droplet.h
@@ -0,0 +1,26 @@
+#pragma once
+
+#ifndef CASCADE_DROPLETS_VCO_DROPLET_H_
+#define CASCADE_DROPLETS_VCO_DROPLET_H_
+
+#include "daisysp.h"
+#include "daisy_patch.h"
+
+#include "droplet.h"
+#include "../util.h"
+
+using namespace daisy;
+using namespace daisysp;
+
+class VCODroplet: public Droplet {
+ private:
+  Oscillator osc;
+  Parameter freqctrl, wavectrl, ampctrl, finectrl;
+ public:
+  VCODroplet(DaisyPatch*, float, DropletState);
+  void Control();
+  void Process(float**, float**, size_t);
+  void Draw();
+};
+
+#endif // CASCADE_DROPLETS_VCO_DROPLET_H_
diff --git a/src/main.cpp b/src/main.cpp
index 9bb1376..3e17ee2 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -8,6 +8,7 @@
 #include "menu.h"
 #include "droplets/droplet.h"
 #include "droplets/noise_droplet.h"
+#include "droplets/vco_droplet.h"
 
 using namespace daisy;
 
@@ -18,9 +19,9 @@ Droplet* droplet;
 int main(void) {
   patch.Init();
   float samplerate = patch.AudioSampleRate();
-  droplet = new NoiseDroplet(&patch,
-			     samplerate,
-			     DropletState::kFull);
+  droplet = new VCODroplet(&patch,
+			   samplerate,
+			   DropletState::kFull);
   patch.StartAdc();
   patch.StartAudio(AudioThrough);