Skip to content

Commit abb3c81

Browse files
committed
Send Filters and Better Danger
1 parent fcbbdbe commit abb3c81

File tree

6 files changed

+111
-68
lines changed

6 files changed

+111
-68
lines changed

Plateau2/Plateau2.cpp

Lines changed: 62 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -28,14 +28,16 @@ Plateau2::Plateau2(const InstanceInfo& info)
2828
GetParam(kPreDelay1)->InitSeconds("Pre Delay 1", 0., 0., 0.5, 0.01);
2929
GetParam(kNesting1)->InitBool("Nested Tank Diffusion 1", false);
3030
GetParam(kInputNesting1)->InitBool("Nested Input Diffusion 1", false);
31-
GetParam(kDiffusionDecay1)->InitPercentage("Tank Diffusion Decay 1", 100);
31+
GetParam(kDiffusionDecay1)->InitPercentage("Tank Diffusion Decay 1", 76.9230);
3232
GetParam(kInput1)->InitPercentage("Input 1", 100);
3333
GetParam(kStereoSource1)->InitPercentage("Stereo Source 1", 0, -100, 100);
3434
GetParam(kWidth1)->InitPercentage("Stereo Width 1", 100, 0, 200);
3535
GetParam(kPan1)->InitPercentage("Pan 1", 0, -100, 100);
3636
GetParam(k1to2)->InitBool("Send Tank 1 to 2", false);
3737
GetParam(k1to2Level)->InitPercentage("Tank 1 to 2 Level");
3838
GetParam(k1to2Delay)->InitSeconds("Tank 1 to 2 Delay", 0., 0., 0.5, 0.01);
39+
GetParam(k1to2LowDamp)->InitDouble("Tank 1 to 2 Low Damp", 10., 0., 10., 0.01);
40+
GetParam(k1to2HighDamp)->InitDouble("Tank 1 to 2 High Damp", 10., 0., 10., 0.01);
3941

4042

4143
GetParam(kEnable2)->InitBool("Tank 2 Enable", false);
@@ -57,14 +59,16 @@ Plateau2::Plateau2(const InstanceInfo& info)
5759
GetParam(kPreDelay2)->InitSeconds("Pre Delay 2", 0., 0., 0.5, 0.01);
5860
GetParam(kNesting2)->InitBool("Nested Tank Diffusion 2", false);
5961
GetParam(kInputNesting2)->InitBool("Nested Input Diffusion 2", false);
60-
GetParam(kDiffusionDecay2)->InitPercentage("Tank Diffusion Decay 2", 100);
62+
GetParam(kDiffusionDecay2)->InitPercentage("Tank Diffusion Decay 2", 76.9230);
6163
GetParam(kInput2)->InitPercentage("Input 2", 100);
6264
GetParam(kStereoSource2)->InitPercentage("Stereo Source 2", 0, -100, 100);
6365
GetParam(kWidth2)->InitPercentage("Stereo Width 2", 100, 0, 200);
6466
GetParam(kPan2)->InitPercentage("Pan 2", 0, -100, 100);
6567
GetParam(k2to1)->InitBool("Send Tank 2 to 1", false);
6668
GetParam(k2to1Level)->InitPercentage("Tank 1 to 2 Level");
6769
GetParam(k2to1Delay)->InitSeconds("Tank 2 to 1 Delay", 0., 0., 0.5, 0.01);
70+
GetParam(k2to1LowDamp)->InitDouble("Tank 2 to 1 Low Damp", 10., 0., 10., 0.01);
71+
GetParam(k2to1HighDamp)->InitDouble("Tank 2 to 1 High Damp", 10., 0., 10., 0.01);
6872

6973

7074
GetParam(kDanger)->InitBool("DANGER! Allow Unsafe Feedback Settings", false);
@@ -132,19 +136,21 @@ Plateau2::Plateau2(const InstanceInfo& info)
132136
Knobs[12] = new NeedleKnob(IRECT::MakeXYWH(140, 140, 35, 35), NeedleSVG, NeedleBGSVG, NeedleFG1PNG, NeedleFG2PNG, kPreDelay1, kPreDelay2);
133137

