@@ -11,7 +11,6 @@ Plateau2::Plateau2(const InstanceInfo& info)
1111
1212 GetParam (kEnable1 )->InitBool (" Tank 1 Enable" , true );
1313 GetParam (kWet1 )->InitPercentage (" Wet 1" , 50 );
14- GetParam (kPreDelay1 )->InitSeconds (" Pre Delay 1" , 0 ., 0 ., 0.5 , 0.01 );
1514 GetParam (kInputLowDamp1 )->InitDouble (" Input Low Damp 1" , 10 ., 0 ., 10 ., 0.01 );
1615 GetParam (kInputHighDamp1 )->InitDouble (" Input High Damp 1" , 10 ., 0 ., 10 ., 0.01 );
1716 GetParam (kSize1 )->InitDouble (" Size 1" , 0.5 , 0 ., 1 ., 0.01 );
@@ -26,10 +25,15 @@ Plateau2::Plateau2(const InstanceInfo& info)
2625 GetParam (kClear1 )->InitBool (" Clear 1" , false );
2726 GetParam (kTunedMode1 )->InitBool (" Tuned Mode 1" , false );
2827 GetParam (kDiffuseInput1 )->InitBool (" Diffuse Input 1" , true );
28+ GetParam (kPreDelay1 )->InitSeconds (" Pre Delay 1" , 0 ., 0 ., 0.5 , 0.01 );
29+ GetParam (kNesting1 )->InitBool (" Nested Tank Diffusion 1" , false );
30+ GetParam (kInputNesting1 )->InitBool (" Nested Input Diffusion 1" , false );
31+ // GetParam(kDiffusionDecay1)->InitPercentage("Tank Diffusion Decay 1", 75, 20, 130);
32+ GetParam (kDiffusionDecay1 )->InitPercentage (" Tank Diffusion Decay 1" , 100 );
33+
2934
3035 GetParam (kEnable2 )->InitBool (" Tank 2 Enable" , false );
3136 GetParam (kWet2 )->InitPercentage (" Wet 2" , 50 );
32- GetParam (kPreDelay2 )->InitSeconds (" Pre Delay 2" , 0 ., 0 ., 0.5 , 0.01 );
3337 GetParam (kInputLowDamp2 )->InitDouble (" Input Low Damp 2" , 10 ., 0 ., 10 ., 0.01 );
3438 GetParam (kInputHighDamp2 )->InitDouble (" Input High Damp 2" , 10 ., 0 ., 10 ., 0.01 );
3539 GetParam (kSize2 )->InitDouble (" Size 2" , 0.5 , 0 ., 1 ., 0.01 );
@@ -44,6 +48,13 @@ Plateau2::Plateau2(const InstanceInfo& info)
4448 GetParam (kClear2 )->InitBool (" Clear 2" , false );
4549 GetParam (kTunedMode2 )->InitBool (" Tuned Mode 2" , false );
4650 GetParam (kDiffuseInput2 )->InitBool (" Diffuse Input 2" , true );
51+ GetParam (kPreDelay2 )->InitSeconds (" Pre Delay 2" , 0 ., 0 ., 0.5 , 0.01 );
52+ GetParam (kNesting2 )->InitBool (" Nested Tank Diffusion 2" , false );
53+ GetParam (kInputNesting2 )->InitBool (" Nested Input Diffusion 2" , false );
54+ GetParam (kDiffusionDecay2 )->InitPercentage (" Tank Diffusion Decay 2" , 100 );
55+
56+
57+ GetParam (kDanger )->InitBool (" DANGER! Allow Unsafe Feedback Settings" , false );
4758
4859
4960 reverb1.setSampleRate (GetSampleRate ());
@@ -91,17 +102,21 @@ Plateau2::Plateau2(const InstanceInfo& info)
91102 Knobs[9 ] = new NeedleKnob (IRECT::MakeXYWH (56 , 518 , 56 , 56 ), NeedleSVG, NeedleBGSVG, NeedleFG1PNG, NeedleFG2PNG, kModSpeed1 , kModSpeed2 );
92103 Knobs[10 ] = new NeedleKnob (IRECT::MakeXYWH (203 , 518 , 56 , 56 ), NeedleSVG, NeedleBGSVG, NeedleFG1PNG, NeedleFG2PNG, kModDepth1 , kModDepth2 );
93104 Knobs[11 ] = new NeedleKnob (IRECT::MakeXYWH (130 , 543 , 56 , 56 ), NeedleSVG, NeedleBGSVG, NeedleFG1PNG, NeedleFG2PNG, kModShape1 , kModShape2 );
94-
95- Knobs[12 ] = new NeedleKnob (IRECT::MakeXYWH (140 , 140 , 35 , 35 ), NeedleSVG, NeedleBGSVG, NeedleFG1PNG, NeedleFG2PNG, kPreDelay1 , kPreDelay2 );
96105
97106 for (int i = 0 ; i <= 11 ; i++) {
98107 pGraphics->AttachControl (Knobs[i]);
99108 }
109+
110+ Knobs[12 ] = new NeedleKnob (IRECT::MakeXYWH (140 , 140 , 35 , 35 ), NeedleSVG, NeedleBGSVG, NeedleFG1PNG, NeedleFG2PNG, kPreDelay1 , kPreDelay2 );
111+ Knobs[13 ] = new NeedleKnob (IRECT::MakeXYWH (203 , 310 , 56 , 56 ), NeedleSVG, NeedleBGSVG, NeedleFG1PNG, NeedleFG2PNG, kDiffusionDecay1 , kDiffusionDecay2 );
112+ Knobs[13 ]->StartAngle = -72 .6923f ;
113+ Knobs[13 ]->EndAngle = 72 .6923f ;
100114
101- for (int i = 12 ; i <= 12 ; i++) {
115+ for (int i = 12 ; i <= 13 ; i++) {
102116 pGraphics->AttachControl (Knobs[i]);
103117 Knobs[i]->Hide (true );
104118 }
119+
105120 NextButtonControl = new NavigatorButton (IRECT::MakeXYWH (220 .572f , 125 .695f , 82 .306f , 30 .f ), [this , PageBackgrounds, NextButtons, PrevButtons](IControl* pCaller) {
106121 ChangePage (1 , PageBackgrounds, NextButtons, PrevButtons);
107122 }, pGraphics->LoadSVG (NEXTEXTRAS_FN));
@@ -114,6 +129,10 @@ Plateau2::Plateau2(const InstanceInfo& info)
114129 const ISVG LedOn2SVG = pGraphics->LoadSVG (LEDON2_FN);
115130 const ISVG LedOnBothSVG = pGraphics->LoadSVG (LEDONBOTH_FN);
116131
132+ const ISVG DangerOffSVG = pGraphics->LoadSVG (DANGEROFF_FN);
133+ const ISVG DangerOnSVG = pGraphics->LoadSVG (DANGERON_FN);
134+
135+ // Main page Switches
117136 Switches[0 ] = new LEDSwitch (IRECT::MakeXYWH (-11 .526f , 404 .802f -45 , 102 , 102 ), LEDScale, LedOffSVG, LedOnBothSVG, LedOnBothSVG, kFreeze , kFreeze );
118137 Switches[1 ] = new LEDSwitch (IRECT::MakeXYWH (-11 .526f , 404 .802f +30 , 102 , 102 ), LEDScale, LedOffSVG, LedOn1SVG, LedOn2SVG, kFreeze1 , kFreeze2 );
119138 Switches[2 ] = new LEDSwitch (IRECT::MakeXYWH (-14 , 216 , 102 , 102 ), LEDScale, LedOffSVG, LedOn1SVG, LedOn2SVG, kTunedMode1 , kTunedMode2 );
@@ -129,14 +148,25 @@ Plateau2::Plateau2(const InstanceInfo& info)
129148 pGraphics->AttachControl (Buttons[i]);
130149 }
131150
132- // Tank Enable Button
151+ // Tank Enable Switch
133152 Switches[4 ] = new LEDSwitch (IRECT::MakeXYWH (106 .5f , 112 , 102 , 102 ), LEDScale, LedOffSVG, LedOn1SVG, LedOn2SVG, kEnable1 , kEnable2 );
134153 Switches[4 ]->SetValue (1 );
135154
136- for (int i = 0 ; i < kNumSwitches ; i++) {
155+
156+ for (int i = 0 ; i <= 4 ; i++) {
137157 pGraphics->AttachControl (Switches[i]);
138158 }
139159
160+ Switches[5 ] = new LEDSwitch (IRECT::MakeXYWH (228 , 216 , 102 , 102 ), LEDScale, LedOffSVG, LedOn1SVG, LedOn2SVG, kNesting1 , kNesting2 );
161+
162+ // DANGER switch
163+ Switches[6 ] = new LEDSwitch (IRECT::MakeXYWH (130 , 329 , 56 , 56 ).GetScaledAboutCentre (2 ), 1 , DangerOffSVG, DangerOnSVG, DangerOnSVG, kDanger , kDanger );
164+
165+ for (int i = 5 ; i <= 6 ; i++) {
166+ pGraphics->AttachControl (Switches[i]);
167+ Switches[i]->Hide (true );
168+ }
169+
140170
141171 LEDRadio* tank1Select = new LEDRadio (IRECT::MakeXYWH (106.5 - 20 , 40 , 102 , 102 ), LEDScale, LedOffSVG, LedOn1SVG, [this ](IControl* radioControl) {SelectTank (false );});
142172 LEDRadio* tank2Select = new LEDRadio (IRECT::MakeXYWH (106.5 + 20 , 40 , 102 , 102 ), LEDScale, LedOffSVG, LedOn2SVG, [this ](IControl* radioControl) {SelectTank (true );});
@@ -200,9 +230,12 @@ void Plateau2::UpdatePageVisibility()
200230 }
201231
202232 // Extras page
203- for (int i = 12 ; i <= 12 ; i++) {
233+ for (int i = 12 ; i <= 13 ; i++) {
204234 Knobs[i]->Hide (currentPage != 1 );
205235 }
236+ for (int i = 5 ; i <= 6 ; i++) {
237+ Switches[i]->Hide (currentPage != 1 );
238+ }
206239}
207240
208241
@@ -284,6 +317,17 @@ void Plateau2::OnParamChange(int index)
284317 case kDiffuseInput1 :
285318 reverb1.enableInputDiffusion (GetParam (index)->Value ());
286319 break ;
320+ case kNesting1 :
321+ reverb1.setTankDiffusionNesting (GetParam (index)->Value ());
322+ break ;
323+ case kDiffusionDecay1 :
324+ if (GetParam (kDanger )->Value ()) {
325+ reverb1.setTankDiffusionDecay (scale<double >(GetParam (index)->Value (), 0 , 100 , 0 , 1.3 ));
326+ }
327+ else {
328+ reverb1.setTankDiffusionDecay (scale<double >(GetParam (index)->Value (), 0 , 100 , .3 , 1 ));
329+ }
330+ break ;
287331
288332 case kPreDelay2 :
289333 reverb2.setPreDelay (GetParam (index)->Value ());
@@ -337,6 +381,53 @@ void Plateau2::OnParamChange(int index)
337381 case kDiffuseInput2 :
338382 reverb2.enableInputDiffusion (GetParam (index)->Value ());
339383 break ;
384+ case kNesting2 :
385+ reverb2.setTankDiffusionNesting (GetParam (index)->Value ());
386+ break ;
387+ case kDiffusionDecay2 :
388+ if (GetParam (kDanger )->Value ()) {
389+ reverb2.setTankDiffusionDecay (scale<double >(GetParam (index)->Value (), 0 , 100 , 0 , 1.3 ));
390+ }
391+ else {
392+ reverb2.setTankDiffusionDecay (scale<double >(GetParam (index)->Value (), 0 , 100 , .3 , 1 ));
393+ }
394+ break ;
395+
396+ case kDanger :
397+ if (GetParam (kDanger )->Value ()) {
398+ // Allow the user to set the diffusion decay to unsafe values
399+ GetParam (kDiffusionDecay1 )->SetDefault (76.9230 );
400+ GetParam (kDiffusionDecay2 )->SetDefault (76.9230 );
401+
402+ SetParameterValue (kDiffusionDecay1 , scale<double >(GetParam (kDiffusionDecay1 )->Value (), 0 , 100 , .230769 , .7692307 ));
403+ GetParam (kDiffusionDecay2 )->Set (scale<double >(GetParam (kDiffusionDecay2 )->Value (), 0 , 100 , 23.0769 , 76.92307 ));
404+
405+ if (initalizedInterface)
406+ {
407+ Knobs[13 ]->StartAngle = -135 .f ;
408+ Knobs[13 ]->EndAngle = 135 .f ;
409+ }
410+ }
411+ else {
412+ GetParam (kDiffusionDecay1 )->SetDefault (100 );
413+ GetParam (kDiffusionDecay2 )->SetDefault (100 );
414+
415+ SetParameterValue (kDiffusionDecay1 , clip<double >(scale<double >(GetParam (kDiffusionDecay1 )->Value (), 23.0769 , 76.92307 , 0 , 1 ),0 ,100 ));
416+ GetParam (kDiffusionDecay2 )->Set (clip<double >(scale<double >(GetParam (kDiffusionDecay2 )->Value (), 23.0769 , 76.92307 , 0 , 100 ),0 ,100 ));
417+
418+ SetParameterValue (kClear , 1 );
419+
420+ if (initalizedInterface)
421+ {
422+ Knobs[13 ]->StartAngle = -72 .6923f ;
423+ Knobs[13 ]->EndAngle = 72 .6923f ;
424+ }
425+ }
426+ if (initalizedInterface) {
427+ Knobs[13 ]->SetValue ((tank2Selected ? GetParam (kDiffusionDecay2 )->Value () : GetParam (kDiffusionDecay1 )->Value ()) / 100 );
428+ Knobs[13 ]->SetDirty (false );
429+ }
430+ break ;
340431 }
341432}
342433
0 commit comments