From ec4a6b26d56e6e282160ae7b99c6e0b9dc1ec3b8 Mon Sep 17 00:00:00 2001 From: Steve Lascos Date: Wed, 18 Apr 2018 20:14:22 -0400 Subject: [PATCH] WIP - Further development work checking --- src/LibBasicFunctions.h | 27 ++++++++-- src/common/ParameterAutomation.cpp | 87 ++++++++++++++++++++++++++++++ 2 files changed, 111 insertions(+), 3 deletions(-) diff --git a/src/LibBasicFunctions.h b/src/LibBasicFunctions.h index 26e9c64..0afa625 100644 --- a/src/LibBasicFunctions.h +++ b/src/LibBasicFunctions.h @@ -316,16 +316,17 @@ class ParameterAutomation { public: enum class Function : unsigned { - LINEAR = 0, ///< f(x) = x + NOT_CONFIGURED = 0, ///< Initial, unconfigured stage + LINEAR, ///< f(x) = x EXPONENTIAL, ///< f(x) = e^x LOGARITHMIC, ///< f(x) = ln(x) PARABOLIC, ///< f(x) = x^2 LOOKUP_TABLE ///< f(x) = lut(x) }; - ParameterAutomation() = delete; + ParameterAutomation(); ParameterAutomation(T startValue, T endValue, size_t durationSamples, Function function = Function::LINEAR); ParameterAutomation(T startValue, T endValue, float durationMilliseconds, Function function = Function::LINEAR); - ~ParameterAutomation(); + virtual ~ParameterAutomation(); /// set the start and end values for the automation /// @param function select which automation curve (function) to use @@ -342,6 +343,8 @@ public: /// @returns the calculated parameter value of templated type T T getNextValue(); + bool isFinished() { return !m_running; } + private: Function m_function; T m_startValue; @@ -355,10 +358,28 @@ private: // TODO: initialize with const number of sequences with null type that automatically skips // then register each new sequence. +constexpr int MAX_PARAMETER_SEQUENCES = 32; template class ParameterAutomationSequence { +public: + ParameterAutomationSequence() = delete; + ParameterAutomationSequence(int numStages); + virtual ~ParameterAutomationSequence(); + + void setupParameter(int index, T startValue, T endValue, size_t durationSamples, typename ParameterAutomation::Function function); + void setupParameter(int index, T startValue, T endValue, float durationMilliseconds, typename ParameterAutomation::Function function); + + /// Trigger a the automation sequence until numStages is reached or a Function is ParameterAutomation::Function::NOT_CONFIGURED + void trigger(); + + T getNextValue(); + bool isFinished(); +private: + ParameterAutomation *m_paramArray[MAX_PARAMETER_SEQUENCES]; + int m_currentIndex = 0; + int m_numStages = 0; }; } // BALibrary diff --git a/src/common/ParameterAutomation.cpp b/src/common/ParameterAutomation.cpp index 9bf8177..0a59647 100644 --- a/src/common/ParameterAutomation.cpp +++ b/src/common/ParameterAutomation.cpp @@ -24,7 +24,15 @@ using namespace BAGuitar; namespace BALibrary { +/////////////////////////////////////////////////////////////////////////////// +// ParameterAutomation +/////////////////////////////////////////////////////////////////////////////// constexpr int LINEAR_SLOPE = 0; +template +ParameterAutomation::ParameterAutomation() +{ + reconfigure(0.0f, 0.0f, static_cast(0), Function::NOT_CONFIGURED); +} template ParameterAutomation::ParameterAutomation(T startValue, T endValue, float durationMilliseconds, Function function) @@ -38,6 +46,12 @@ ParameterAutomation::ParameterAutomation(T startValue, T endValue, size_t dur reconfigure(startValue, endValue, durationSamples, function); } +template +ParameterAutomation::~ParameterAutomation() +{ + +} + template void ParameterAutomation::reconfigure(T startValue, T endValue, float durationMilliseconds, Function function) { @@ -52,6 +66,7 @@ void ParameterAutomation::reconfigure(T startValue, T endValue, size_t durati m_endValue = endValue; m_currentValueX = startValue; m_duration = durationSamples; + m_running = false; // Pre-compute any necessary coefficients switch(m_function) { @@ -107,4 +122,76 @@ T ParameterAutomation::getNextValue() return m_currentValueX; } +// Template instantiation +//template class MyStack; +template class ParameterAutomation; + +/////////////////////////////////////////////////////////////////////////////// +// ParameterAutomationSequence +/////////////////////////////////////////////////////////////////////////////// +template +ParameterAutomationSequence::ParameterAutomationSequence(int numStages) +{ + //m_paramArray = malloc(sizeof(ParameterAutomation*) * numStages); + if (numStages < MAX_PARAMETER_SEQUENCES) { + for (int i=0; i(); + } + for (int i=numStages; i +ParameterAutomationSequence::~ParameterAutomationSequence() +{ + //if (m_paramArray) { + for (int i=0; i +void ParameterAutomationSequence::setupParameter(int index, T startValue, T endValue, size_t durationSamples, typename ParameterAutomation::Function function) +{ + m_paramArray[index]->reconfigure(startValue, endValue, durationSamples, function); +} + +template +void ParameterAutomationSequence::setupParameter(int index, T startValue, T endValue, float durationMilliseconds, typename ParameterAutomation::Function function) +{ + m_paramArray[index]->reconfigure(startValue, endValue, durationMilliseconds, function); +} + +template +void ParameterAutomationSequence::trigger(void) +{ + m_currentIndex = 0; + for (int i=0; itrigger(); + } +} + +template +bool ParameterAutomationSequence::isFinished() +{ + bool finished = true; + for (int i=0; iisFinished()) { + finished = false; + break; + } + } + return finished; +} + +// Template instantiation +template class ParameterAutomationSequence; + }