#pragma once #include #include "SynthEngine.h" #include "Presets.h" class SM26AudioProcessor : public juce::AudioProcessor, public juce::AudioProcessorValueTreeState::Listener { public: SM26AudioProcessor(); ~SM26AudioProcessor() 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 { return true; } const juce::String getName() const override { return "SM-26"; } bool acceptsMidi() const override { return true; } 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 juce::String getProgramName (int) override { return {}; } void changeProgramName (int, const juce::String&) override {} void getStateInformation (juce::MemoryBlock& destData) override; void setStateInformation (const void* data, int sizeInBytes) override; void setKnob (int knob, float value01); void adjustParam (int paramId, float delta01); juce::AudioProcessorValueTreeState apvts; sm26::SynthEngine engine; void setPresetByIndex (int i); int presetCount() const { return sm26::PresetStore::count(); } private: void parameterChanged (const juce::String& parameterID, float newValue) override; void applyPresetKnobs(); std::atomic paramsReady{false}; JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (SM26AudioProcessor) };