#pragma once #include "Parser.h" #include "Region.h" #include "SfzHelpers.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 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 idx < regions.size() ? ®ions[idx] : nullptr; } auto getUnknownOpcodes() { return unknownOpcodes; } 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; CCValueArray ccState; std::vector ccNames; std::optional defaultSwitch; std::set unknownOpcodes; std::vector regions; void buildRegion(const std::vector& regionOpcodes); }; }