diff --git a/src/sfizz/Curve.h b/src/sfizz/Curve.h index 3180309b..dff2f86e 100644 --- a/src/sfizz/Curve.h +++ b/src/sfizz/Curve.h @@ -115,6 +115,11 @@ public: */ const Curve& getCurve(unsigned index) const; + /** + * @brief Get the number of slots. + */ + unsigned getNumCurves() const; + private: std::vector> _curves; bool _useExplicitIndexing = false; diff --git a/src/sfizz/Curve.hpp b/src/sfizz/Curve.hpp index 0881ae45..1ebead18 100644 --- a/src/sfizz/Curve.hpp +++ b/src/sfizz/Curve.hpp @@ -30,4 +30,10 @@ inline float Curve::evalNormalized(float value) const return evalCC7(127 * value); } +/// +inline unsigned CurveSet::getNumCurves() const +{ + return static_cast(_curves.size()); +} + } // namespace sfz diff --git a/src/sfizz/Synth.cpp b/src/sfizz/Synth.cpp index b02ebd00..816d0b26 100644 --- a/src/sfizz/Synth.cpp +++ b/src/sfizz/Synth.cpp @@ -71,8 +71,7 @@ void sfz::Synth::callback(absl::string_view header, const std::vector& m buildRegion(members); break; case hash("curve"): - // TODO: implement curves - numCurves++; + curves.addCurveFromHeader(members); break; case hash("effect"): handleEffectOpcodes(members); @@ -128,11 +127,11 @@ void sfz::Synth::clear() effectBuses[0]->setGainToMain(1.0); effectBuses[0]->setSamplesPerBlock(samplesPerBlock); effectBuses[0]->setSampleRate(sampleRate); + curves = CurveSet::createPredefined(); resources.filePool.clear(); resources.logger.clear(); numGroups = 0; numMasters = 0; - numCurves = 0; fileTicket = -1; defaultSwitch = absl::nullopt; defaultPath = ""; @@ -717,7 +716,7 @@ int sfz::Synth::getNumMasters() const noexcept } int sfz::Synth::getNumCurves() const noexcept { - return numCurves; + return curves.getNumCurves(); } std::string sfz::Synth::exportMidnam(absl::string_view model) const diff --git a/src/sfizz/Synth.h b/src/sfizz/Synth.h index 616cf60d..41a56c53 100644 --- a/src/sfizz/Synth.h +++ b/src/sfizz/Synth.h @@ -10,6 +10,7 @@ #include "Voice.h" #include "Region.h" #include "Effects.h" +#include "Curve.h" #include "LeakDetector.h" #include "MidiState.h" #include "AudioSpan.h" @@ -382,7 +383,6 @@ private: int numGroups { 0 }; int numMasters { 0 }; - int numCurves { 0 }; /** * @brief Remove all regions, resets all voices and clears everything @@ -461,6 +461,9 @@ private: typedef std::unique_ptr EffectBusPtr; std::vector effectBuses; // 0 is "main", 1-N are "fx1"-"fxN" + // Curves + CurveSet curves; + // Intermediate buffers AudioBuffer tempBuffer { 2, config::defaultSamplesPerBlock }; AudioBuffer tempMixNodeBuffer { 2, config::defaultSamplesPerBlock };