From 6083909d3201b8f8894bf38f68106cb3ed498e03 Mon Sep 17 00:00:00 2001 From: Roland Rabien Date: Sat, 26 Aug 2023 12:33:15 -0700 Subject: [PATCH] More UI work --- modules/gin | 2 +- plugin/Resources/layout.json | 14 +++--- plugin/Source/Editor.cpp | 11 ++--- plugin/Source/Editor.h | 4 +- plugin/Source/Panels.h | 89 ++++++++++++++++++++++++++++++------ 5 files changed, 89 insertions(+), 31 deletions(-) diff --git a/modules/gin b/modules/gin index 11ccb71..f325203 160000 --- a/modules/gin +++ b/modules/gin @@ -1 +1 @@ -Subproject commit 11ccb71b61b735fa2071330df9a349679cd3e01e +Subproject commit f3252033e5e408357e0075ed8730755e0e7b725d diff --git a/plugin/Resources/layout.json b/plugin/Resources/layout.json index 0acd646..52bcfa5 100644 --- a/plugin/Resources/layout.json +++ b/plugin/Resources/layout.json @@ -3,15 +3,17 @@ [ { "id": "osc[1..2]", "x": "0,prevR()+1", "y": 0, "w": "parW()/2", "h": 163 }, { "id": "flt", "x": "0", "y": "prevB()+1", "w": 400, "h": 163 }, - { "id": "noise", "x": "prevR()+1", "y": "prevY()", "w": 60, "h": 163 }, + { "id": "adsr", "x": "prevR()+1", "y": "prevY()", "w": 240, "h": 163 }, + { "id": "noise", "x": "prevR()+1", "y": "prevY()", "w": 120, "h": 163 }, { "id": "sub", "x": "prevR()+1", "y": "prevY()", "w": 120, "h": 163 }, - { "id": "lfo[1..3]", "x": "0,prevR()+1", "y": "prevB()+1,prevY()", "w": 175, "h": 163 }, - { "id": "gate", "x": "prevR()+1", "y": "prevY()", "w": 240, "h": 163 }, - { "id": "scope", "x": "0", "y": "prevB()+1", "w": 175, "h": 163 }, + { "id": "lfo[1..3]", "x": 0, "y": "prevB()+1,prevY()", "w": 340, "h": 163 }, + { "id": "env[1..3]", "x": "getR('lfo1')+1", "y": "prevY()", "w": 240, "h": 163 }, + { "id": "step", "x": "prevR()+1", "y": "prevY()", "w": 240, "h": 163 }, + { "id": "gate", "x": "0", "y": "prevB()+1", "w": 240, "h": 163 }, { "id": "reverb", "x": "prevR()+1", "y": "prevY()", "w": 175, "h": 163 }, { "id": "delay", "x": "prevR()+1", "y": "prevY()", "w": 175, "h": 163 }, - { "id": "distort", "x": "prevR()+1", "y": "prevY()", "w": 175, "h": 163 }, + { "id": "distort", "x": "prevR()+1", "y": "prevY()", "w": 100, "h": 163 }, { "id": "chorus", "x": "prevR()+1", "y": "prevY()", "w": 175, "h": 163 }, - { "id": "lfoArea[1..3]", "x": 0, "y": 0, "w": 0, "h": 0 } + { "id": "scope", "x": 0, "y": "prevB()+1", "w": "parW()-2", "b": "parH()-1" } ] } \ No newline at end of file diff --git a/plugin/Source/Editor.cpp b/plugin/Source/Editor.cpp index 52c5cc0..f82ea56 100644 --- a/plugin/Source/Editor.cpp +++ b/plugin/Source/Editor.cpp @@ -5,18 +5,13 @@ Editor::Editor (WavetableAudioProcessor& proc_) { for (auto& o : oscillators) addAndMakeVisible (o); for (auto& l : lfos) addAndMakeVisible (l); - for (auto& l : lfoGraphs) addAndMakeVisible (l); + for (auto& e : envs) addAndMakeVisible (e); addAndMakeVisible (sub); addAndMakeVisible (noise); + addAndMakeVisible (adsr); addAndMakeVisible (filter); - - for (int i = 0; i < Cfg::numLFOs; i++) - { - addAndMakeVisible (&lfos[i]); - addAndMakeVisible (&lfoGraphs[i]); - } - + addAndMakeVisible (step); addAndMakeVisible (gate); addAndMakeVisible (chorus); addAndMakeVisible (distort); diff --git a/plugin/Source/Editor.h b/plugin/Source/Editor.h index f9fd24d..da1128b 100644 --- a/plugin/Source/Editor.h +++ b/plugin/Source/Editor.h @@ -21,10 +21,12 @@ private: NoiseBox noise { "noise", proc }; SubBox sub { "sub", proc }; + ADSRBox adsr { "adsr", proc }; FilterBox filter { "filter", proc }; LFOBox lfos[Cfg::numLFOs] { { "LFO 1", proc, 0 }, { "LFO 2", proc, 1 }, { "LFO 3", proc, 2 } }; - LFOArea lfoGraphs[Cfg::numLFOs] { { proc, 0 }, { proc, 1 }, { proc, 2 } }; + ENVBox envs[Cfg::numENVs] { { "ENV 1", proc, 0 }, { "ENV 2", proc, 1 }, { "ENV 3", proc, 2 } }; + StepBox step { "step", proc }; GateBox gate { proc }; ChorusBox chorus { proc }; diff --git a/plugin/Source/Panels.h b/plugin/Source/Panels.h index 2f9348a..12485e2 100644 --- a/plugin/Source/Panels.h +++ b/plugin/Source/Panels.h @@ -179,6 +179,32 @@ public: WavetableAudioProcessor& proc; }; +//============================================================================== +class ADSRBox : public gin::ParamBox +{ +public: + ADSRBox (const juce::String& name, WavetableAudioProcessor& proc_) + : gin::ParamBox (name), proc (proc_) + { + setName ("adsr"); + + auto& preset = proc.adsrParams; + + adsr = new gin::ADSRComponent (); + adsr->setParams (preset.attack, preset.decay, preset.sustain, preset.release); + addControl (adsr, 0, 0, 4, 1); + + addControl (a = new gin::Knob (preset.attack), 0, 1); + addControl (d = new gin::Knob (preset.decay), 1, 1); + addControl (s = new gin::Knob (preset.sustain), 2, 1); + addControl (r = new gin::Knob (preset.release), 3, 1); + } + + WavetableAudioProcessor& proc; + gin::ParamComponent::Ptr a, d, s, r; + gin::ADSRComponent* adsr; +}; + //============================================================================== class FilterBox : public gin::ParamBox { @@ -260,6 +286,15 @@ public: addControl (new gin::Knob (lfo.fade, true), 0, 1); addControl (new gin::Knob (lfo.delay), 1, 1); + addControl (new gin::Select (lfo.wave), 2, 1); + addControl (new gin::Switch (lfo.sync), 3, 1); + addControl (new gin::Knob (lfo.phase, true), 4, 1); + addControl (new gin::Knob (lfo.offset, true), 5, 1); + + auto l = new gin::LFOComponent(); + l->setParams (lfo.wave, lfo.sync, lfo.rate, lfo.beat, lfo.depth, lfo.offset, lfo.phase, lfo.enable); + addControl (l, 2, 0, 4, 1); + watchParam (lfo.sync); setSize (112, 163); @@ -280,31 +315,55 @@ public: }; //============================================================================== -class LFOArea : public gin::ParamArea +class ENVBox : public gin::ParamBox { public: - LFOArea (WavetableAudioProcessor& proc_, int idx_) - : proc (proc_), idx (idx_) + ENVBox (const juce::String& name, WavetableAudioProcessor& proc_, int idx_) + : gin::ParamBox (name), proc (proc_), idx (idx_) { - setName ("lfoArea" + juce::String (idx + 1)); + setName ("env" + juce::String (idx + 1)); - auto& lfo = proc.lfoParams[idx]; + auto& env = proc.envParams[idx]; - addControl (new gin::Select (lfo.wave)); - addControl (new gin::Switch (lfo.sync)); - addControl (new gin::Knob (lfo.phase, true)); - addControl (new gin::Knob (lfo.offset, true)); + addEnable (env.enable); - auto l = new gin::LFOComponent(); - l->setParams (lfo.wave, lfo.sync, lfo.rate, lfo.beat, lfo.depth, lfo.offset, lfo.phase, lfo.enable); - addControl (l); + addControl (new gin::Knob (env.attack), 0, 1); + addControl (new gin::Knob (env.decay), 1, 1); + addControl (new gin::Knob (env.sustain), 2, 1); + addControl (new gin::Knob (env.release), 3, 1); - setSize (186, 163); + auto g = new gin::ADSRComponent(); + g->setParams (env.attack, env.decay, env.sustain, env.release); + addControl (g, 0, 0, 4, 1); + + setSize (112, 163); } - void paramChanged () override + WavetableAudioProcessor& proc; + int idx; +}; + +//============================================================================== +class StepBox : public gin::ParamBox +{ +public: + StepBox (const juce::String& name, WavetableAudioProcessor& proc_) + : gin::ParamBox (name), proc (proc_) { - gin::ParamArea::paramChanged (); + setName ("step"); + + auto& prs = proc.stepLfoParams; + + addEnable (prs.enable); + + addControl (new gin::Knob (prs.beat), 0, 1); + addControl (new gin::Knob (prs.length), 1, 1); + + auto g = new gin::StepLFOComponent(); + g->setParams (prs.beat, prs.length, prs.level, prs.enable); + addControl (g, 0, 0, 4, 1); + + setSize (112, 163); } WavetableAudioProcessor& proc;