#include "PatchProcessor.h" #include "MemoryBuffer.hpp" #include "device.h" #include "main.h" #include #include "ProgramVector.h" #include "SmoothValue.h" PatchProcessor::PatchProcessor() : patch(NULL), bufferCount(0), parameterCount(0) { for(int i=0; ihardware_version == OWL_MODULAR_HARDWARE){ for(int i=0; i<4 && iupdate(4095 - params[i]); for(int i=4; iupdate(params[i]); }else{ for(int i=0; iupdate(params[i]); } } template class LinearParameterUpdater : public ParameterUpdater { private: PatchParameter* parameter; T minimum; T maximum; V value; public: LinearParameterUpdater(T min, T max, V initialValue) : parameter(NULL), minimum(min), maximum(max), value(initialValue) {} void update(int16_t newValue){ value = (newValue*(maximum-minimum))/4096+minimum; if(parameter != NULL) parameter->update((T)value); } void setParameter(PatchParameter* p){ parameter = p; } }; // void setSkew(float mid){ // if (maximum > minimum) // skew = log (0.5) / log ((mid - minimum) / (maximum - minimum)); // } template class ExponentialParameterUpdater : public ParameterUpdater { private: PatchParameter* parameter; float skew; T minimum; T maximum; V value; public: ExponentialParameterUpdater(float skw, T min, T max, V initialValue) : parameter(NULL), skew(skw), minimum(min), maximum(max), value(initialValue) { // ASSERT(skew > 0.0 && skew <= 2.0, "Invalid exponential skew value"); ASSERT(skew > 0.0, "Invalid exponential skew value"); } void update(int16_t newValue){ float v = newValue/4096.0f; v = expf(logf(v)/skew); value = v*(maximum-minimum)+minimum; if(parameter != NULL) parameter->update((T)value); } void setParameter(PatchParameter* p){ parameter = p; } }; double PatchProcessor::getSampleRate(){ return getProgramVector()->audio_samplingrate; } int PatchProcessor::getBlockSize(){ return getProgramVector()->audio_blocksize; } void PatchProcessor::setDefaultValue(int pid, float value){ doSetPatchParameter(pid, value*4096); } void PatchProcessor::setDefaultValue(int pid, int value){ doSetPatchParameter(pid, value); } template PatchParameter PatchProcessor::getParameter(const char* name, T min, T max, T defaultValue, float lambda, float delta, float skew){ int pid = 0; int blocksize = getBlockSize(); if(parameterCount < MAX_NUMBER_OF_PARAMETERS && parameterCount < getProgramVector()->parameters_size){ pid = parameterCount++; if(getProgramVector()->registerPatchParameter != NULL) getProgramVector()->registerPatchParameter(pid, name); setDefaultValue(pid, defaultValue); if(parameters[pid] != NULL) delete parameters[pid]; ParameterUpdater* updater = NULL; T l = SmoothValue::normal(lambda, blocksize); T d = StiffValue::normal(delta)*abs(max-min); if(skew == 1.0){ if(lambda == 0.0 && delta == 0.0){ updater = new LinearParameterUpdater(min, max, defaultValue); }else if(delta == 0.0){ updater = new LinearParameterUpdater >(min, max, SmoothValue(l, defaultValue)); }else if(lambda == 0.0){ updater = new LinearParameterUpdater >(min, max, StiffValue(d, defaultValue)); }else{ updater = new LinearParameterUpdater >(min, max, SmoothStiffValue(l, d, defaultValue)); } }else{ if(lambda == 0.0 && delta == 0.0){ updater = new ExponentialParameterUpdater(skew, min, max, defaultValue); }else if(delta == 0.0){ updater = new ExponentialParameterUpdater >(skew, min, max, SmoothValue(l, defaultValue)); }else if(lambda == 0.0){ updater = new ExponentialParameterUpdater >(skew, min, max, StiffValue(d, defaultValue)); }else{ updater = new ExponentialParameterUpdater >(skew, min, max, SmoothStiffValue(l, d, defaultValue)); } } parameters[pid] = updater; } PatchParameter pp(pid); return pp; } // explicit instantiation template PatchParameter PatchProcessor::getParameter(const char* name, float min, float max, float defaultValue, float lambda, float delta, float skew); template PatchParameter PatchProcessor::getParameter(const char* name, int min, int max, int defaultValue, float lambda, float delta, float skew); void PatchProcessor::setPatchParameter(int pid, FloatParameter* param){ if(pid < parameterCount && parameters[pid] != NULL) parameters[pid]->setParameter(param); } void PatchProcessor::setPatchParameter(int pid, IntParameter* param){ if(pid < parameterCount && parameters[pid] != NULL) parameters[pid]->setParameter(param); }