Initial Commit

This commit is contained in:
Roland Rabien 2020-05-20 16:44:46 -07:00
commit 73110bbde2
20 changed files with 2600 additions and 0 deletions

420
plugin/Source/Boxes.h Normal file
View file

@ -0,0 +1,420 @@
#pragma once
#include <JuceHeader.h>
#include "PluginProcessor.h"
#include "Cfg.h"
//==============================================================================
class CommonBox : public gin::PagedControlBox
{
public:
CommonBox (gin::ProcessorEditor& e, WavetableAudioProcessor& proc_)
: gin::PagedControlBox (e), proc (proc_)
{
auto& g = proc.globalParams;
addPage ("Main", 3, 2);
addControl (0, new gin::Knob (g.level), 0, 0);
addControl (0, new gin::Switch (g.mono), 1, 0);
addControl (0, new gin::Select (g.glideMode), 2, 0);
addControl (0, v = new gin::Knob (g.voices), 0, 1);
addControl (0, l = new gin::Switch (g.legato), 1, 1);
addControl (0, s = new gin::Knob (g.glideRate), 2, 1);
watchParam (g.mono);
watchParam (g.glideMode);
addPage ("Control", 1, 2);
addControl (1, new gin::Switch (g.mpe), 0, 0);
}
void paramChanged() override
{
gin::PagedControlBox::paramChanged();
auto& g = proc.globalParams;
v->setEnabled (! g.mono->isOn());
l->setEnabled (g.glideMode->getProcValue() != 0.0f);
s->setEnabled (g.glideMode->getProcValue() != 0.0f);
}
WavetableAudioProcessor& proc;
ParamComponentPtr v, l, s;
};
//==============================================================================
class OscillatorBox : public gin::PagedControlBox
{
public:
OscillatorBox (gin::ProcessorEditor& e, WavetableAudioProcessor& proc_)
: gin::PagedControlBox (e), proc (proc_)
{
for ( int i = 0; i < numElementsInArray (proc.wtParams); i++)
{
auto& wt = proc.wtParams[i];
addPage ("WT " + String (i + 1), 3, 4);
addPageEnable (i * 2, wt.enable);
addControl (i * 2, new gin::Knob (wt.tune, true), 1, 0);
addControl (i * 2, new gin::Knob (wt.finetune, true), 2, 0);
addControl (i * 2, new gin::Knob (wt.pan, true), 0, 1);
addControl (i * 2, new gin::Knob (wt.level), 1, 1);
addPage ("Unison " + String (i + 1), 2, 4);
addControl (i * 2 + 1, new gin::Knob (wt.voices), 0, 0);
addControl (i * 2 + 1, trans[i] = new gin::Knob (wt.voicesTrns, true), 1, 0);
addControl (i * 2 + 1, detune[i] = new gin::Knob (wt.detune), 0, 1);
addControl (i * 2 + 1, spread[i] = new gin::Knob (wt.spread), 1, 1);
watchParam (wt.voices);
}
for ( int i = 0; i < numElementsInArray (proc.oscParams); i++)
{
auto& osc = proc.oscParams[i];
addPage ("OSC " + String (i + 1), 3, 4);
addPageEnable (i * 2, osc.enable);
addControl (Cfg::numWTs * 2 + i * 2, new gin::Select (osc.wave), 0, 0);
addControl (Cfg::numWTs * 2 + i * 2, new gin::Knob (osc.tune, true), 1, 0);
addControl (Cfg::numWTs * 2 + i * 2, new gin::Knob (osc.finetune, true), 2, 0);
addControl (Cfg::numWTs * 2 + i * 2, new gin::Knob (osc.pan, true), 0, 1);
addControl (Cfg::numWTs * 2 + i * 2, new gin::Knob (osc.level), 1, 1);
addControl (Cfg::numWTs * 2 + i * 2, pw[Cfg::numWTs + i] = new gin::Knob (osc.pulsewidth), 2, 1);
watchParam (osc.wave);
addPage ("Unison " + String (i + 1), 2, 4);
addControl (Cfg::numWTs * 2 + i * 2 + 1, new gin::Knob (osc.voices), 0, 0);
addControl (Cfg::numWTs * 2 + i * 2 + 1, trans[Cfg::numWTs + i] = new gin::Knob (osc.voicesTrns, true), 1, 0);
addControl (Cfg::numWTs * 2 + i * 2 + 1, detune[Cfg::numWTs + i] = new gin::Knob (osc.detune), 0, 1);
addControl (Cfg::numWTs * 2 + i * 2 + 1, spread[Cfg::numWTs + i] = new gin::Knob (osc.spread), 1, 1);
watchParam (osc.voices);
}
setPageOpen (0, true);
setPageOpen (2, true);
setPageOpen (4, true);
}
void paramChanged() override
{
gin::PagedControlBox::paramChanged();
for ( int i = 0; i < numElementsInArray (proc.wtParams); i++)
{
auto& wt = proc.oscParams[i];
trans[i]->setEnabled (wt.voices->getProcValue() > 1);
detune[i]->setEnabled (wt.voices->getProcValue() > 1);
spread[i]->setEnabled (wt.voices->getProcValue() > 1);
}
for ( int i = 0; i < numElementsInArray (proc.oscParams); i++)
{
auto& osc = proc.oscParams[i];
pw[Cfg::numWTs + i]->setEnabled ((gin::Wave) int (osc.wave->getProcValue()) == gin::Wave::pulse);
trans[Cfg::numWTs + i]->setEnabled (osc.voices->getProcValue() > 1);
detune[Cfg::numWTs + i]->setEnabled (osc.voices->getProcValue() > 1);
spread[Cfg::numWTs + i]->setEnabled (osc.voices->getProcValue() > 1);
}
}
WavetableAudioProcessor& proc;
ParamComponentPtr pw[Cfg::numOSCs + Cfg::numWTs], trans[Cfg::numOSCs + Cfg::numWTs],
detune[Cfg::numOSCs + Cfg::numWTs], spread[Cfg::numOSCs + Cfg::numWTs];
};
//==============================================================================
class FilterAmpBox : public gin::PagedControlBox
{
public:
FilterAmpBox (gin::ProcessorEditor& e, WavetableAudioProcessor& proc_)
: gin::PagedControlBox (e), proc (proc_)
{
for (int i = 0; i < numElementsInArray (proc.filterParams); i++)
{
auto& flt = proc.filterParams[i];
addPage ("Filter " + String (i + 1), 8, 2);
addBottomButton (i, new gin::ModulationSourceButton (proc.modMatrix, proc.modSrcFilter[i], true));
addPageEnable (i, flt.enable);
addControl (i, new gin::Select (flt.type), 0, 0);
auto freq = new gin::Knob (flt.frequency);
addControl (i, freq, 1, 0);
addControl (i, new gin::Knob (flt.resonance), 2, 0);
addControl (i, new gin::Knob (flt.keyTracking), 0, 1);
addControl (i, new gin::Knob (flt.amount, true), 1, 1);
addControl (i, v[i] = new gin::Knob (flt.velocityTracking), 2, 1);
adsr[i] = new gin::ADSRComponent ();
adsr[i]->setParams (flt.attack, flt.decay, flt.sustain, flt.release);
addControl (i, adsr[i], 3, 0, 3, 2);
addControl (i, a[i] = new gin::Knob (flt.attack), 6, 0);
addControl (i, d[i] = new gin::Knob (flt.decay), 7, 0);
addControl (i, s[i] = new gin::Knob (flt.sustain), 6, 1);
addControl (i, r[i] = new gin::Knob (flt.release), 7, 1);
watchParam (flt.amount);
freq->setLiveValuesCallback ([this, i] ()
{
if (proc.filterParams[i].amount->getUserValue() != 0.0f ||
proc.filterParams[i].keyTracking->getUserValue() != 0.0f ||
proc.modMatrix.isModulated (gin::ModDstId (proc.filterParams[i].frequency->getModIndex())))
return proc.getLiveFilterCutoff (i);
return Array<float>();
});
int n = numElementsInArray (proc.filterParams);
auto& env = proc.adsrParams;
addPage ("ADSR", 8, 2);
addControl (n, new gin::Knob (env.attack), 0, 0);
addControl (n, new gin::Knob (env.decay), 1, 0);
addControl (n, new gin::Knob (env.sustain), 0, 1);
addControl (n, new gin::Knob (env.release), 1, 1);
addControl (n, new gin::Knob (env.velocityTracking), 2, 0);
auto g = new gin::ADSRComponent ();
g->setParams (env.attack, env.decay, env.sustain, env.release);
addControl (n, g, 3, 0, 3, 2);
}
}
void paramChanged () override
{
gin::PagedControlBox::paramChanged ();
for ( int i = 0; i < numElementsInArray (proc.filterParams); i++)
{
auto& flt = proc.filterParams[i];
v[i]->setEnabled (flt.amount->getUserValue() != 0.0f);
a[i]->setEnabled (flt.amount->getUserValue() != 0.0f);
d[i]->setEnabled (flt.amount->getUserValue() != 0.0f);
s[i]->setEnabled (flt.amount->getUserValue() != 0.0f);
r[i]->setEnabled (flt.amount->getUserValue() != 0.0f);
adsr[i]->setEnabled (flt.amount->getUserValue() != 0.0f);
}
}
WavetableAudioProcessor& proc;
ParamComponentPtr v[Cfg::numFilters], a[Cfg::numFilters], d[Cfg::numFilters], s[Cfg::numFilters], r[Cfg::numFilters];
gin::ADSRComponent* adsr[Cfg::numFilters];
};
//==============================================================================
class ModulationBox : public gin::PagedControlBox
{
public:
ModulationBox (gin::ProcessorEditor& e, WavetableAudioProcessor& proc_)
: gin::PagedControlBox (e), proc (proc_)
{
int cnt = 0;
for (int i = 0; i < numElementsInArray (proc.lfoParams); i++, cnt++)
{
auto& lfo = proc.lfoParams[i];
addPage ("LFO" + String (i + 1), 5, 2);
addPageEnable (cnt, lfo.enable);
addBottomButton (cnt, new gin::ModulationSourceButton (proc.modMatrix, proc.modSrcLFO[i], true));
addBottomButton (cnt, new gin::ModulationSourceButton (proc.modMatrix, proc.modSrcMonoLFO[i], false));
addControl (cnt, new gin::Select (lfo.wave), 0, 0);
addControl (cnt, new gin::Switch (lfo.sync), 1, 0);
addControl (cnt, r[i] = new gin::Knob (lfo.rate), 2, 0);
addControl (cnt, b[i] = new gin::Select (lfo.beat), 2, 0);
addControl (cnt, new gin::Knob (lfo.depth, true), 0, 1);
addControl (cnt, new gin::Knob (lfo.phase, true), 1, 1);
addControl (cnt, new gin::Knob (lfo.offset, true), 2, 1);
addControl (cnt, new gin::Knob (lfo.fade, true), 3, 1);
addControl (cnt, new gin::Knob (lfo.delay), 4, 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 (cnt, l, 3, 0, 2, 1);
watchParam (lfo.sync);
}
for (int i = 0; i < numElementsInArray (proc.envParams); i++, cnt++)
{
auto& env = proc.envParams[i];
addPage ("ENV" + String (i + 1), 5, 2);
addPageEnable (cnt, env.enable);
addBottomButton (cnt, new gin::ModulationSourceButton (proc.modMatrix, proc.modSrcEnv[i], true));
addControl (cnt, new gin::Knob (env.attack), 0, 0);
addControl (cnt, new gin::Knob (env.decay), 1, 0);
addControl (cnt, new gin::Knob (env.sustain), 0, 1);
addControl (cnt, new gin::Knob (env.release), 1, 1);
auto adsr = new gin::ADSRComponent ();
adsr->setParams (env.attack, env.decay, env.sustain, env.release);
addControl (cnt, adsr, 2, 0, 3, 2);
}
auto& stp = proc.stepLfoParams;
addPage ("Step", 6, 2);
addPageEnable (cnt, stp.enable);
addBottomButton (cnt, new gin::ModulationSourceButton (proc.modMatrix, proc.modSrcStep, true));
addBottomButton (cnt, new gin::ModulationSourceButton (proc.modMatrix, proc.modSrcMonoStep, false));
addControl (cnt, new gin::Select (stp.beat), 0, 0);
addControl (cnt, new gin::Knob (stp.length), 0, 1);
auto s = new gin::StepLFOComponent();
s->setParams (stp.beat, stp.length, stp.level, stp.enable);
addControl (cnt, s, 1, 0, 5, 2);
cnt++;
addPage ("All", 5, 2);
addControl (cnt, new gin::ModSrcListBox (proc.modMatrix), 0, 0, 5, 2);
cnt++;
addPage ("Mod Matrix", 5, 2);
addControl (cnt, new gin::ModMatrixBox (proc, proc.modMatrix), 0, 0, 5, 2);
cnt++;
}
void paramChanged () override
{
gin::PagedControlBox::paramChanged ();
for (int i = 0; i < numElementsInArray (proc.lfoParams); i++)
{
auto& lfo = proc.lfoParams[i];
r[i]->setVisible (! lfo.sync->isOn());
b[i]->setVisible (lfo.sync->isOn());
}
}
WavetableAudioProcessor& proc;
ParamComponentPtr r[Cfg::numLFOs], b[Cfg::numLFOs];
};
//==============================================================================
class EffectsBox : public gin::PagedControlBox
{
public:
EffectsBox (gin::ProcessorEditor& e, WavetableAudioProcessor& proc_)
: gin::PagedControlBox (e), proc (proc_)
{
int idx = 0;
addPage ("Gate", 8, 2);
addPageEnable (idx, proc.gateParams.enable);
addControl (idx, new gin::Select (proc.gateParams.beat), 0, 0);
addControl (idx, new gin::Knob (proc.gateParams.length), 1, 0);
addControl (idx, new gin::Knob (proc.gateParams.attack), 0, 1);
addControl (idx, new gin::Knob (proc.gateParams.release), 1, 1);
auto g = new gin::GateEffectComponent ();
g->setParams (proc.gateParams.length, proc.gateParams.l, proc.gateParams.r, proc.gateParams.enable);
addControl (idx, g, 2, 0, 6, 2);
idx++;
addPage ("Chorus", 3, 2);
addPageEnable (idx, proc.chorusParams.enable);
addControl (idx, new gin::Knob (proc.chorusParams.delay), 0, 0);
addControl (idx, new gin::Knob (proc.chorusParams.rate), 1, 0);
addControl (idx, new gin::Knob (proc.chorusParams.depth), 2, 0);
addControl (idx, new gin::Knob (proc.chorusParams.width), 0, 1);
addControl (idx, new gin::Knob (proc.chorusParams.mix), 1, 1);
idx++;
addPage ("Distortion", 2, 2);
addPageEnable (idx, proc.distortionParams.enable);
addControl (idx, new gin::Knob (proc.distortionParams.amount), 0, 0);
addControl (idx, new gin::Knob (proc.distortionParams.highpass), 1, 0);
addControl (idx, new gin::Knob (proc.distortionParams.output), 0, 1);
addControl (idx, new gin::Knob (proc.distortionParams.mix), 1, 1);
idx++;
addPage ("EQ", 6, 2);
addPageEnable (idx, proc.eqParams.enable);
addControl (idx, new gin::Knob (proc.eqParams.loFreq), 0, 0);
addControl (idx, new gin::Knob (proc.eqParams.loGain), 1, 0);
addControl (idx, new gin::Knob (proc.eqParams.loQ), 2, 0);
addControl (idx, new gin::Knob (proc.eqParams.mid1Freq), 3, 0);
addControl (idx, new gin::Knob (proc.eqParams.mid1Gain), 4, 0);
addControl (idx, new gin::Knob (proc.eqParams.mid1Q), 5, 0);
addControl (idx, new gin::Knob (proc.eqParams.mid2Freq), 0, 1);
addControl (idx, new gin::Knob (proc.eqParams.mid2Gain), 1, 1);
addControl (idx, new gin::Knob (proc.eqParams.mid2Q), 2, 1);
addControl (idx, new gin::Knob (proc.eqParams.hiFreq), 3, 1);
addControl (idx, new gin::Knob (proc.eqParams.hiGain), 4, 1);
addControl (idx, new gin::Knob (proc.eqParams.hiQ), 5, 1);
idx++;
addPage ("Comp", 3, 2);
addPageEnable (idx, proc.compressorParams.enable);
addControl (idx, new gin::Knob (proc.compressorParams.attack), 0, 0);
addControl (idx, new gin::Knob (proc.compressorParams.release), 1, 0);
addControl (idx, new gin::Knob (proc.compressorParams.ratio), 2, 0);
addControl (idx, new gin::Knob (proc.compressorParams.threshold), 0, 1);
addControl (idx, new gin::Knob (proc.compressorParams.gain), 1, 1);
idx++;
addPage ("Delay", 3, 2);
addPageEnable (idx, proc.delayParams.enable);
addControl (idx, new gin::Switch (proc.delayParams.sync), 0, 0);
addControl (idx, t = new gin::Knob (proc.delayParams.time), 1, 0);
addControl (idx, b = new gin::Select (proc.delayParams.beat), 1, 0);
addControl (idx, new gin::Knob (proc.delayParams.fb), 2, 0);
addControl (idx, new gin::Knob (proc.delayParams.cf), 1, 1);
addControl (idx, new gin::Knob (proc.delayParams.mix), 2, 1);
idx++;
watchParam (proc.delayParams.sync);
addPage ("Reverb", 3, 2);
addPageEnable (idx, proc.reverbParams.enable);
addControl (idx, new gin::Knob (proc.reverbParams.damping), 0, 0);
addControl (idx, new gin::Knob (proc.reverbParams.freezeMode), 1, 0);
addControl (idx, new gin::Knob (proc.reverbParams.roomSize), 2, 0);
addControl (idx, new gin::Knob (proc.reverbParams.width), 0, 1);
addControl (idx, new gin::Knob (proc.reverbParams.mix), 1, 1);
idx++;
addPage ("Limiter", 2, 2);
addPageEnable (idx, proc.limiterParams.enable);
addControl (idx, new gin::Knob (proc.limiterParams.attack), 0, 0);
addControl (idx, new gin::Knob (proc.limiterParams.release), 1, 0);
addControl (idx, new gin::Knob (proc.limiterParams.threshold), 0, 1);
addControl (idx, new gin::Knob (proc.limiterParams.gain), 1, 1);
idx++;
addPage ("Scope", 8, 2);
auto scope = new gin::TriggeredScope (proc.fifo);
scope->setNumChannels (2);
scope->setTriggerMode (gin::TriggeredScope::TriggerMode::Up);
scope->setColour (gin::TriggeredScope::lineColourId, Colours::transparentBlack);
addControl (idx, scope, 0, 0, 8, 2);
idx++;
setPageOpen (0, false);
}
void paramChanged () override
{
gin::PagedControlBox::paramChanged ();
t->setVisible (! proc.delayParams.sync->isOn());
b->setVisible (proc.delayParams.sync->isOn());
}
WavetableAudioProcessor& proc;
ParamComponentPtr t, b;
};