wavetable/plugin/Source/PluginProcessor.h

287 lines
8.1 KiB
C
Raw Normal View History

2020-05-20 16:44:46 -07:00
#pragma once
#include <JuceHeader.h>
#include "WavetableVoice.h"
//==============================================================================
class WavetableAudioProcessor : public gin::Processor,
2023-08-23 08:45:23 -07:00
public gin::Synthesiser
2020-05-20 16:44:46 -07:00
{
public:
//==============================================================================
WavetableAudioProcessor();
~WavetableAudioProcessor() override;
2023-09-06 09:53:13 -07:00
bool supportsMPE() const override { return true; }
2020-05-20 16:44:46 -07:00
void stateUpdated() override;
void updateState() override;
//==============================================================================
void reset() override;
void prepareToPlay (double sampleRate, int samplesPerBlock) override;
void releaseResources() override;
2023-08-23 08:45:23 -07:00
void processBlock (juce::AudioBuffer<float>&, juce::MidiBuffer&) override;
2020-05-20 16:44:46 -07:00
//==============================================================================
2023-08-23 08:45:23 -07:00
juce::AudioProcessorEditor* createEditor() override;
2020-05-20 16:44:46 -07:00
bool hasEditor() const override;
void updateParams (int blockSize);
void setupModMatrix();
//==============================================================================
2023-08-23 08:45:23 -07:00
void handleMidiEvent (const juce::MidiMessage& m) override;
2020-05-20 16:44:46 -07:00
void handleController (int ch, int num, int val) override;
//==============================================================================
2023-08-23 11:21:37 -07:00
juce::Array<float> getLiveFilterCutoff();
2023-08-25 08:24:15 -07:00
gin::WTOscillator::Params getLiveWTParams (int osc);
2020-05-20 16:44:46 -07:00
2023-08-25 13:26:25 -07:00
void reloadWavetables();
void incWavetable (int osc, int delta);
2023-08-27 07:57:23 -07:00
void loadUserWavetable (int osc, const juce::File f);
2023-08-25 13:26:25 -07:00
2023-08-23 08:45:23 -07:00
void applyEffects (juce::AudioSampleBuffer& buffer);
bool loadWaveTable (juce::OwnedArray<gin::BandLimitedLookupTable>& table, double sr, const juce::MemoryBlock& wav, const juce::String& format);
2020-05-20 16:44:46 -07:00
// Voice Params
struct OSCParams
{
OSCParams() = default;
2023-08-31 11:17:49 -07:00
gin::Parameter::Ptr enable, voices, tune, finetune, level, pos, detune, spread, pan, bend, formant;
2020-05-20 16:44:46 -07:00
void setup (WavetableAudioProcessor& p, int idx);
JUCE_DECLARE_NON_COPYABLE (OSCParams)
};
struct SubParams
{
SubParams() = default;
gin::Parameter::Ptr enable, wave, tune, level, pan;
void setup (WavetableAudioProcessor& p);
JUCE_DECLARE_NON_COPYABLE (SubParams)
};
struct NoiseParams
{
NoiseParams() = default;
2023-08-25 08:24:15 -07:00
2023-08-31 19:19:28 -07:00
gin::Parameter::Ptr enable, type, level, pan;
void setup (WavetableAudioProcessor& p);
JUCE_DECLARE_NON_COPYABLE (NoiseParams)
};
2020-05-20 16:44:46 -07:00
struct FilterParams
{
FilterParams() = default;
gin::Parameter::Ptr enable, type, keyTracking, velocityTracking,
frequency, resonance, amount,
2023-08-26 21:59:44 -07:00
attack, decay, sustain, release, wt1, wt2, sub, noise;
2020-05-20 16:44:46 -07:00
2023-08-23 11:21:37 -07:00
void setup (WavetableAudioProcessor& p);
2020-05-20 16:44:46 -07:00
JUCE_DECLARE_NON_COPYABLE (FilterParams)
};
struct EnvParams
{
EnvParams() = default;
gin::Parameter::Ptr enable, attack, decay, sustain, release;
void setup (WavetableAudioProcessor& p, int idx);
JUCE_DECLARE_NON_COPYABLE (EnvParams)
};
struct LFOParams
{
LFOParams() = default;
gin::Parameter::Ptr enable, sync, wave, rate, beat, depth, phase, offset, fade, delay;
void setup (WavetableAudioProcessor& p, int idx);
JUCE_DECLARE_NON_COPYABLE (LFOParams)
};
struct StepLFOParams
{
StepLFOParams() = default;
gin::Parameter::Ptr enable, beat, length;
2023-08-26 19:04:45 -07:00
gin::Parameter::Ptr level[Cfg::numStepLFOSteps] = { nullptr };
2020-05-20 16:44:46 -07:00
void setup (WavetableAudioProcessor& p);
JUCE_DECLARE_NON_COPYABLE (StepLFOParams)
};
struct ADSRParams
{
ADSRParams() = default;
gin::Parameter::Ptr attack, decay, sustain, release, velocityTracking;
void setup (WavetableAudioProcessor& p);
JUCE_DECLARE_NON_COPYABLE (ADSRParams)
};
// Global Params
struct GlobalParams
{
GlobalParams() = default;
gin::Parameter::Ptr mono, glideMode, glideRate, legato, level, voices, mpe;
void setup (WavetableAudioProcessor& p);
JUCE_DECLARE_NON_COPYABLE (GlobalParams)
};
2023-08-26 20:57:45 -07:00
// UI Params
struct UIParams
{
UIParams() = default;
2023-09-08 17:11:50 -07:00
gin::Parameter::Ptr activeLFO, activeENV, activeMOD;
2023-08-26 20:57:45 -07:00
void setup (WavetableAudioProcessor& p);
JUCE_DECLARE_NON_COPYABLE (UIParams)
};
2020-05-20 16:44:46 -07:00
struct GateParams
{
GateParams() = default;
gin::Parameter::Ptr enable, beat, length, attack, release;
2023-08-26 19:04:45 -07:00
gin::Parameter::Ptr l[Cfg::numGateSteps] = { nullptr };
gin::Parameter::Ptr r[Cfg::numGateSteps] = { nullptr };
2020-05-20 16:44:46 -07:00
void setup (WavetableAudioProcessor& p);
JUCE_DECLARE_NON_COPYABLE (GateParams)
};
struct ChorusParams
{
ChorusParams() = default;
gin::Parameter::Ptr enable, delay, rate, depth, width, mix;
void setup (WavetableAudioProcessor& p);
JUCE_DECLARE_NON_COPYABLE (ChorusParams)
};
struct DistortionParams
{
DistortionParams() = default;
2023-08-26 11:17:03 -07:00
gin::Parameter::Ptr enable, amount;
2020-05-20 16:44:46 -07:00
void setup (WavetableAudioProcessor& p);
JUCE_DECLARE_NON_COPYABLE (DistortionParams)
};
struct DelayParams
{
DelayParams() = default;
gin::Parameter::Ptr enable, sync, time, beat, fb, cf, mix, delay;
void setup (WavetableAudioProcessor& p);
JUCE_DECLARE_NON_COPYABLE (DelayParams)
};
struct ReverbParams
{
ReverbParams() = default;
gin::Parameter::Ptr enable, size, decay, lowpass, damping, predelay, mix;
2020-05-20 16:44:46 -07:00
void setup (WavetableAudioProcessor& p);
JUCE_DECLARE_NON_COPYABLE (ReverbParams)
};
//==============================================================================
2023-08-23 11:21:37 -07:00
gin::ModSrcId modSrcPressure, modSrcTimbre, modScrPitchBend, modSrcFilter,
2020-05-20 16:44:46 -07:00
modSrcNote, modSrcVelocity, modSrcStep, modSrcMonoStep;
2023-08-23 11:21:37 -07:00
juce::Array<gin::ModSrcId> modSrcCC, modSrcMonoLFO, modSrcLFO, modSrcEnv;
2020-05-20 16:44:46 -07:00
//==============================================================================
OSCParams oscParams[Cfg::numOSCs];
SubParams subParams;
NoiseParams noiseParams;
2023-08-23 11:21:37 -07:00
FilterParams filterParams;
2020-05-20 16:44:46 -07:00
EnvParams envParams[Cfg::numENVs];
LFOParams lfoParams[Cfg::numLFOs];
StepLFOParams stepLfoParams;
ADSRParams adsrParams;
GlobalParams globalParams;
GateParams gateParams;
ChorusParams chorusParams;
DistortionParams distortionParams;
DelayParams delayParams;
ReverbParams reverbParams;
2023-08-26 20:57:45 -07:00
UIParams uiParams;
2020-05-20 16:44:46 -07:00
//==============================================================================
gin::GateEffect gate;
gin::Modulation chorus { 0.5f };
gin::StereoDelay stereoDelay { 120.1 };
gin::PlateReverb<float, int> reverb;
2020-05-20 16:44:46 -07:00
gin::GainProcessor outputGain;
2023-08-25 13:26:25 -07:00
gin::AudioFifo scopeFifo { 2, 44100 };
2023-08-26 11:17:03 -07:00
float distortionVal = 0.0f;
2020-05-20 16:44:46 -07:00
2023-08-25 08:24:15 -07:00
juce::OwnedArray<gin::BandLimitedLookupTable> osc1Tables;
juce::OwnedArray<gin::BandLimitedLookupTable> osc2Tables;
2023-08-26 11:17:03 -07:00
gin::BandLimitedLookupTables analogTables;
2023-08-25 13:26:25 -07:00
juce::Value osc1Table, osc2Table;
2023-08-27 07:57:23 -07:00
juce::MemoryBlock userTable1, userTable2;
2023-08-25 13:26:25 -07:00
2020-05-20 16:44:46 -07:00
//==============================================================================
gin::ModMatrix modMatrix;
gin::LFO modLFOs[Cfg::numLFOs];
gin::StepLFO modStepLFO;
2023-08-23 08:45:23 -07:00
juce::AudioPlayHead* playhead = nullptr;
2023-09-20 22:08:18 -07:00
bool blockMissed = false;
2023-09-23 11:10:21 -07:00
bool presetLoaded = false;
2020-05-21 21:39:47 -07:00
struct CurTable
{
juce::String name;
double sampleRate = 0.0;
};
CurTable curTables[Cfg::numOSCs];
2023-09-06 09:53:13 -07:00
juce::CriticalSection dspLock;
2020-05-20 16:44:46 -07:00
//==============================================================================
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (WavetableAudioProcessor)
};