11namespace tracktion {
inline namespace engine
14static constexpr float scalewet = 3;
15static constexpr float scaledry = 2;
16static constexpr float freezemode = 0.5f;
19ReverbPlugin::ReverbPlugin (PluginCreationInfo info) : Plugin (info)
21 roomSizeParam = addParam (
"room size",
TRANS(
"Room Size"), { 0.0f, 1.0f },
22 [] (
float value) {
return juce::String (1 + (
int) (10.0f * value)); },
23 [] (
const juce::String& s) {
return s.getFloatValue(); });
25 dampParam = addParam (
"damping",
TRANS(
"Damping"), { 0.0f, 1.0f },
26 [] (
float value) {
return juce::String ((
int) (100.0f * value)) +
"%"; },
29 wetParam = addParam (
"wet level",
TRANS(
"Wet Level"), { 0.0f, 1.0f },
30 [] (
float value) {
return gainToDbString (scalewet * value); },
31 [] (
const juce::String& s) {
return s.getFloatValue(); });
33 dryParam = addParam (
"dry level",
TRANS(
"Dry Level"), { 0.0f, 1.0f },
34 [] (
float value) {
return gainToDbString (scaledry * value); },
35 [] (
const juce::String& s) {
return s.getFloatValue(); });
37 widthParam = addParam (
"width",
TRANS(
"Width"), { 0.0f, 1.0f },
38 [] (
float value) {
return juce::String ((
int) (100.0f * value)) +
"%"; },
41 modeParam = addParam (
"mode",
TRANS(
"Freeze"), { 0.0f, 1.0f },
42 [] (
float value) {
return value >= freezemode ?
TRANS(
"On") :
TRANS(
"Off"); },
43 [] (
const juce::String& s) {
return s.getFloatValue(); });
45 auto um = getUndoManager();
47 roomSizeValue.referTo (state, IDs::roomSize, um, 0.3f);
48 dampValue.referTo (state, IDs::damp, um, 0.5f);
49 wetValue.referTo (state, IDs::wet, um, 1.0f / scalewet);
50 dryValue.referTo (state, IDs::dry, um, 0.5f);
51 widthValue.referTo (state, IDs::width, um, 1.0f);
52 modeValue.referTo (state, IDs::mode, um);
54 roomSizeParam->attachToCurrentValue (roomSizeValue);
55 dampParam->attachToCurrentValue (dampValue);
56 wetParam->attachToCurrentValue (wetValue);
57 dryParam->attachToCurrentValue (dryValue);
58 widthParam->attachToCurrentValue (widthValue);
59 modeParam->attachToCurrentValue (modeValue);
62ReverbPlugin::~ReverbPlugin()
64 notifyListenersOfDeletion();
66 roomSizeParam->detachFromCurrentValue();
67 dampParam->detachFromCurrentValue();
68 wetParam->detachFromCurrentValue();
69 dryParam->detachFromCurrentValue();
70 widthParam->detachFromCurrentValue();
71 modeParam->detachFromCurrentValue();
74const char* ReverbPlugin::xmlTypeName =
"reverb";
79 reverb.setSampleRate (info.sampleRate);
82void ReverbPlugin::deinitialise()
86void ReverbPlugin::reset()
91static bool isNotSilent (
float v)
noexcept
93 const float zeroThresh = 1.0f / 8000.0f;
94 return v < -zeroThresh || v > zeroThresh;
97static bool isSilent (
const float* data,
int num)
noexcept
99 if (isNotSilent (data[0]) || isNotSilent (data[num / 2]))
102 auto range = juce::FloatVectorOperations::findMinAndMax (data, num);
104 return ! (isNotSilent (range.getStart())
105 || isNotSilent (range.getEnd()));
112 SCOPED_REALTIME_CHECK
115 params.
roomSize = roomSizeParam->getCurrentValue();
116 params.damping = dampParam->getCurrentValue();
117 params.wetLevel = wetParam->getCurrentValue();
118 params.dryLevel = dryParam->getCurrentValue();
119 params.width = widthParam->getCurrentValue();
120 params.freezeMode = modeParam->getCurrentValue();
122 if (
memcmp (¶ms, &reverb.getParameters(), sizeof (params)) != 0)
123 reverb.setParameters (params);
134 if (outputSilent && isSilent (left, num) && isSilent (right, num))
137 reverb.processStereo (left, right, num);
139 outputSilent = isSilent (left, num) && isSilent (right, num);
143 if (outputSilent && isSilent (left, num))
146 reverb.processMono (left, num);
148 outputSilent = isSilent (left, num);
151 zeroDenormalisedValuesIfNeeded (*fc.
destBuffer);
155void ReverbPlugin::restorePluginStateFromValueTree (
const juce::ValueTree& v)
157 copyPropertiesToCachedValues (v, roomSizeValue, dampValue, wetValue, dryValue, widthValue, modeValue);
159 for (
auto p : getAutomatableParameters())
160 p->updateFromAttachedValue();
164float ReverbPlugin::getRoomSize() {
return roomSizeParam->getCurrentValue(); }
167float ReverbPlugin::getDamp() {
return dampParam->getCurrentValue(); }
170float ReverbPlugin::getWet() {
return wetParam->getCurrentValue(); }
173float ReverbPlugin::getDry() {
return dryParam->getCurrentValue(); }
176float ReverbPlugin::getWidth() {
return widthParam->getCurrentValue(); }
179float ReverbPlugin::getMode() {
return modeParam->getCurrentValue(); }
Type * getWritePointer(int channelNumber) noexcept
int getNumChannels() const noexcept
float getFloatValue() const noexcept
#define TRANS(stringLiteral)
Type jlimit(Type lowerLimit, Type upperLimit, Type valueToConstrain) noexcept
Passed into Plugins when they are being initialised, to give them useful contextual information that ...
The context passed to plugin render methods to provide it with buffers to fill.
int bufferNumSamples
The number of samples to write into the audio buffer.
juce::AudioBuffer< float > * destBuffer
The target audio buffer which needs to be filled.
int bufferStartSample
The index of the start point in the audio buffer from which data must be written.