Skip to content

Commit 815c948

Browse files
committed
fixed Dattorro algorithm
1 parent 6e9fca9 commit 815c948

2 files changed

Lines changed: 60 additions & 47 deletions

File tree

RSAlgorithmicVerb.jucer

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,9 @@
55
jucerFormatVersion="1" companyWebsite="reillyspitzfaden.netlify.app"
66
companyEmail="reillypascal@gmail.com" pluginManufacturer="Reilly Spitzfaden"
77
pluginManufacturerCode="Rspi" pluginCode="Rsav" aaxIdentifier="com.reillyspitzfaden.RSAlgorithmicVerb"
8-
bundleIdentifier="com.reillyspitzfaden.RSAlgorithmicVerb" version="0.1.0"
9-
pluginFormats="buildAAX,buildAU,buildVST3" pluginAUMainType="'aufx'"
10-
pluginVST3Category="Fx" pluginAAXCategory="8" pluginVSTCategory="kPlugCategEffect">
8+
bundleIdentifier="com.reillyspitzfaden.RSAlgorithmicVerb" version="0.1.1"
9+
pluginFormats="buildAU,buildVST3" pluginAUMainType="'aufx'" pluginVST3Category="Fx"
10+
pluginAAXCategory="8" pluginVSTCategory="kPlugCategEffect">
1111
<MAINGROUP id="h5VveC" name="RSAlgorithmicVerb">
1212
<GROUP id="{B58AE04A-B2A6-F5DD-B065-49609ED60D71}" name="Source">
1313
<FILE id="ra5vcP" name="PluginProcessor.cpp" compile="1" resource="0"

Source/DattorroVerb.h

Lines changed: 57 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -90,66 +90,72 @@ class DattorroPlate : public ProcessorBase
9090
dryWetMixer.pushDrySamples(dryBlock);
9191

9292
// mono reverb processing
93-
juce::AudioBuffer<float> monoBuffer(1, buffer.getNumSamples());
94-
monoBuffer.clear();
93+
juce::AudioBuffer<float> monoBufferA(1, buffer.getNumSamples());
94+
juce::AudioBuffer<float> monoBufferB(1, buffer.getNumSamples());
95+
monoBufferA.clear();
96+
monoBufferB.clear();
9597
// sum stereo to mono for input chain
96-
monoBuffer.copyFrom(0, 0, buffer, 0, 0, buffer.getNumSamples());
98+
monoBufferA.copyFrom(0, 0, buffer, 0, 0, buffer.getNumSamples());
99+
monoBufferB.copyFrom(0, 0, buffer, 0, 0, buffer.getNumSamples());
97100
if (buffer.getNumChannels() > 1)
98101
{
99-
monoBuffer.addFrom(0, 0, buffer, 1, 0, buffer.getNumSamples());
100-
monoBuffer.applyGain(0.707f);
102+
monoBufferA.addFrom(0, 0, buffer, 1, 0, buffer.getNumSamples());
103+
monoBufferB.addFrom(0, 0, buffer, 1, 0, buffer.getNumSamples());
104+
monoBufferA.applyGain(0.5f);
105+
monoBufferB.applyGain(0.5f);
101106
}
102107

