@@ -71,6 +71,9 @@ void LargeConcertHallB::prepareToPlay(double sampleRate, int samplesPerBlock)
7171 allpassR4Inner.prepare (monoSpec);
7272 allpassR4Outer.prepare (monoSpec);
7373
74+ lfoParameters.frequency_Hz = 0.5 ;
75+ lfoParameters.waveform = generatorWaveform::kSin ;
76+ lfo.setParameters (lfoParameters);
7477}
7578
7679// ==============================================================================
@@ -130,6 +133,9 @@ void LargeConcertHallB::processBlock(juce::AudioBuffer<float>& buffer, juce::Mid
130133
131134 for (int sample = 0 ; sample < buffer.getNumSamples (); ++sample)
132135 {
136+ // ================ render next LFO step ================
137+ lfoOutput = lfo.renderAudioOutput ();
138+
133139 // ======== take sample in from buffer; add to channel inputs ========
134140 for (int channel = 0 ; channel < (buffer.getNumChannels () <= 2 ? buffer.getNumChannels () : 2 ); ++channel)
135141 {
@@ -173,9 +179,11 @@ void LargeConcertHallB::processBlock(juce::AudioBuffer<float>& buffer, juce::Mid
173179 feedforwardInner = reverbData[sample] * -0.312 * mDiffusion ;
174180 allpassL2.pushSample (0 , reverbData[sample]);
175181 reverbData[sample] = (allpassOutputInner * 0.906 * mDecay ) + feedforwardInner;
176-
182+ // node 23
177183 loopDelayL2.pushSample (0 , reverbData[sample]);
178184 reverbData[sample] = loopDelayL2.popSample (0 );
185+ // start output R
186+ channelOutput.at (1 ) = reverbData[sample] * 0.938 ;
179187
180188 // nested allpass 3
181189 // begin outer
@@ -194,8 +202,13 @@ void LargeConcertHallB::processBlock(juce::AudioBuffer<float>& buffer, juce::Mid
194202 allpassL3Outer.pushSample (0 , reverbData[sample]);
195203 reverbData[sample] = (allpassOutputOuter * 0.844 * mDecay ) + feedforwardOuter;
196204
205+ // node 27_31
197206 loopDelayL3.pushSample (0 , reverbData[sample]);
198207 reverbData[sample] = loopDelayL3.popSample (0 );
208+ // start output L
209+ channelOutput.at (0 ) = (loopDelayL3.getSampleAtDelay (0 , 276 ) * 0.938 ) - (loopDelayL3.getSampleAtDelay (0 , 312 ) * 0.438 );
210+ // output R
211+ channelOutput.at (1 ) += loopDelayL3.getSampleAtDelay (0 , 40 ) * 0.438 ;
199212
200213 // nested allpass 4
201214 // begin outer
@@ -213,7 +226,7 @@ void LargeConcertHallB::processBlock(juce::AudioBuffer<float>& buffer, juce::Mid
213226 // chorus
214227 allpassChorusL.pushSample (0 , allpassOutputInnermost);
215228 allpassOutputInnermost *= 0.781 ;
216- allpassOutputInnermost += allpassChorusL.popSample (0 ) * 0.219 ; // modulate here
229+ allpassOutputInnermost += allpassChorusL.popSample (0 , scale (lfoOutput. normalOutput , - 1 , 1 , 1 , 12 ) ) * 0.219 ; // modulate here
217230 // finish innermost
218231 feedbackInnermost = allpassOutputInnermost * 0.25 * mDiffusion ;
219232 reverbData[sample] += feedbackInnermost;
@@ -227,8 +240,11 @@ void LargeConcertHallB::processBlock(juce::AudioBuffer<float>& buffer, juce::Mid
227240 allpassL4Outer.pushSample (0 , reverbData[sample]);
228241 reverbData[sample] = (allpassOutputOuter * 0.844 * mDecay ) + feedforwardOuter;
229242
243+ // node 37_39
230244 loopDelayL4.pushSample (0 , reverbData[sample]);
231245 reverbData[sample] = loopDelayL4.popSample (0 );
246+ // output R
247+ channelOutput.at (1 ) += (loopDelayL4.getSampleAtDelay (0 , 36 ) * 0.469 ) + (loopDelayL4.getSampleAtDelay (0 , 1572 ) * 0.125 );
232248
233249 // feedback *TO* R channel
234250 channelFeedback.at (1 ) = reverbData[sample];
@@ -253,8 +269,11 @@ void LargeConcertHallB::processBlock(juce::AudioBuffer<float>& buffer, juce::Mid
253269 allpassR2.pushSample (0 , reverbData[sample]);
254270 reverbData[sample] = (allpassOutputInner * 0.906 * mDecay ) + feedforwardInner;
255271
272+ // node 40_42
256273 loopDelayR2.pushSample (0 , reverbData[sample]);
257274 reverbData[sample] = loopDelayR2.popSample (0 );
275+ // output L
276+ channelOutput.at (0 ) += loopDelayR2.getSampleAtDelay (0 , 625 ) * 0.938 ;
258277
259278 // nested allpass 3
260279 // begin outer
@@ -263,15 +282,58 @@ void LargeConcertHallB::processBlock(juce::AudioBuffer<float>& buffer, juce::Mid
263282 reverbData[sample] += feedbackOuter;
264283 feedforwardOuter = reverbData[sample] * -0.406 * mDiffusion ;
265284 // inner
285+ allpassOutputInner = allpassR3Inner.popSample (0 );
286+ feedbackInner = allpassOutputInner * 0.25 * mDiffusion ;
287+ reverbData[sample] += feedbackInner;
288+ feedforwardInner = reverbData[sample] * -0.25 * mDiffusion ;
289+ allpassR3Inner.pushSample (0 , reverbData[sample]);
290+ reverbData[sample] = (allpassOutputInner * 0.938 * mDecay ) + feedforwardInner;
291+ // finish outer
292+ allpassR3Outer.pushSample (0 , reverbData[sample]);
293+ reverbData[sample] = (allpassOutputOuter * 0.844 * mDecay ) + feedforwardOuter;
266294
295+ // node 45_49
267296 loopDelayR3.pushSample (0 , reverbData[sample]);
268297 reverbData[sample] = loopDelayR3.popSample (0 );
298+ // output L
299+ channelOutput.at (0 ) += loopDelayR3.getSampleAtDelay (0 , 468 ) * 0.438 ;
300+ channelOutput.at (1 ) += (loopDelayR3.getSampleAtDelay (0 , 24 ) * 0.938 ) - (loopDelayR3.getSampleAtDelay (0 , 192 ) * 0.438 );
269301
270302 // allpass 4
303+ // begin outer
304+ allpassOutputOuter = allpassR4Outer.popSample (0 );
305+ feedbackOuter = allpassOutputInner * 0.406 * mDiffusion ;
306+ reverbData[sample] += feedbackOuter;
307+ feedforwardOuter = reverbData[sample] * -0.406 * mDiffusion ;
308+ // begin inner
309+ allpassOutputInner = allpassR4Inner.popSample (0 );
310+ feedbackInner = allpassOutputInner * 0.25 * mDiffusion ;
311+ reverbData[sample] += feedbackInner;
312+ feedforwardInner = reverbData[sample] * -0.25 * mDiffusion ;
313+ // innermost
314+ allpassOutputInnermost = allpassR4Innermost.popSample (0 );
315+ // chorus
316+ allpassChorusR.pushSample (0 , allpassOutputInnermost);
317+ allpassOutputInnermost *= 0.781 ;
318+ allpassOutputInnermost += allpassChorusL.popSample (0 , scale (lfoOutput.quadPhaseOutput_pos , -1 , 1 , 1 , 12 )) * 0.219 ; // modulate here
319+ // finish innermost
320+ feedbackInnermost = allpassOutputInnermost * 0.25 * mDiffusion ;
321+ reverbData[sample] += feedbackInnermost;
322+ feedforwardInnermost = reverbData[sample] * -0.25 * mDiffusion ;
323+ allpassR4Innermost.pushSample (0 , reverbData[sample]);
324+ reverbData[sample] = (allpassOutputInnermost * 0.938 * mDecay ) + feedforwardInnermost;
325+ // finish inner
326+ allpassR4Inner.pushSample (0 , reverbData[sample]);
327+ reverbData[sample] = (allpassOutputInner * 0.938 * mDecay ) + feedbackInner;
328+ // finish outer
329+ allpassR4Outer.pushSample (0 , reverbData[sample]);
330+ reverbData[sample] = (allpassOutputOuter * 0.844 * mDecay ) + feedforwardOuter;
271331
272-
332+ // node 55_58
273333 loopDelayR4.pushSample (0 , reverbData[sample]);
274334 reverbData[sample] = loopDelayR4.popSample (0 );
335+ // output L
336+ channelOutput.at (0 ) += loopDelayR4.getSampleAtDelay (0 , 8 ) * 0.125 ;
275337
276338 // feedback *TO* L channel
277339 channelFeedback.at (0 ) = reverbData[sample];
@@ -341,10 +403,10 @@ void LargeConcertHallB::reset()
341403const juce::String LargeConcertHallB::getName () const { return " LargeConcertHallB" ; }
342404
343405// ==============================================================================
344- void LargeConcertHallB::setSize (float newSize) { mSize = newSize; }
345- void LargeConcertHallB::setDecay (float newDecay) { mDecay = newDecay; }
406+ void LargeConcertHallB::setSize (float newSize) { mSize = newSize * 44.1 / 34.125 ; }
407+ void LargeConcertHallB::setDecay (float newDecay) { mDecay = pow ( newDecay, 0.67 ) / 0.9 ; }
346408void LargeConcertHallB::setDampingCutoff (float newCutoff) { mDampingCutoff = newCutoff; }
347- void LargeConcertHallB::setDiffusion (float newDiffusion) { mDiffusion = newDiffusion / 0.406 ; }
409+ void LargeConcertHallB::setDiffusion (float newDiffusion) { mDiffusion = newDiffusion * 1.5 ; }
348410void LargeConcertHallB::setPreDelay (float newPreDelay) { mPreDelayTime = newPreDelay; }
349411void LargeConcertHallB::setEarlyLateMix (float newMix) { mEarlyLateMix = newMix; }
350412void LargeConcertHallB::setDryWetMix (float newMix) { mDryWetMix = newMix; }
0 commit comments