134138
Knobs[13] = new NeedleKnob(IRECT::MakeXYWH(233, 310, 56, 56), NeedleSVG, NeedleBGSVG, NeedleFG1PNG, NeedleFG2PNG, kDiffusionDecay1, kDiffusionDecay2);
135-
Knobs[13]->StartAngle = -72.6923f;
136-
Knobs[13]->EndAngle = 72.6923f;
139+
Knobs[13]->Bound = 72.6923f;
137140

138141
Knobs[14] = new NeedleKnob(IRECT::MakeXYWH(93, 170, 56, 56), NeedleSVG, NeedleBGSVG, NeedleFG1PNG, NeedleFG2PNG, kInput1, kInput2);
139142
Knobs[15] = new NeedleKnob(IRECT::MakeXYWH(166, 170, 56, 56), NeedleSVG, NeedleBGSVG, NeedleFG1PNG, NeedleFG2PNG, kStereoSource1, kStereoSource2);
140143

141144
Knobs[16] = new NeedleKnob(IRECT::MakeXYWH(93, 294, 56, 56), NeedleSVG, NeedleBGSVG, NeedleFG1PNG, NeedleFG2PNG, kWidth1, kWidth2);
142145
Knobs[17] = new NeedleKnob(IRECT::MakeXYWH(166, 294, 56, 56), NeedleSVG, NeedleBGSVG, NeedleFG1PNG, NeedleFG2PNG, kPan1, kPan2);
143146

144-
Knobs[18] = new NeedleKnob(IRECT::MakeXYWH(93, 454, 56, 56), NeedleSVG, NeedleBGSVG, NeedleFG1PNG, NeedleFG2PNG, k1to2Level, k2to1Level);
145-
Knobs[19] = new NeedleKnob(IRECT::MakeXYWH(166, 454, 56, 56), NeedleSVG, NeedleBGSVG, NeedleFG1PNG, NeedleFG2PNG, k1to2Delay, k2to1Delay);
147+
Knobs[18] = new NeedleKnob(IRECT::MakeXYWH(93, 440, 56, 56), NeedleSVG, NeedleBGSVG, NeedleFG1PNG, NeedleFG2PNG, k1to2Level, k2to1Level);
148+
Knobs[19] = new NeedleKnob(IRECT::MakeXYWH(166, 440, 56, 56), NeedleSVG, NeedleBGSVG, NeedleFG1PNG, NeedleFG2PNG, k1to2Delay, k2to1Delay);
149+
150+
Knobs[20] = new NeedleKnob(IRECT::MakeXYWH(93, 530, 56, 56), NeedleSVG, NeedleBGSVG, NeedleFG1PNG, NeedleFG2PNG, k1to2LowDamp, k2to1LowDamp);
151+
Knobs[21] = new NeedleKnob(IRECT::MakeXYWH(166, 530, 56, 56), NeedleSVG, NeedleBGSVG, NeedleFG1PNG, NeedleFG2PNG, k1to2HighDamp, k2to1HighDamp);
146152

