Skip to content

Commit efffb79

Browse files
committed
added Large Concert Hall B
1 parent ace7414 commit efffb79

File tree

5 files changed

+94
-17
lines changed

5 files changed

+94
-17
lines changed

Source/ConcertHallB.cpp

Lines changed: 68 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -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()
341403
const 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; }
346408
void 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; }
348410
void LargeConcertHallB::setPreDelay(float newPreDelay) { mPreDelayTime = newPreDelay; }
349411
void LargeConcertHallB::setEarlyLateMix(float newMix) { mEarlyLateMix = newMix; }
350412
void LargeConcertHallB::setDryWetMix(float newMix) { mDryWetMix = newMix; }

Source/ConcertHallB.h

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -55,15 +55,15 @@ class LargeConcertHallB : public ProcessorBase
5555
// delays
5656
juce::dsp::DelayLine<float> inputZ { 4 };
5757
// L
58-
juce::dsp::DelayLine<float> loopDelayL1 { 8 };
59-
juce::dsp::DelayLine<float> loopDelayL2 { 4410 };
60-
juce::dsp::DelayLine<float> loopDelayL3 { 4410 };
61-
juce::dsp::DelayLine<float> loopDelayL4 { 4410 };
58+
DelayLineWithSampleAccess<float> loopDelayL1 { 8 };
59+
DelayLineWithSampleAccess<float> loopDelayL2 { 4410 };
60+
DelayLineWithSampleAccess<float> loopDelayL3 { 4410 };
61+
DelayLineWithSampleAccess<float> loopDelayL4 { 4410 };
6262
// R
63-
juce::dsp::DelayLine<float> loopDelayR1 { 8 };
64-
juce::dsp::DelayLine<float> loopDelayR2 { 4410 };
65-
juce::dsp::DelayLine<float> loopDelayR3 { 4410 };
66-
juce::dsp::DelayLine<float> loopDelayR4 { 4410 };
63+
DelayLineWithSampleAccess<float> loopDelayR1 { 8 };
64+
DelayLineWithSampleAccess<float> loopDelayR2 { 4410 };
65+
DelayLineWithSampleAccess<float> loopDelayR3 { 4410 };
66+
DelayLineWithSampleAccess<float> loopDelayR4 { 4410 };
6767

6868
// allpasses
6969
// L

Source/PluginEditor.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ RSAlgorithmicVerbAudioProcessorEditor::RSAlgorithmicVerbAudioProcessorEditor (RS
5959
addAndMakeVisible(reverbMenuBox);
6060
reverbMenuBox.addSectionHeading("Allpass Rings");
6161
reverbMenuBox.addItem("Dattorro Plate", dattorro);
62+
reverbMenuBox.addItem("Large Concert Hall B", largeConcertHallB);
6263
reverbMenuBox.addItem("Gardner Small Room", gardnerSmallRoom);
6364
reverbMenuBox.addItem("Gardner Medium Room", gardnerMediumRoom);
6465
reverbMenuBox.addItem("Gardner Large Room", gardnerLargeRoom);

Source/PluginEditor.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,7 @@ class RSAlgorithmicVerbAudioProcessorEditor : public juce::AudioProcessorEditor
7575
enum reverbTypes
7676
{
7777
dattorro = 1,
78+
largeConcertHallB,
7879
gardnerSmallRoom,
7980
gardnerMediumRoom,
8081
gardnerLargeRoom,

Source/PluginProcessor.cpp

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -343,6 +343,19 @@ void RSAlgorithmicVerbAudioProcessor::updateGraph()
343343
break;
344344

345345
case 1:
346+
if (reverbNode != nullptr)
347+
{
348+
if (reverbNode->getProcessor()->getName() == "LargeConcertHallB")
349+
break;
350+
351+
mainProcessor->removeNode(reverbNode.get());
352+
}
353+
354+
reverbNode = mainProcessor->addNode(std::make_unique<LargeConcertHallB>());
355+
hasChanged = true;
356+
break;
357+
358+
case 2:
346359
if (reverbNode != nullptr)
347360
{
348361
if (reverbNode->getProcessor()->getName() == "GardnerSmallRoom")
@@ -355,7 +368,7 @@ void RSAlgorithmicVerbAudioProcessor::updateGraph()
355368
hasChanged = true;
356369
break;
357370

358-
case 2:
371+
case 3:
359372
if (reverbNode != nullptr)
360373
{
361374
if (reverbNode->getProcessor()->getName() == "GardnerMediumRoom")
@@ -368,7 +381,7 @@ void RSAlgorithmicVerbAudioProcessor::updateGraph()
368381
hasChanged = true;
369382
break;
370383

371-
case 3:
384+
case 4:
372385
if (reverbNode != nullptr)
373386
{
374387
if (reverbNode->getProcessor()->getName() == "GardnerLargeRoom")
@@ -381,7 +394,7 @@ void RSAlgorithmicVerbAudioProcessor::updateGraph()
381394
hasChanged = true;
382395
break;
383396

384-
case 4:
397+
case 5:
385398
if (reverbNode != nullptr)
386399
{
387400
if (reverbNode->getProcessor()->getName() == "Freeverb")

0 commit comments

Comments
 (0)