@@ -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