147-
for (int i = 12; i <= 19; i++) {
153+
for (int i = 12; i <= 21; i++) {
148154
pGraphics->AttachControl(Knobs[i]);
149155
Knobs[i]->Hide(true);
150156
}
@@ -209,7 +215,7 @@ Plateau2::Plateau2(const InstanceInfo& info)
209215

210216
SVGs[0] = new ISVGControl(IRECT::MakeMidXYWH(157.5f, 395, 86.109f, 14.207f), pGraphics->LoadSVG(SEND1TO2_FN));
211217
SVGs[1] = new ISVGControl(IRECT::MakeMidXYWH(157.5f, 395, 89.227f, 17.208f), pGraphics->LoadSVG(SEND2TO1_FN));
212-
SVGs[2] = new ISVGControl(IRECT::MakeMidXYWH(157.5f, 480, 162.106f, 45.576f), pGraphics->LoadSVG(REQUIRESDANGER_FN));
218+
SVGs[2] = new ISVGControl(IRECT::MakeXYWH(76.447f, 457.212, 162.106f, 45.576f), pGraphics->LoadSVG(REQUIRESDANGER_FN));
213219

214220
for (int i = 0; i <= 2; i++) {
215221
pGraphics->AttachControl(SVGs[i]);
@@ -300,7 +306,7 @@ void Plateau2::UpdateSendVisibility() {
300306
Switches[i]->Hide(currentPage != 2);
301307
}
302308
bool dangerous = GetParam(kDanger)->Value();
303-
for (int i = 18; i <= 19; i++) {
309+
for (int i = 18; i <= 21; i++) {
304310
Knobs[i]->Hide(currentPage != 2 || (!dangerous && tank2Selected));
305311
}
306312
SVGs[0]->Hide(currentPage != 2 || tank2Selected);
@@ -391,14 +397,16 @@ void Plateau2::OnParamChange(int index)
391397
case kNesting1:
392398
reverb1.setTankDiffusionNesting(GetParam(index)->Value());
393399
break;
394-
case kDiffusionDecay1:
395-
if (GetParam(kDanger)->Value()) {
396-
reverb1.setTankDiffusionDecay(scale<double>(GetParam(index)->Value(), 0, 100, 0, 1.3));
397-
}
398-
else {
399-
reverb1.setTankDiffusionDecay(scale<double>(GetParam(index)->Value(), 0, 100, .3, 1));
400+
case kDiffusionDecay1:
401+
{
402+
double scaled = scale<double>(GetParam(index)->Value(), 0, 100, 0, 1.3);
403+
if (!GetParam(kDanger)->Value()) {
404+
//Clip to safe values
405+
scaled = clip<double>(scaled, 0.3, 1);
400406
}
401-
break;
407+
reverb1.setTankDiffusionDecay(scaled);
408+
break;
409+
}
402410
case kStereoSource1:
403411
sourceBalance1 = balanceFactors(GetParam(kStereoSource1)->Value()/100);
404412
break;
@@ -408,6 +416,12 @@ void Plateau2::OnParamChange(int index)
408416
case k1to2Delay:
409417
send1To2Delay.setDelayTime(GetParam(k1to2Delay)->Value() * GetSampleRate());
410418
break;
419+
case k1to2LowDamp:
420+
send1To2HP.setCutoffFreq(pitch2freq(10.f - GetParam(index)->Value()));
421+
break;
422+
case k1to2HighDamp:
423+
send1To2LP.setCutoffFreq(pitch2freq(GetParam(index)->Value()));
424+
break;
411425

412426
case kPreDelay2:
413427
reverb2.setPreDelay(GetParam(index)->Value());
@@ -465,13 +479,15 @@ void Plateau2::OnParamChange(int index)
465479
reverb2.setTankDiffusionNesting(GetParam(index)->Value());
466480
break;
467481
case kDiffusionDecay2:
468-
if (GetParam(kDanger)->Value()) {
469-
reverb2.setTankDiffusionDecay(scale<double>(GetParam(index)->Value(), 0, 100, 0, 1.3));
470-
}
471-
else {
472-
reverb2.setTankDiffusionDecay(scale<double>(GetParam(index)->Value(), 0, 100, .3, 1));
482+
{
483+
double scaled = scale<double>(GetParam(index)->Value(), 0, 100, 0, 1.3);
484+
if (!GetParam(kDanger)->Value()) {
485+
//Clip to safe values
486+
scaled = clip<double>(scaled, 0.3, 1);
473487
}
488+
reverb2.setTankDiffusionDecay(scaled);
474489
break;
490+
}
475491
case kStereoSource2:
476492
sourceBalance2 = balanceFactors(GetParam(kStereoSource2)->Value()/100);
477493
break;
@@ -481,41 +497,27 @@ void Plateau2::OnParamChange(int index)
481497
case k2to1Delay:
482498
send2To1Delay.setDelayTime(GetParam(k2to1Delay)->Value() * GetSampleRate());
483499
break;
500+
case k2to1LowDamp:
501+
send2To1HP.setCutoffFreq(pitch2freq(10.f - GetParam(index)->Value()));
502+
break;
503+
case k2to1HighDamp:
504+
send2To1LP.setCutoffFreq(pitch2freq(GetParam(index)->Value()));
505+
break;
484506

485507
case kDanger:
486-
if (GetParam(kDanger)->Value()) {
487-
//Allow the user to set the diffusion decay to unsafe values
488-
GetParam(kDiffusionDecay1)->SetDefault(76.9230);
489-
GetParam(kDiffusionDecay2)->SetDefault(76.9230);
490-
491-
SetParameterValue(kDiffusionDecay1, scale<double>(GetParam(kDiffusionDecay1)->Value(), 0, 100, .230769, .7692307));
492-
GetParam(kDiffusionDecay2)->Set(scale<double>(GetParam(kDiffusionDecay2)->Value(), 0, 100, 23.0769, 76.92307));
493-
494-
if (initalizedInterface)
495-
{
496-
Knobs[13]->StartAngle = -135.f;
497-
Knobs[13]->EndAngle = 135.f;
498-
}
499-
}
500-
else {
501-
GetParam(kDiffusionDecay1)->SetDefault(100);
502-
GetParam(kDiffusionDecay2)->SetDefault(100);
503-
504-
SetParameterValue(kDiffusionDecay1, clip<double>(scale<double>(GetParam(kDiffusionDecay1)->Value(), 23.0769, 76.92307, 0, 1),0,100));
505-
GetParam(kDiffusionDecay2)->Set(clip<double>(scale<double>(GetParam(kDiffusionDecay2)->Value(), 23.0769, 76.92307, 0, 100),0,100));
506-
508+
if (!GetParam(kDanger)->Value()) {
509+
//Reset the plugin when danger is turned off for safety
507510
SetParameterValue(kClear, 1);
508-
509-
if (initalizedInterface)
510-
{
511-
Knobs[13]->StartAngle = -72.6923f;
512-
Knobs[13]->EndAngle = 72.6923f;
513-
}
514511
}
515512
if (initalizedInterface) {
516-
Knobs[13]->SetValue((tank2Selected ? GetParam(kDiffusionDecay2)->Value() : GetParam(kDiffusionDecay1)->Value()) / 100);
517-
Knobs[13]->SetDirty(false);
518513
UpdateSendVisibility();
514+
Knobs[13]->Bound = GetParam(kDanger)->Value() ? 135.f : 72.6923f;
515+
516+
SetParameterValue(kDiffusionDecay1, clip<double>(GetParam(kDiffusionDecay1)->Value(), 23.0769, 76.92307)/100);
517+
SetParameterValue(kDiffusionDecay2, clip<double>(GetParam(kDiffusionDecay2)->Value(), 23.0769, 76.92307)/100);
518+
519+
Knobs[13]->SetValue((tank2Selected ? GetParam(kDiffusionDecay2)->Value() : GetParam(kDiffusionDecay1)->Value()) / 100);
520+
Knobs[13]->SetDirty(false);
519521
}
520522
break;
521523
}
@@ -604,7 +606,11 @@ void Plateau2::ProcessBlock(sample** inputs, sample** outputs, int nFrames)
604606
if (send1to2) {
605607
send1To2Delay.input = 0.707 * (reverb1.getLeftOutput() + reverb1.getRightOutput());
606608
send1To2Delay.process();
607-
reverbOut1 = send1To2Delay.output;
609+
send1To2LP.input = send1To2Delay.output;
610+
send1To2LP.process();
611+
send1To2HP.input = send1To2LP.output;
612+
send1To2HP.process();
613+
reverbOut1 = send1To2HP.output;
608614
}
609615
}
610616

@@ -672,7 +678,11 @@ void Plateau2::ProcessBlock(sample** inputs, sample** outputs, int nFrames)
672678
if (send2to1) {
673679
send2To1Delay.input = 0.707 * (reverb2.getLeftOutput()+reverb2.getRightOutput());
674680
send2To1Delay.process();
675-
reverbOut2 = send2To1Delay.output;
681+
send2To1LP.input = send2To1Delay.output;
682+
send2To1LP.process();
683+
send2To1HP.input = send2To1LP.output;
684+
send2To1HP.process();
685+
reverbOut2 = send2To1HP.output;
676686
}
677687
}
678688
}

Plateau2/Plateau2.h

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,8 @@ enum EParams
4646
k1to2,
4747
k1to2Level,
4848
k1to2Delay,
49+
k1to2LowDamp,
50+
k1to2HighDamp,
4951

5052
kEnable2,
5153
kWet2,
@@ -74,13 +76,15 @@ enum EParams
7476
k2to1,
7577
k2to1Level,
7678
k2to1Delay,
79+
k2to1LowDamp,
80+
k2to1HighDamp,
7781

7882
kDanger,
7983

8084
kNumParams
8185
};
8286

83-
const int kNumKnobs = 20;
87+
const int kNumKnobs = 22;
8488
const int kNumSwitches = 8;
8589
const int kNumButtons = 2;
8690
const int kNumPages = 3;
@@ -112,6 +116,8 @@ class Plateau2 final : public Plugin
112116
std::tuple<double, double> panBalance1 = { 0, 0 };
113117
LinearEnvelope envelope1;
114118
InterpDelay<double> send1To2Delay;
119+
OnePoleLPFilter send1To2LP = OnePoleLPFilter(22000.0);
120+
OnePoleHPFilter send1To2HP = OnePoleHPFilter(0.0);
115121
bool clear1 = false;
116122
bool cleared1 = true;
117123
bool fadeOut1 = false;
@@ -124,6 +130,8 @@ class Plateau2 final : public Plugin
124130
std::tuple<double, double> panBalance2 = { 0, 0 };
125131
LinearEnvelope envelope2;
126132
InterpDelay<double> send2To1Delay;
133+
OnePoleLPFilter send2To1LP = OnePoleLPFilter(22000.0);
134+
OnePoleHPFilter send2To1HP = OnePoleHPFilter(0.0);
127135
bool clear2 = false;
128136
bool cleared2 = true;
129137
bool fadeOut2 = false;

Plateau2/controls/NeedleKnob.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ class NeedleKnob : public IKnobControlBase
2020
void Draw(IGraphics& g) override
2121
{
2222
g.DrawSVG(mDialBg, mRECT);
23-
g.DrawRotatedSVG(mDialPointer, mRECT.MW(), mRECT.MH(), mRECT.W(), mRECT.H(), StartAngle + GetValue() * (EndAngle - StartAngle), &mBlend);
23+
g.DrawRotatedSVG(mDialPointer, mRECT.MW(), mRECT.MH(), mRECT.W(), mRECT.H(), clip<double>(StartAngle + GetValue() * (EndAngle - StartAngle), -Bound, Bound), &mBlend);
2424
g.DrawFittedBitmap(tank2 ? mDialFg2 : mDialFg1, mRECT);
2525
}
2626

@@ -36,6 +36,7 @@ class NeedleKnob : public IKnobControlBase
3636

3737
float StartAngle = -135.f;
3838
float EndAngle = 135.f;
39+
float Bound = 135.f;
3940

4041
private:
4142
IBitmap mDialFg1;

Plateau2/dsp/Dattorro.cpp

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -352,11 +352,11 @@ void Dattorro::freeze(bool freezeFlag) {
352352
}
353353

354354
void Dattorro::setInputFilterLowCutoffPitch(double pitch) {
355-
inputLowCut = 440.0 * std::pow(2.0, pitch - 5.0);
355+
inputLowCut = pitch2freq(pitch);
356356
}
357357

358358
void Dattorro::setInputFilterHighCutoffPitch(double pitch) {
359-
inputHighCut = 440.0 * std::pow(2.0, pitch - 5.0);
359+
inputHighCut = pitch2freq(pitch);
360360
}
361361

362362
void Dattorro::enableInputDiffusion(bool enable) {
@@ -381,13 +381,11 @@ void Dattorro::setTankDiffusionDecay(const double diffusionDecay) {
381381
}
382382

383383
void Dattorro::setTankFilterHighCutFrequency(const double pitch) {
384-
auto frequency = 440.0 * std::pow(2.0, pitch - 5.0);
385-
tank.setHighCutFrequency(frequency);
384+
tank.setHighCutFrequency(pitch2freq(pitch));
386385
}
387386

388387
void Dattorro::setTankFilterLowCutFrequency(const double pitch) {
389-
auto frequency = 440.0 * std::pow(2.0, pitch - 5.0);
390-
tank.setLowCutFrequency(frequency);
388+
tank.setLowCutFrequency(pitch2freq(pitch));
391389
}
392390

393391
void Dattorro::setTankModSpeed(const double modSpeed) {

Plateau2/dsp/Utilities.hpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,9 @@ std::tuple<double, double> seperation(double left, double right, double width) {
4747
return { newLeft, newRight };
4848
}
4949

50-
float pitch2freq(const float pitch);
50+
float pitch2freq(const double pitch) {
51+
return 440.0 * std::pow(2.0, pitch - 5.0);
52+
}
5153

5254
uint32_t mwcRand(uint32_t& w, uint32_t& z);
5355

0 commit comments

Comments
 (0)