/* * ParameterAutomation.cpp * * Created on: April 14, 2018 * Author: slascos * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version.* * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include "LibBasicFunctions.h" 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) { reconfigure(startValue, endValue, calcAudioSamples(durationMilliseconds), function); } template ParameterAutomation::ParameterAutomation(T startValue, T endValue, size_t durationSamples, Function function) { reconfigure(startValue, endValue, durationSamples, function); } template ParameterAutomation::~ParameterAutomation() { } template void ParameterAutomation::reconfigure(T startValue, T endValue, float durationMilliseconds, Function function) { reconfigure(startValue, endValue, calcAudioSamples(durationMilliseconds), function); } template void ParameterAutomation::reconfigure(T startValue, T endValue, size_t durationSamples, Function function) { m_function = function; m_startValue = startValue; m_endValue = endValue; m_currentValueX = startValue; m_duration = durationSamples; m_running = false; // Pre-compute any necessary coefficients switch(m_function) { case Function::EXPONENTIAL : break; case Function::LOGARITHMIC : break; case Function::PARABOLIC : break; case Function::LOOKUP_TABLE : break; // Default will be same as LINEAR case Function::LINEAR : default : m_coeffs[LINEAR_SLOPE] = (endValue - startValue) / static_cast(m_duration); break; } } template void ParameterAutomation::trigger() { m_currentValueX = m_startValue; m_running = true; } template T ParameterAutomation::getNextValue() { switch(m_function) { case Function::EXPONENTIAL : break; case Function::LOGARITHMIC : break; case Function::PARABOLIC : break; case Function::LOOKUP_TABLE : break; // Default will be same as LINEAR case Function::LINEAR : default : // output = m_currentValueX + slope m_currentValueX += m_coeffs[LINEAR_SLOPE]; if (m_currentValueX >= m_endValue) { m_currentValueX = m_endValue; m_running = false; } break; } 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; }