#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);
}