/*----------------------------------------------------------------------------- � 1999, Steinberg Soft und Hardware GmbH, All Rights Reserved -----------------------------------------------------------------------------*/ #include #include "plugin.hpp" #include #include 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); }