#pragma once #include "ConfigService.hpp" #include "LoggerService.hpp" #include "NoteQueue.hpp" #include "Voice.hpp" #include "Scope.hpp" #include class Synth { public: Synth(ConfigService* config, LoggerService* logger, ScopeBuffer* scope, NoteQueue* queue); ~Synth() = default; void process(float* out, size_t nFrames); void handleNoteEvent(const NoteEvent& event); private: Voice* findFreeVoice(); Voice* findVoiceByNote(uint8_t note); std::vector sustainedNotes_; // voices static constexpr size_t MAX_VOICES = 32; std::array voices_; ConfigService* config_; LoggerService* logger_; ScopeBuffer* scope_;; NoteQueue* noteQueue_; };