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);