From 7311a258c90b6788805a31e90bceaab167e4ca82 Mon Sep 17 00:00:00 2001 From: Roland Rabien Date: Thu, 31 Aug 2023 11:17:49 -0700 Subject: [PATCH] Finish UI --- CMakeLists.txt | 3 +- modules/gin | 2 +- .../Wavetables/Analog/Analog Classic.wav | Bin 0 -> 32904 bytes plugin/Resources/layout.json | 133 +++++++++++++++--- plugin/Source/Editor.cpp | 1 - plugin/Source/Editor.h | 1 - plugin/Source/Panels.h | 44 ++---- plugin/Source/PluginEditor.cpp | 13 +- plugin/Source/PluginEditor.h | 1 + plugin/Source/PluginProcessor.cpp | 9 +- plugin/Source/PluginProcessor.h | 2 +- plugin/Source/WavetableVoice.cpp | 21 +-- plugin/Source/WavetableVoice.h | 2 +- 13 files changed, 165 insertions(+), 67 deletions(-) create mode 100644 plugin/Resources/Wavetables/Analog/Analog Classic.wav diff --git a/CMakeLists.txt b/CMakeLists.txt index 664bbfb..f4d01d1 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -4,7 +4,7 @@ cmake_minimum_required (VERSION 3.24.0 FATAL_ERROR) # Set for each plugin # set (PLUGIN_NAME Wavetable) -set (PLUGIN_VERSION 1.0.0) +set (PLUGIN_VERSION 0.0.1) set (BUNDLE_ID com.socalabs.Wavetable) set (AU_ID WavetableAU) set (LV2_URI "https://socalabs.com/wavetable/") @@ -96,6 +96,7 @@ set_property (DIRECTORY APPEND PROPERTY LABELS Assets) juce_add_binary_data (${PLUGIN_NAME}_Assets SOURCES "./plugin/Resources/layout.json" + "./plugin/Resources/Wavetables/Analog/Analog Classic.wav" "./plugin/Resources/Wavetables/Analog/Analog PWM Square 03.wav" "./plugin/Resources/Wavetables/Analog/Analog PWM Sub 06.wav" "./plugin/Resources/Wavetables/Analog/Analog PWM Sub 07.wav" diff --git a/modules/gin b/modules/gin index 61a4618..3ed8ab1 160000 --- a/modules/gin +++ b/modules/gin @@ -1 +1 @@ -Subproject commit 61a4618d11e8049365000a0027e57edd24de86cf +Subproject commit 3ed8ab15c16bbee9ddf6f96612fe1999baa395d6 diff --git a/plugin/Resources/Wavetables/Analog/Analog Classic.wav b/plugin/Resources/Wavetables/Analog/Analog Classic.wav new file mode 100644 index 0000000000000000000000000000000000000000..31df890b33eff27257b62a3125bbc66189861875 GIT binary patch literal 32904 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%0DBvIqP?g+&92w3(k|65z|O{wXeVk% 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 Rzbwpu7r6hqu>Z%{{{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); + addControl (new gin::Knob (preset.attack), 0, 1); + addControl (new gin::Knob (preset.decay), 1, 1); + addControl (new gin::Knob (preset.sustain), 2, 1); + addControl (new gin::Knob (preset.release), 3, 1); + addControl (new gin::Knob (preset.velocityTracking), 4, 1); } WavetableAudioProcessor& proc; @@ -385,7 +389,7 @@ public: addModSource (new gin::ModulationSourceButton (proc.modMatrix, proc.modSrcStep, true)); addModSource (new gin::ModulationSourceButton (proc.modMatrix, proc.modSrcMonoStep, false)); - addControl (new gin::Knob (prs.beat), 0, 1); + addControl (new gin::Select (prs.beat), 0, 1); addControl (new gin::Knob (prs.length), 1, 1); auto g = new gin::StepLFOComponent (Cfg::numStepLFOSteps); @@ -524,6 +528,9 @@ public: addControl (new gin::Switch (proc.delayParams.sync), 0, 1); addControl (new gin::Knob (proc.delayParams.mix), 1.5f, 1.0f); + t->setName ("Delay1"); + b->setName ("Delay2"); + watchParam (proc.delayParams.sync); setSize (168, 163); @@ -564,30 +571,3 @@ public: WavetableAudioProcessor& proc; }; - -//============================================================================== -class ScopeArea : public gin::ParamArea -{ -public: - ScopeArea (WavetableAudioProcessor& proc_) - : gin::ParamArea ("Scope"), proc (proc_) - { - setName ("scope"); - - scope = new gin::TriggeredScope (proc.scopeFifo); - scope->setNumChannels (2); - scope->setTriggerMode (gin::TriggeredScope::TriggerMode::Up); - scope->setColour (gin::TriggeredScope::lineColourId, juce::Colours::transparentBlack); - addControl (scope); - - setSize (272, 163); - } - - void resized() override - { - scope->setBounds (getLocalBounds().withSizeKeepingCentre (getWidth(), 140)); - } - - WavetableAudioProcessor& proc; - gin::TriggeredScope* scope; -}; diff --git a/plugin/Source/PluginEditor.cpp b/plugin/Source/PluginEditor.cpp index 5863181..2677275 100644 --- a/plugin/Source/PluginEditor.cpp +++ b/plugin/Source/PluginEditor.cpp @@ -5,9 +5,18 @@ WavetableAudioProcessorEditor::WavetableAudioProcessorEditor (WavetableAudioProcessor& p) : ProcessorEditor (p), vaProc (p) { - addAndMakeVisible (editor); + scope.setName ("scope"); + scope.setNumChannels (2); + scope.setTriggerMode (gin::TriggeredScope::TriggerMode::Up); + scope.setColour (gin::TriggeredScope::traceColourId + 0, findColour(gin::PluginLookAndFeel::accentColourId, true).withAlpha (0.7f)); + scope.setColour (gin::TriggeredScope::traceColourId + 1, findColour(gin::PluginLookAndFeel::accentColourId, true).withAlpha (0.7f)); + scope.setColour (gin::TriggeredScope::lineColourId, juce::Colours::transparentBlack); - setSize (901, 753); + addAndMakeVisible (editor); + addAndMakeVisible (scope); + scope.setBounds (674, 5, 177, 30); + + setSize (901, 671); } WavetableAudioProcessorEditor::~WavetableAudioProcessorEditor() diff --git a/plugin/Source/PluginEditor.h b/plugin/Source/PluginEditor.h index eba4b01..b39cdc9 100644 --- a/plugin/Source/PluginEditor.h +++ b/plugin/Source/PluginEditor.h @@ -21,6 +21,7 @@ public: private: WavetableAudioProcessor& vaProc; + gin::TriggeredScope scope { vaProc.scopeFifo }; Editor editor { vaProc }; #if JUCE_DEBUG diff --git a/plugin/Source/PluginProcessor.cpp b/plugin/Source/PluginProcessor.cpp index 84aa2a1..6ac18e4 100644 --- a/plugin/Source/PluginProcessor.cpp +++ b/plugin/Source/PluginProcessor.cpp @@ -110,6 +110,8 @@ void WavetableAudioProcessor::OSCParams::setup (WavetableAudioProcessor& p, int detune = p.addExtParam (id + "detune", nm + "Detune", "Detune", "", { 0.0, 0.5, 0.0, 1.0 }, 0.0, 0.0f); spread = p.addExtParam (id + "spread", nm + "Spread", "Spread", "%", { -100.0, 100.0, 0.0, 1.0 }, 0.0, 0.0f); pan = p.addExtParam (id + "pan", nm + "Pan", "Pan", "", { -1.0, 1.0, 0.0, 1.0 }, 0.0, 0.0f); + formant = p.addExtParam (id + "formant", nm + "Formant", "Formant", "", { -1.0, 1.0, 0.0, 1.0 }, 0.0, 0.0f); + bend = p.addExtParam (id + "bend", nm + "Bend", "Bend", "", { -1.0, 1.0, 0.0, 1.0 }, 0.0, 0.0f); level->conversionFunction = [] (float in) { return juce::Decibels::decibelsToGain (in); }; } @@ -354,7 +356,7 @@ static bool loadWaveTable (juce::OwnedArray& table, } //============================================================================== -WavetableAudioProcessor::WavetableAudioProcessor() +WavetableAudioProcessor::WavetableAudioProcessor() : gin::Processor (false) { lf = std::make_unique(); @@ -398,6 +400,7 @@ WavetableAudioProcessor::WavetableAudioProcessor() } setupModMatrix(); + init(); } WavetableAudioProcessor::~WavetableAudioProcessor() @@ -683,7 +686,9 @@ gin::WTOscillator::Params WavetableAudioProcessor::getLiveWTParams (int osc) return vav->getLiveWTParams (osc); gin::WTOscillator::Params p; - p.pw = oscParams[osc].pos->getValue(); + p.position = oscParams[osc].pos->getUserValue() / 100.0f; + p.formant = oscParams[osc].formant->getUserValue(); + p.bend = oscParams[osc].bend->getUserValue(); return p; } diff --git a/plugin/Source/PluginProcessor.h b/plugin/Source/PluginProcessor.h index 5fb72bc..12f97d2 100644 --- a/plugin/Source/PluginProcessor.h +++ b/plugin/Source/PluginProcessor.h @@ -48,7 +48,7 @@ public: { OSCParams() = default; - gin::Parameter::Ptr enable, voices, tune, finetune, level, pos, detune, spread, pan; + gin::Parameter::Ptr enable, voices, tune, finetune, level, pos, detune, spread, pan, bend, formant; void setup (WavetableAudioProcessor& p, int idx); diff --git a/plugin/Source/WavetableVoice.cpp b/plugin/Source/WavetableVoice.cpp index a1375a5..1cfa9f3 100644 --- a/plugin/Source/WavetableVoice.cpp +++ b/plugin/Source/WavetableVoice.cpp @@ -211,14 +211,15 @@ void WavetableVoice::updateParams (int blockSize) currentMidiNotes[i] += float (note.totalPitchbendInSemitones); currentMidiNotes[i] += getValue (proc.oscParams[i].tune) + getValue (proc.oscParams[i].finetune) / 100.0f; - oscParams[i].wave = gin::Wave::wavetable; - oscParams[i].voices = int (proc.oscParams[i].voices->getProcValue()); - oscParams[i].vcTrns = 0; - oscParams[i].pw = getValue (proc.oscParams[i].pos) / 100.0f; - oscParams[i].pan = getValue (proc.oscParams[i].pan); - oscParams[i].spread = getValue (proc.oscParams[i].spread) / 100.0f; - oscParams[i].detune = getValue (proc.oscParams[i].detune); - oscParams[i].gain = getValue (proc.oscParams[i].level); + oscParams[i].voices = int (proc.oscParams[i].voices->getProcValue()); + oscParams[i].vcTrns = 0; + oscParams[i].position = getValue (proc.oscParams[i].pos) / 100.0f; + oscParams[i].pan = getValue (proc.oscParams[i].pan); + oscParams[i].spread = getValue (proc.oscParams[i].spread) / 100.0f; + oscParams[i].detune = getValue (proc.oscParams[i].detune); + oscParams[i].gain = getValue (proc.oscParams[i].level); + oscParams[i].formant = getValue (proc.oscParams[i].formant); + oscParams[i].bend = getValue (proc.oscParams[i].bend); } if (proc.subParams.enable->isOn()) @@ -412,6 +413,8 @@ float WavetableVoice::getFilterCutoffNormalized() gin::WTOscillator::Params WavetableVoice::getLiveWTParams (int osc) { gin::WTOscillator::Params p; - p.pw = getValue (proc.oscParams[osc].pos) / 100.0f; + p.position = getValue (proc.oscParams[osc].pos) / 100.0f; + p.formant = getValue (proc.oscParams[osc].formant); + p.bend = getValue (proc.oscParams[osc].bend); return p; } diff --git a/plugin/Source/WavetableVoice.h b/plugin/Source/WavetableVoice.h index 201def8..734c0e5 100644 --- a/plugin/Source/WavetableVoice.h +++ b/plugin/Source/WavetableVoice.h @@ -49,7 +49,7 @@ private: gin::AnalogADSR adsr; float currentMidiNotes[Cfg::numOSCs]; - gin::WTVoicedStereoOscillator::Params oscParams[Cfg::numOSCs]; + gin::WTVoicedStereoOscillatorParams oscParams[Cfg::numOSCs]; float subNote = 0.0f; gin::StereoOscillator::Params subParams;