#pragma once #include "SynthVoice.h" #include class NeuralAudioEngine : public juce::MPESynthesiser { public: static constexpr auto maxNumVoices = 4; //============================================================================== NeuralAudioEngine(NeuralSharedParams &sp) { for (auto i = 0; i < maxNumVoices; ++i) addVoice(new NeuralSynthVoice(sp)); setVoiceStealingEnabled(true); } //============================================================================== void prepare(const juce::dsp::ProcessSpec& spec) noexcept { setCurrentPlaybackSampleRate(spec.sampleRate); for (auto* v : voices) dynamic_cast (v)->prepare(spec); } //============================================================================== template void applyToVoices(VoiceFunc&& fn) noexcept { for (auto* v : voices) fn(dynamic_cast (v)); } private: //============================================================================== void renderNextSubBlock(juce::AudioBuffer& outputAudio, int startSample, int numSamples) override { MPESynthesiser::renderNextSubBlock(outputAudio, startSample, numSamples); } };