/* ============================================================================== PluginProcessor.h Created: 4 Nov 2025 6:20:37pm Author: mickl ============================================================================== */ #pragma once #include #include "Shifter.h" class WebViewPluginAudioProcessor : public AudioProcessor { public: //============================================================================== WebViewPluginAudioProcessor(AudioProcessorValueTreeState::ParameterLayout layout); //============================================================================== void prepareToPlay(double sampleRate, int samplesPerBlock) override; void releaseResources() override {} bool isBusesLayoutSupported(const BusesLayout& layouts) const override; void processBlock(AudioBuffer&, MidiBuffer&) override; using AudioProcessor::processBlock; //============================================================================== const String getName() const override { return JucePlugin_Name; } bool acceptsMidi() const override { return false; } bool producesMidi() const override { return false; } bool isMidiEffect() const override { return false; } double getTailLengthSeconds() const override { return 0.0; } //============================================================================== int getNumPrograms() override { return 1; } int getCurrentProgram() override { return 0; } void setCurrentProgram(int) override {} const String getProgramName(int) override { return {}; } void changeProgramName(int, const String&) override {} //============================================================================== void getStateInformation(MemoryBlock& destData) override; void setStateInformation(const void* data, int sizeInBytes) override; bool new_midi = false; struct Parameters { public: explicit Parameters(AudioProcessorValueTreeState::ParameterLayout& layout) { sliderIds.push_back("formantPreserve"); addToLayout(layout, ParameterID{ "formantPreserve" }, "Formant Preserve", NormalisableRange {0.0f, 1.0f, .01f}, .5f); sliderIds.push_back("autoTuneDepth"); addToLayout(layout, ParameterID("autoTuneDepth"), "AutoTune Depth", NormalisableRange {0.0f, 1.1f, .01f}, .5f); sliderIds.push_back("autoTuneSpeed"); addToLayout(layout, ParameterID("autoTuneSpeed"), "AutoTune Speed", NormalisableRange {0.001f, 0.1f, .001f}, .5f); sliderIds.push_back("harmonyMix"); addToLayout(layout, ParameterID("harmonyMix"), "Harmony Mix", NormalisableRange {0.0f, 1.0f, .01f}, .01f); sliderIds.push_back("portTime"); addToLayout(layout, ParameterID("portTime"), "Portamento Speed", NormalisableRange {0.001f, 0.2f, .001f}, .01f); toggleIds.push_back("autoTuneEnabled"); addToLayout(layout, ParameterID("autoTuneEnabled"), "AutoTune Enabled", false); toggleIds.push_back("freezeEnabled"); addToLayout(layout, ParameterID("freezeEnabled"), "Freeze Enabled", false); } /*AudioParameterFloat& formantPreserve; AudioParameterFloat& autoTuneSpeed; AudioParameterFloat& autoTuneDepth; AudioParameterFloat& portTime;*/ std::vector sliderIds; std::vector toggleIds; /*AudioParameterBool& mute; AudioParameterChoice& filterType;*/ private: template static void add(AudioProcessorParameterGroup& group, std::unique_ptr param) { group.addChild(std::move(param)); } template static void add(AudioProcessorValueTreeState::ParameterLayout& group, std::unique_ptr param) { group.add(std::move(param)); } template static Param& addToLayout(Group& layout, Ts&&... ts) { auto param = std::make_unique(std::forward(ts)...); auto& ref = *param; add(layout, std::move(param)); return ref; } }; Parameters parameters; AudioProcessorValueTreeState state; SpinLock midiLock; /*std::vector spectrumData = [] { return std::vector(256, 0.0f); }(); SpinLock spectrumDataLock; SpectralBars spectralBars;*/ dsp::LadderFilter filter; Shifter shifter; private: //============================================================================== JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(WebViewPluginAudioProcessor) };