103108
// reverb sample loop params
104109
int channel = 0;
105110
// need separate ones for different delays
106111
float allpassFeedbackCoefficient = 0.5;
107-
auto* channelData = monoBuffer.getWritePointer (channel);
108-
for (int sample = 0; sample < monoBuffer.getNumSamples(); ++sample)
112+
auto* channelDataA = monoBufferA.getWritePointer (channel);
113+
auto* channelDataB = monoBufferB.getWritePointer (channel);
114+
for (int sample = 0; sample < buffer.getNumSamples(); ++sample)
109115
{
110116

111117
// apply predelay, filter
112-
preDelay.pushSample(channel, channelData[sample]);
113-
channelData[sample] = inputFilter.processSample(channel, preDelay.popSample(channel));
118+
preDelay.pushSample(channel, channelDataA[sample]);
119+
channelDataA[sample] = inputFilter.processSample(channel, preDelay.popSample(channel));
114120

115121
// apply allpasses
116122
allpassOutput = allpass1.popSample(channel);
117123
feedback = allpassOutput * allpassFeedbackCoefficient;
118-
feedforward = -channelData[sample] - allpassOutput * allpassFeedbackCoefficient;
119-
allpass1.pushSample(channel, channelData[sample] + feedback);
120-
channelData[sample] = allpassOutput + feedforward;
124+
feedforward = -channelDataA[sample] - allpassOutput * allpassFeedbackCoefficient;
125+
allpass1.pushSample(channel, channelDataA[sample] + feedback);
126+
channelDataA[sample] = allpassOutput + feedforward;
121127

122128
allpassOutput = allpass2.popSample(channel);
123129
feedback = allpassOutput * allpassFeedbackCoefficient;
124-
feedforward = -channelData[sample] - allpassOutput * allpassFeedbackCoefficient;
125-
allpass2.pushSample(channel, channelData[sample] + feedback);
126-
channelData[sample] = allpassOutput + feedforward;
130+
feedforward = -channelDataA[sample] - allpassOutput * allpassFeedbackCoefficient;
131+
allpass2.pushSample(channel, channelDataA[sample] + feedback);
132+
channelDataA[sample] = allpassOutput + feedforward;
127133

128134
allpassOutput = allpass3.popSample(channel);
129135
feedback = allpassOutput * allpassFeedbackCoefficient;
130-
feedforward = -channelData[sample] - allpassOutput * allpassFeedbackCoefficient;
131-
allpass3.pushSample(channel, channelData[sample] + feedback);
132-
channelData[sample] = allpassOutput + feedforward;
136+
feedforward = -channelDataA[sample] - allpassOutput * allpassFeedbackCoefficient;
137+
allpass3.pushSample(channel, channelDataA[sample] + feedback);
138+
channelDataA[sample] = allpassOutput + feedforward;
133139

134140
allpassOutput = allpass4.popSample(channel);
135141
feedback = allpassOutput * allpassFeedbackCoefficient;
136-
feedforward = -channelData[sample] - allpassOutput * allpassFeedbackCoefficient;
137-
allpass4.pushSample(channel, channelData[sample] + feedback);
138-
channelData[sample] = allpassOutput + feedforward;
142+
feedforward = -channelDataA[sample] - allpassOutput * allpassFeedbackCoefficient;
143+
allpass4.pushSample(channel, channelDataA[sample] + feedback);
144+
channelDataA[sample] = allpassOutput + feedforward;
139145

140-
// figure-8 begins
141-
channelData[sample] += summingOutput;
146+
// first fig-8 half
147+
channelDataA[sample] += summingB * mDecay;
142148

143149
// modulated APF1
144150
allpassOutput = modulatedAPF1.popSample(channel);
145151
feedback = allpassOutput * allpassFeedbackCoefficient;
146-
feedforward = -channelData[sample] - allpassOutput * allpassFeedbackCoefficient;
147-
modulatedAPF1.pushSample(channel, channelData[sample] + feedback);
148-
channelData[sample] = allpassOutput + feedforward;
152+
feedforward = -channelDataA[sample] - allpassOutput * allpassFeedbackCoefficient;
153+
modulatedAPF1.pushSample(channel, channelDataA[sample] + feedback);
154+
channelDataA[sample] = allpassOutput + feedforward;
149155

150156
// delay 1
151-
delay1.pushSample(channel, channelData[sample]);
152-
channelData[sample] = dampingFilter1.processSample(channel, delay1.popSample(channel));
157+
delay1.pushSample(channel, channelDataA[sample]);
158+
channelDataA[sample] = (dampingFilter1.processSample(channel, delay1.popSample(channel))) * mDecay;
153159

154160
// OUTPUT NODE A
155161
// L
@@ -161,9 +167,9 @@ class DattorroPlate : public ProcessorBase
161167
// allpass 5
162168
allpassOutput = allpass5.popSample(channel);
163169
feedback = allpassOutput * allpassFeedbackCoefficient;
164-
feedforward = -channelData[sample] - allpassOutput * allpassFeedbackCoefficient;
165-
allpass5.pushSample(channel, channelData[sample] + feedback);
166-
channelData[sample] = allpassOutput + feedforward;
170+
feedforward = -channelDataA[sample] - allpassOutput * allpassFeedbackCoefficient;
171+
allpass5.pushSample(channel, channelDataA[sample] + feedback);
172+
channelDataA[sample] = allpassOutput + feedforward;
167173

168174
// OUTPUT NODE B
169175
// L
@@ -172,26 +178,30 @@ class DattorroPlate : public ProcessorBase
172178
channel1Output -= allpass5.getSampleAtDelay(channel, 496 * mSize) * 0.6;
173179

174180
//delay 2
175-
delay2.pushSample(channel, channelData[sample]);
176-
channelData[sample] = delay2.popSample(channel) * mDecay;
181+
delay2.pushSample(channel, channelDataA[sample]);
182+
channelDataA[sample] = delay2.popSample(channel) * mDecay;
177183

178184
// OUTPUT NODE C
179185
// L
180186
channel0Output += delay2.getSampleAtDelay(channel, 2954 * mSize) * 0.6;
181187
// R
182188
channel1Output -= delay2.getSampleAtDelay(channel, 179 * mSize) * 0.6;
183189

190+
summingA = channelDataA[sample];
191+
184192
// second fig-8 half
193+
channelDataB[sample] += summingA * mDecay;
194+
185195
// modulated APF2
186196
allpassOutput = modulatedAPF2.popSample(channel);
187197
feedback = allpassOutput * allpassFeedbackCoefficient;
188-
feedforward = -channelData[sample] - allpassOutput * allpassFeedbackCoefficient;
189-
modulatedAPF2.pushSample(channel, channelData[sample] + feedback);
190-
channelData[sample] = allpassOutput + feedforward;
198+
feedforward = -channelDataB[sample] - allpassOutput * allpassFeedbackCoefficient;
199+
modulatedAPF2.pushSample(channel, channelDataB[sample] + feedback);
200+
channelDataB[sample] = allpassOutput + feedforward;
191201

192202
// delay 3
193-
delay3.pushSample(channel, channelData[sample]);
194-
channelData[sample] = dampingFilter2.processSample(channel, delay3.popSample(channel));
203+
delay3.pushSample(channel, channelDataB[sample]);
204+
channelDataB[sample] = (dampingFilter2.processSample(channel, delay3.popSample(channel))) * mDecay;
195205

196206
// OUTPUT NODE D
197207
// L
@@ -203,9 +213,9 @@ class DattorroPlate : public ProcessorBase
203213
// allpass 6
204214
allpassOutput = allpass6.popSample(channel);
205215
feedback = allpassOutput * allpassFeedbackCoefficient;
206-
feedforward = -channelData[sample] - allpassOutput * allpassFeedbackCoefficient;
207-
allpass6.pushSample(channel, channelData[sample] + feedback);
208-
channelData[sample] = allpassOutput + feedforward;
216+
feedforward = -channelDataB[sample] - allpassOutput * allpassFeedbackCoefficient;
217+
allpass6.pushSample(channel, channelDataB[sample] + feedback);
218+
channelDataB[sample] = allpassOutput + feedforward;
209219

210220
// OUTPUT NODE E
211221
// L
@@ -214,8 +224,10 @@ class DattorroPlate : public ProcessorBase
214224
channel1Output -= allpass6.getSampleAtDelay(channel, 1817 * mSize) * 0.6;
215225

216226
// delay 4
217-
delay4.pushSample(channel, channelData[sample]);
218-
summingOutput = (delay4.popSample(channel) * mDecay);
227+
delay4.pushSample(channel, channelDataB[sample]);
228+
channelDataB[sample] = delay4.popSample(channel);
229+
230+
summingB = channelDataB[sample];
219231

220232
// OUTPUT NODE F
221233
// L
@@ -303,7 +315,8 @@ class DattorroPlate : public ProcessorBase
303315
float allpassOutput = 0;
304316
float feedback = 0;
305317
float feedforward = 0;
306-
float summingOutput = 0;
318+
float summingA = 0;
319+
float summingB = 0;
307320
float channel0Output = 0;
308321
float channel1Output = 0;
309322

0 commit comments

Comments
 (0)