refactored
This commit is contained in:
Executable
+257
@@ -0,0 +1,257 @@
|
||||
/*-----------------------------------------------------------------------------
|
||||
|
||||
� 1999, Steinberg Soft und Hardware GmbH, All Rights Reserved
|
||||
|
||||
-----------------------------------------------------------------------------*/
|
||||
|
||||
#include <reverb/reverb.hpp>
|
||||
#include "plugin.hpp"
|
||||
#include "paramutils.h"
|
||||
|
||||
#define NUM_PARMS 7
|
||||
#define MAX_ORDER 10
|
||||
#define MAX_TYPES 4
|
||||
#define MAX_Q 10.0f
|
||||
#define ALPHA 0.2f
|
||||
#define BETA (1.0f-ALPHA)
|
||||
|
||||
const char * const pFTypeString[8] =
|
||||
{
|
||||
"Unknown",
|
||||
"Lowpass",
|
||||
"Highpass",
|
||||
"Bandpass",
|
||||
"Bandstop",
|
||||
"Peaking",
|
||||
"Low-Shelving",
|
||||
"High-Shelving"
|
||||
};
|
||||
|
||||
enum {ORDER, TYPE, FMIN, FMAX, FG, Q, TESTPARAM};
|
||||
char *pParmStr[NUM_PARMS] = {"Order","Filter-Type","Freq min","Freq max","Frequency","Resonance","Test-Param"};
|
||||
|
||||
AudioEffect* createEffectInstance (audioMasterCallback audioMaster)
|
||||
{
|
||||
return new Plugin (audioMaster);
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
Plugin::Plugin(audioMasterCallback audioMaster)
|
||||
: AudioEffectX(audioMaster, 1, NUM_PARMS) // 1 program, 1 parameter only
|
||||
//, m_reverb_1({(uint)(48000*0.02), (uint)(48000*0.04), (uint)(48000*0.08), (uint)(48000*0.16)}, (uint)(48000*0.1), (uint)(48000*0.2))
|
||||
//, m_reverb_2({(uint)(48000*0.02), (uint)(48000*0.04), (uint)(48000*0.08), (uint)(48000*0.16)}, (uint)(48000*0.1), (uint)(48000*0.2))
|
||||
, m_reverb_1({(uint)(48000*0.48)}, (uint)(48000*0.1), (uint)(48000*0.2))
|
||||
, m_reverb_2({(uint)(48000*0.48)}, (uint)(48000*0.1), (uint)(48000*0.2))
|
||||
{
|
||||
sampleRate = 48000;
|
||||
setNumInputs(2); // stereo in
|
||||
setNumOutputs(2); // stereo out
|
||||
setUniqueID('Filt'); // identify
|
||||
canMono(); // makes sense to feed both inputs with the same signal
|
||||
canProcessReplacing(); // supports both accumulating and replacing output
|
||||
strcpy(programName, "Default"); // default program name
|
||||
testParam=0;
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------------------
|
||||
Plugin::~Plugin()
|
||||
{
|
||||
// nothing to do here
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------------------
|
||||
void Plugin::setProgramName(char *name)
|
||||
{
|
||||
strcpy(programName, name);
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------------------
|
||||
void Plugin::getProgramName(char *name)
|
||||
{
|
||||
strcpy(name, programName);
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------------------
|
||||
void Plugin::setParameter(VstInt32 index, float value)
|
||||
{
|
||||
switch(index)
|
||||
{
|
||||
case TYPE:
|
||||
|
||||
ftype = ParamQuantize(value,1.0f/(MAX_TYPES-1));
|
||||
sprintf(dbgStr, "Set Param: %f",ftype);
|
||||
break;
|
||||
|
||||
case ORDER:
|
||||
forder = ParamQuantize(value,1.0f/(MAX_ORDER/2-1));
|
||||
sprintf(dbgStr, "Set Param: %f",forder);
|
||||
break;
|
||||
|
||||
case FMIN:
|
||||
sprintf(dbgStr, "Set Param: %f",value);
|
||||
break;
|
||||
|
||||
case FMAX:
|
||||
sprintf(dbgStr, "Set Param: %f",value);
|
||||
break;
|
||||
|
||||
case FG:
|
||||
sprintf(dbgStr, "Set Param: %f",value);
|
||||
break;
|
||||
|
||||
case Q:
|
||||
sprintf(dbgStr, "Set Param: %f",value);
|
||||
break;
|
||||
|
||||
case TESTPARAM:
|
||||
testParam=ParamQuantize(value,1.0f/3);
|
||||
sprintf(dbgStr, "Set Param: %f",value);
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------------------
|
||||
float Plugin::getParameter(VstInt32 index)
|
||||
{
|
||||
float value = 0;
|
||||
|
||||
switch(index)
|
||||
{
|
||||
case TYPE:
|
||||
value = (float)ftype;
|
||||
break;
|
||||
|
||||
case ORDER:
|
||||
value = (float)forder;
|
||||
break;
|
||||
|
||||
case FMIN:
|
||||
value = f_fmin;
|
||||
break;
|
||||
|
||||
case FMAX:
|
||||
value = f_fmin;
|
||||
break;
|
||||
|
||||
case FG:
|
||||
value = f_fg_param;
|
||||
break;
|
||||
|
||||
case Q:
|
||||
value = q;
|
||||
break;
|
||||
|
||||
case TESTPARAM:
|
||||
value = testParam;
|
||||
sprintf(dbgStr, "Get Param: %f",value);
|
||||
// OutputDebugString(dbgStr);
|
||||
break;
|
||||
}
|
||||
return value;
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------------------
|
||||
void Plugin::getParameterName(VstInt32 index, char *label)
|
||||
{
|
||||
strcpy(label,pParmStr[index]);
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------------------
|
||||
void Plugin::getParameterDisplay(VstInt32 index, char *text)
|
||||
{
|
||||
|
||||
switch(index)
|
||||
{
|
||||
case TYPE:
|
||||
strcpy(text, pFTypeString[type]);
|
||||
break;
|
||||
case ORDER:
|
||||
snprintf(text, kVstMaxParamStrLen, "%d", order);
|
||||
break;
|
||||
case FMIN:
|
||||
float2string(0.5f*f_fmin*sampleRate,text, kVstMaxParamStrLen);
|
||||
break;
|
||||
case FMAX:
|
||||
float2string(0.5f*f_fmax*sampleRate,text, kVstMaxParamStrLen);
|
||||
break;
|
||||
case FG:
|
||||
float2string(0.5f*fg*sampleRate,text, kVstMaxParamStrLen);
|
||||
break;
|
||||
case Q:
|
||||
float2string(q*MAX_Q,text, kVstMaxParamStrLen);
|
||||
break;
|
||||
case TESTPARAM:
|
||||
float2string(testParam,text, kVstMaxParamStrLen);
|
||||
break;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------------------
|
||||
void Plugin::getParameterLabel(VstInt32 index, char *label)
|
||||
{
|
||||
switch(index)
|
||||
{
|
||||
case TYPE:
|
||||
strcpy(label, " ");
|
||||
break;
|
||||
case ORDER:
|
||||
strcpy(label, " ");
|
||||
break;
|
||||
case FMIN:
|
||||
strcpy(label, " Hz ");
|
||||
break;
|
||||
case FMAX:
|
||||
strcpy(label, " Hz ");
|
||||
break;
|
||||
case FG:
|
||||
strcpy(label, " Hz ");
|
||||
break;
|
||||
case Q:
|
||||
strcpy(label, " ");
|
||||
break;
|
||||
case TESTPARAM:
|
||||
strcpy(label, " Test ");
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------------------
|
||||
void Plugin::processReplacing(float **inputs, float **outputs, VstInt32 sampleFrames)
|
||||
{
|
||||
float *in1 = inputs[0];
|
||||
float *in2 = inputs[1];
|
||||
float *out1 = outputs[0];
|
||||
float *out2 = outputs[1];
|
||||
|
||||
sm_fg = BETA*sm_fg+ALPHA*fg;
|
||||
sm_q = BETA*sm_q+ALPHA*q*MAX_Q;
|
||||
|
||||
IIRCalcFilterCoeff(filterCoeff_L, sampleRate, 0.5f*sm_fg*sampleRate, sm_q, order, type);
|
||||
IIRCalcFilterCoeff(filterCoeff_R, sampleRate, 0.5f*sm_fg*sampleRate, sm_q, order, type);
|
||||
|
||||
// IIR(filterCoeff_L, in1, out1, order, sampleFrames);
|
||||
// IIR(filterCoeff_R, in2, out2, order, sampleFrames);
|
||||
|
||||
m_reverb_1.setFeedbackGain(sm_fg);
|
||||
m_reverb_2.setFeedbackGain(sm_fg);
|
||||
m_reverb_1.process_multi(in1, out1, sampleFrames);
|
||||
m_reverb_2.process_multi(in2, out2, sampleFrames);
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------------------
|
||||
void Plugin::setSampleRate(float sampleRate)
|
||||
{
|
||||
this->sampleRate = sampleRate;
|
||||
sprintf(dbgStr, "Sample Rate = %f",sampleRate);
|
||||
// OutputDebugString(dbgStr);
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------------------
|
||||
void Plugin::setBlockSize(VstInt32 blockSize)
|
||||
{
|
||||
this->blockSize = blockSize;
|
||||
sprintf(dbgStr, "Block Size = %d",blockSize);
|
||||
// OutputDebugString(dbgStr);
|
||||
}
|
||||
Reference in New Issue
Block a user