@@ -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 }
0 commit comments