#pragma once #include "Parser.h" #include "Region.h" #include "SfzHelpers.h" #include "FilePool.h" #include #include #include #include namespace sfz { class Synth: public Parser { public: bool loadSfzFile(const std::filesystem::path& file) final; int getNumRegions() const noexcept { return static_cast(regions.size()); } int getNumGroups() const noexcept { return numGroups; } int getNumMasters() const noexcept { return numMasters; } int getNumCurves() const noexcept { return numCurves; } const Region* getRegionView(int idx) const noexcept { return (size_t)idx < regions.size() ? regions[idx].get() : nullptr; } auto getUnknownOpcodes() { return unknownOpcodes; } size_t getNumPreloadedSamples() { return filePool.getNumPreloadedSamples(); } void prepareToPlay(int samplesPerBlock, double sampleRate); void renderBlock(StereoBuffer& buffer); protected: void callback(std::string_view header, std::vector members) final; private: bool hasGlobal { false }; bool hasControl { false }; int numGroups { 0 }; int numMasters { 0 }; int numCurves { 0 }; void clear(); void handleGlobalOpcodes(const std::vector& members); void handleControlOpcodes(const std::vector& members); std::vector globalOpcodes; std::vector masterOpcodes; std::vector groupOpcodes; FilePool filePool; CCValueArray ccState; std::vector ccNames; std::optional defaultSwitch; std::set unknownOpcodes; using RegionPtrVector = std::vector>; std::vector> regions; std::array noteActivationLists; std::array ccActivationLists; void buildRegion(const std::vector& regionOpcodes); }; }