Files
JayDelay/src/plugin.cpp
T
2025-11-16 10:17:14 +01:00

260 lines
7.1 KiB
C++
Executable File

/*-----------------------------------------------------------------------------
1999, Steinberg Soft und Hardware GmbH, All Rights Reserved
-----------------------------------------------------------------------------*/
#include <reverb/reverb.hpp>
#include "plugin.hpp"
#include <cstdlib>
#include <cstdio>
enum {ORDER, SIZE_1, SIZE_2, SIZE_3, SIZE_4, SIZE_5, FB_DELAY_MIN, FB_DELAY_MAX, FB_DELAY_GAIN, EARLY_GAIN_1, EARLY_GAIN_2, EARLY_GAIN_3, EARLY_GAIN_4, EARLY_GAIN_5};
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({DELAY_MAX, DELAY_MAX, DELAY_MAX, DELAY_MAX, {DELAY_MAX, 0.0}}, DELAY_MAX, 0)
, m_reverb_2({DELAY_MAX, DELAY_MAX, DELAY_MAX, DELAY_MAX, {DELAY_MAX, 0.0}}, DELAY_MAX, 0)
{
sampleRate = 48000;
setNumInputs(2); // stereo in
setNumOutputs(2); // stereo out
setUniqueID('DLY1'); // 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
m_feedback_delay[0] = 0;
m_feedback_delay[1] = 0;
uint order = m_reverb_1.getNumDiffusionSteps();
m_params[0] = new Param("Order", "", order, order, order);
m_params[1] = new Param("Diffusion 1", "ms", 0, 1000, 48, 10.0);
m_params[2] = new Param("Diffusion 2", "ms", 0, 1000, 96, 10.0);
m_params[3] = new Param("Diffusion 3", "ms", 0, 1000, 192, 10.0);
m_params[4] = new Param("Diffusion 4", "ms", 0, 1000, 384, 10.0);
m_params[5] = new Param("Diffusion 5", "ms", 0, 1000, 768, 10.0);
m_params[6] = new Param("Delay Min", "ms", 0, 1000, 100, 10.0);
m_params[7] = new Param("Delay Max", "ms", 0, 1000, 200, 10.0);
m_params[8] = new Param("Delay Feedback", "%", 0, 100, 0);
m_params[9] = new Param("EarlyGain 1", "%", 0, 100, 0);
m_params[10] = new Param("EarlyGain 2", "%", 0, 100, 0);
m_params[11] = new Param("EarlyGain 3", "%", 0, 100, 0);
m_params[12] = new Param("EarlyGain 4", "%", 0, 100, 0);
m_params[13] = new Param("EarlyGain 5", "%", 0, 100, 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 ORDER:
break;
case SIZE_1:
case SIZE_2:
case SIZE_3:
case SIZE_4:
case SIZE_5:
{
double p = m_params[index]->fromSlider(value);
uint delay = (uint)(p*sampleRate/1000);
m_reverb_1.setDelay(index - SIZE_1, delay);
m_reverb_2.setDelay(index - SIZE_1, delay);
break;
}
case FB_DELAY_MIN:
case FB_DELAY_MAX:
{
double p = m_params[index]->fromSlider(value);
uint delay = (uint)(p*sampleRate/1000);
m_feedback_delay[index-FB_DELAY_MIN] = delay;
m_reverb_1.setFeedbackDelay(m_feedback_delay[0], m_feedback_delay[1]);
m_reverb_2.setFeedbackDelay(m_feedback_delay[0], m_feedback_delay[1]);
break;
}
case FB_DELAY_GAIN:
{
double p = m_params[index]->fromSlider(value)/100;
m_reverb_1.setFeedbackGain(p);
m_reverb_2.setFeedbackGain(p);
break;
}
case EARLY_GAIN_1:
case EARLY_GAIN_2:
case EARLY_GAIN_3:
case EARLY_GAIN_4:
case EARLY_GAIN_5:
{
double p = m_params[index]->fromSlider(value)/50;
m_reverb_1.setEarlyGain(index - EARLY_GAIN_1, p);
m_reverb_2.setEarlyGain(index - EARLY_GAIN_1, p);
break;
}
}
}
//-----------------------------------------------------------------------------------------
float Plugin::getParameter(VstInt32 index)
{
float value = 0;
switch(index)
{
case ORDER:
case SIZE_1:
case SIZE_2:
case SIZE_3:
case SIZE_4:
case SIZE_5:
case EARLY_GAIN_1:
case EARLY_GAIN_2:
case EARLY_GAIN_3:
case EARLY_GAIN_4:
case EARLY_GAIN_5:
case FB_DELAY_MIN:
case FB_DELAY_MAX:
case FB_DELAY_GAIN:
value = m_params[index]->getSlider();
break;
}
return value;
}
//-----------------------------------------------------------------------------------------
void Plugin::getParameterName(VstInt32 index, char *label)
{
switch(index)
{
case ORDER:
case SIZE_1:
case SIZE_2:
case SIZE_3:
case SIZE_4:
case SIZE_5:
case EARLY_GAIN_1:
case EARLY_GAIN_2:
case EARLY_GAIN_3:
case EARLY_GAIN_4:
case EARLY_GAIN_5:
case FB_DELAY_MIN:
case FB_DELAY_MAX:
case FB_DELAY_GAIN:
strcpy(label,m_params[index]->name().c_str());
break;
default:
strcpy(label,"Unknown");
break;
}
}
//-----------------------------------------------------------------------------------------
void Plugin::getParameterDisplay(VstInt32 index, char *text)
{
switch(index)
{
case ORDER:
case SIZE_1:
case SIZE_2:
case SIZE_3:
case SIZE_4:
case SIZE_5:
case EARLY_GAIN_1:
case EARLY_GAIN_2:
case EARLY_GAIN_3:
case EARLY_GAIN_4:
case EARLY_GAIN_5:
case FB_DELAY_MIN:
case FB_DELAY_MAX:
case FB_DELAY_GAIN:
sprintf(text, "%f", m_params[index]->getParameter());
break;
}
}
//-----------------------------------------------------------------------------------------
void Plugin::getParameterLabel(VstInt32 index, char *label)
{
switch(index)
{
case ORDER:
case SIZE_1:
case SIZE_2:
case SIZE_3:
case SIZE_4:
case SIZE_5:
case EARLY_GAIN_1:
case EARLY_GAIN_2:
case EARLY_GAIN_3:
case EARLY_GAIN_4:
case EARLY_GAIN_5:
case FB_DELAY_MIN:
case FB_DELAY_MAX:
case FB_DELAY_GAIN:
strcpy(label,m_params[index]->unit().c_str());
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];
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);
}