#pragma once #include #include "Params.h" #include "PresetBank.h" #include "SynthEngine.h" #include class RMX19AudioProcessor : public juce::AudioProcessor { public: RMX19AudioProcessor(); ~RMX19AudioProcessor() override; void prepareToPlay (double sampleRate, int samplesPerBlock) override; void releaseResources() 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 { return true; } bool producesMidi() const override { return false; } double getTailLengthSeconds() const override { return prm::delaySyncMaxTime() + 1.0; } int getNumPrograms() override; int getCurrentProgram() override; void setCurrentProgram (int) override; const juce::String getProgramName (int) override; void changeProgramName (int, const juce::String&) override; void getStateInformation (juce::MemoryBlock&) override; void setStateInformation (const void*, int) override; juce::AudioProcessorValueTreeState apvts; PresetBank& getBank() { return bank; } SynthEngine& getEngine() { return engine; } int getPatchIndex() const noexcept { return patchIndex; } void selectPatch (int i); int getActiveVoices() const noexcept { return engine.activeVoices(); } juce::uint32 getLastMidiTime() const noexcept { return lastMidi; } float getCpu() const noexcept { return cpu; } private: void processMidi (juce::MidiBuffer&, const VParams&); juce::AudioProcessorValueTreeState::ParameterLayout createParams(); class FxEngine; std::unique_ptr fx; PresetBank bank; SynthEngine engine; int patchIndex = 0; int lastPatchParam = 0; juce::uint32 lastMidi = 0; float cpu = 0.0f; float dcL = 0.0f, dcR = 0.0f, dcPrevL = 0.0f, dcPrevR = 0.0f; juce::AudioBuffer osBuf; // internal 2x oversample target (HQ mode) JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (RMX19AudioProcessor) };