#pragma once #include #include #include "Presets.h" #include "HorizontEngine.h" class HorizontAudioProcessor : public juce::AudioProcessor { public: HorizontAudioProcessor(); ~HorizontAudioProcessor() override; void prepareToPlay (double sampleRate, int samplesPerBlock) override; void releaseResources() override; bool isBusesLayoutSupported (const BusesLayout& layouts) const override; void processBlock (juce::AudioBuffer&, juce::MidiBuffer&) override; juce::AudioProcessorEditor* createEditor() override; bool hasEditor() const override; const juce::String getName() const override; bool acceptsMidi() const override; bool producesMidi() const override; double getTailLengthSeconds() const override; int getNumPrograms() override; int getCurrentProgram() override; void setCurrentProgram (int index) override; const juce::String getProgramName (int index) override; void changeProgramName (int index, const juce::String& newName) override; void getStateInformation (juce::MemoryBlock& destData) override; void setStateInformation (const void* data, int sizeInBytes) override; juce::AudioProcessorValueTreeState::ParameterLayout createParameterLayout(); void applyPreset (const Preset& preset); const std::vector& getPresets() const noexcept { return presets; } void pushWetSamples (const float* data, int numToWrite); int readWetSamples (float* dest, int numToRead); void appendDrySamples (const float* data, int numToWrite); int copyRecentDrySamples (float* dest, int numToRead); juce::AudioProcessorValueTreeState apvts; private: void updateParameters(); HorizontEngine engine; std::vector presets; int currentProgram = 0; juce::AbstractFifo wetFifo { 2048 }; juce::AudioBuffer wetRing { 1, 2048 }; std::vector wetScratch; std::vector dryScratch; static constexpr int dryRingSize = 4096; std::vector dryRingLive = std::vector (dryRingSize, 0.0f); std::atomic dryWritePos { 0 }; std::atomic dryTotalWritten { 0 }; std::atomic* lowCutParam = nullptr; std::atomic* highCutParam = nullptr; std::atomic* decayParam = nullptr; std::atomic* sizeParam = nullptr; std::atomic* diffusionParam = nullptr; std::atomic* brightnessParam = nullptr; std::atomic* feedbackParam = nullptr; std::atomic* pitchParam = nullptr; std::atomic* dryWetParam = nullptr; JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (HorizontAudioProcessor) };