Audacity  2.2.2
Wahwah.cpp
Go to the documentation of this file.
1 /**********************************************************************
2 
3  Audacity: A Digital Audio Editor
4 
5  Wahwah.cpp
6 
7  Effect programming:
8  Nasca Octavian Paul (Paul Nasca)
9 
10  UI programming:
11  Dominic Mazzoni (with the help of wxDesigner)
12  Vaughan Johnson (Preview)
13 
14 *******************************************************************//*******************************************************************/
20 
21 #include "../Audacity.h"
22 #include "Wahwah.h"
23 
24 #include <math.h>
25 
26 #include <wx/intl.h>
27 
28 #include "../ShuttleGui.h"
29 #include "../widgets/valnum.h"
30 
31 #include "../Experimental.h"
32 
33 enum
34 {
35  ID_Freq = 10000,
41 };
42 
43 // Define keys, defaults, minimums, and maximums for the effect parameters
44 //
45 // Name Type Key Def Min Max Scale
46 Param( Freq, double, wxT("Freq"), 1.5, 0.1, 4.0, 10 );
47 Param( Phase, double, wxT("Phase"), 0.0, 0.0, 360.0, 1 );
48 Param( Depth, int, wxT("Depth"), 70, 0, 100, 1 ); // scaled to 0-1 before processing
49 Param( Res, double, wxT("Resonance"), 2.5, 0.1, 10.0, 10 );
50 Param( FreqOfs, int, wxT("Offset"), 30, 0, 100, 1 ); // scaled to 0-1 before processing
51 Param( OutGain, double, wxT("Gain"), -6.0, -30.0, 30.0, 1 );
52 
53 // How many samples are processed before recomputing the lfo value again
54 #define lfoskipsamples 30
55 
56 //
57 // EffectWahwah
58 //
59 
60 BEGIN_EVENT_TABLE(EffectWahwah, wxEvtHandler)
61  EVT_SLIDER(ID_Freq, EffectWahwah::OnFreqSlider)
62  EVT_SLIDER(ID_Phase, EffectWahwah::OnPhaseSlider)
63  EVT_SLIDER(ID_Depth, EffectWahwah::OnDepthSlider)
64  EVT_SLIDER(ID_Res, EffectWahwah::OnResonanceSlider)
65  EVT_SLIDER(ID_FreqOfs, EffectWahwah::OnFreqOffSlider)
66  EVT_SLIDER(ID_OutGain, EffectWahwah::OnGainSlider)
67  EVT_TEXT(ID_Freq, EffectWahwah::OnFreqText)
68  EVT_TEXT(ID_Phase, EffectWahwah::OnPhaseText)
69  EVT_TEXT(ID_Depth, EffectWahwah::OnDepthText)
70  EVT_TEXT(ID_Res, EffectWahwah::OnResonanceText)
71  EVT_TEXT(ID_FreqOfs, EffectWahwah::OnFreqOffText)
72  EVT_TEXT(ID_OutGain, EffectWahwah::OnGainText)
74 
76 {
77  mFreq = DEF_Freq;
78  mPhase = DEF_Phase;
79  mDepth = DEF_Depth;
80  mRes = DEF_Res;
81  mFreqOfs = DEF_FreqOfs;
82  mOutGain = DEF_OutGain;
83 
84  SetLinearEffectFlag(true);
85 }
86 
88 {
89 }
90 
91 // IdentInterface implementation
92 
94 {
95  return WAHWAH_PLUGIN_SYMBOL;
96 }
97 
99 {
100  return _("Rapid tone quality variations, like that guitar sound so popular in the 1970's");
101 }
102 
104 {
105  return wxT("Wahwah");
106 }
107 
108 // EffectIdentInterface implementation
109 
111 {
112  return EffectTypeProcess;
113 }
114 
116 {
117 #if defined(EXPERIMENTAL_REALTIME_AUDACITY_EFFECTS)
118  return true;
119 #else
120  return false;
121 #endif
122 }
123 
124 // EffectClientInterface implementation
125 
127 {
128  return 1;
129 }
130 
132 {
133  return 1;
134 }
135 
136 bool EffectWahwah::ProcessInitialize(sampleCount WXUNUSED(totalLen), ChannelNames chanMap)
137 {
139 
140  if (chanMap[0] == ChannelNameFrontRight)
141  {
142  mMaster.phase += M_PI;
143  }
144 
145  return true;
146 }
147 
148 size_t EffectWahwah::ProcessBlock(float **inBlock, float **outBlock, size_t blockLen)
149 {
150  return InstanceProcess(mMaster, inBlock, outBlock, blockLen);
151 }
152 
154 {
155  SetBlockSize(512);
156 
157  mSlaves.clear();
158 
159  return true;
160 }
161 
162 bool EffectWahwah::RealtimeAddProcessor(unsigned WXUNUSED(numChannels), float sampleRate)
163 {
164  EffectWahwahState slave;
165 
166  InstanceInit(slave, sampleRate);
167 
168  mSlaves.push_back(slave);
169 
170  return true;
171 }
172 
174 {
175  mSlaves.clear();
176 
177  return true;
178 }
179 
181  float **inbuf,
182  float **outbuf,
183  size_t numSamples)
184 {
185 
186  return InstanceProcess(mSlaves[group], inbuf, outbuf, numSamples);
187 }
188 
189 bool EffectWahwah::GetAutomationParameters(EffectAutomationParameters & parms)
190 {
191  parms.Write(KEY_Freq, mFreq);
192  parms.Write(KEY_Phase, mPhase);
193  parms.Write(KEY_Depth, mDepth);
194  parms.Write(KEY_Res, mRes);
195  parms.Write(KEY_FreqOfs, mFreqOfs);
196  parms.Write(KEY_OutGain, mOutGain);
197 
198  return true;
199 }
200 
201 bool EffectWahwah::SetAutomationParameters(EffectAutomationParameters & parms)
202 {
203  ReadAndVerifyDouble(Freq);
204  ReadAndVerifyDouble(Phase);
205  ReadAndVerifyInt(Depth);
206  ReadAndVerifyDouble(Res);
207  ReadAndVerifyInt(FreqOfs);
208  ReadAndVerifyDouble(OutGain);
209 
210  mFreq = Freq;
211  mPhase = Phase;
212  mDepth = Depth;
213  mRes = Res;
214  mFreqOfs = FreqOfs;
215  mOutGain = OutGain;
216 
217  return true;
218 }
219 
220 // Effect implementation
221 
223 {
224  S.SetBorder(5);
225  S.AddSpace(0, 5);
226 
227  S.StartMultiColumn(3, wxEXPAND);
228  {
229  S.SetStretchyCol(2);
230 
231  FloatingPointValidator<double> vldfreq(5, &mFreq, NumValidatorStyle::ONE_TRAILING_ZERO);
232  vldfreq.SetRange(MIN_Freq, MAX_Freq);
233  mFreqT = S.Id(ID_Freq).AddTextBox(_("LFO Freq&uency (Hz):"), wxT(""), 12);
234  mFreqT->SetValidator(vldfreq);
235 
236  S.SetStyle(wxSL_HORIZONTAL);
237  mFreqS = S.Id(ID_Freq).AddSlider( {}, DEF_Freq * SCL_Freq, MAX_Freq * SCL_Freq, MIN_Freq * SCL_Freq);
238  mFreqS->SetName(_("LFO frequency in hertz"));
239  mFreqS->SetMinSize(wxSize(100, -1));
240 
241  FloatingPointValidator<double> vldphase(1, &mPhase);
242  vldphase.SetRange(MIN_Phase, MAX_Phase);
243  mPhaseT = S.Id(ID_Phase).AddTextBox(_("LFO Sta&rt Phase (deg.):"), wxT(""), 12);
244  mPhaseT->SetValidator(vldphase);
245 
246  S.SetStyle(wxSL_HORIZONTAL);
247  mPhaseS = S.Id(ID_Phase).AddSlider( {}, DEF_Phase * SCL_Phase, MAX_Phase * SCL_Phase, MIN_Phase * SCL_Phase);
248  mPhaseS->SetName(_("LFO start phase in degrees"));
249  mPhaseS->SetLineSize(10);
250  mPhaseS->SetMinSize(wxSize(100, -1));
251 
252  IntegerValidator<int> vlddepth(&mDepth);
253  vlddepth.SetRange(MIN_Depth, MAX_Depth);
254  mDepthT = S.Id(ID_Depth).AddTextBox(_("Dept&h (%):"), wxT(""), 12);
255  mDepthT->SetValidator(vlddepth);
256 
257  S.SetStyle(wxSL_HORIZONTAL);
258  mDepthS = S.Id(ID_Depth).AddSlider( {}, DEF_Depth * SCL_Depth, MAX_Depth * SCL_Depth, MIN_Depth * SCL_Depth);
259  mDepthS->SetName(_("Depth in percent"));
260  mDepthS->SetMinSize(wxSize(100, -1));
261 
262  FloatingPointValidator<double> vldres(1, &mRes);
263  vldres.SetRange(MIN_Res, MAX_Res);
264  mResT = S.Id(ID_Res).AddTextBox(_("Reso&nance:"), wxT(""), 12);
265  mResT->SetValidator(vldres);
266 
267  S.SetStyle(wxSL_HORIZONTAL);
268  mResS = S.Id(ID_Res).AddSlider( {}, DEF_Res * SCL_Res, MAX_Res * SCL_Res, MIN_Res * SCL_Res);
269  mResS->SetName(_("Resonance"));
270  mResS->SetMinSize(wxSize(100, -1));
271 
272  IntegerValidator<int> vldfreqoffset(&mFreqOfs);
273  vldfreqoffset.SetRange(MIN_FreqOfs, MAX_FreqOfs);
274  mFreqOfsT = S.Id(ID_FreqOfs).AddTextBox(_("Wah Frequency Offse&t (%):"), wxT(""), 12);
275  mFreqOfsT->SetValidator(vldfreqoffset);
276 
277  S.SetStyle(wxSL_HORIZONTAL);
278  mFreqOfsS = S.Id(ID_FreqOfs).AddSlider( {}, DEF_FreqOfs * SCL_FreqOfs, MAX_FreqOfs * SCL_FreqOfs, MIN_FreqOfs * SCL_FreqOfs);
279  mFreqOfsT->SetName(_("Wah frequency offset in percent"));
280  mFreqOfsT->SetMinSize(wxSize(100, -1));
281 
282  FloatingPointValidator<double> vldoutgain(1, &mOutGain);
283  vldoutgain.SetRange(MIN_OutGain, MAX_OutGain);
284  mOutGainT = S.Id(ID_OutGain).AddTextBox(_("&Output gain (dB):"), wxT(""), 12);
285  mOutGainT->SetValidator(vldoutgain);
286 
287  S.SetStyle(wxSL_HORIZONTAL);
288  mOutGainS = S.Id(ID_OutGain).AddSlider( {}, DEF_OutGain * SCL_OutGain, MAX_OutGain * SCL_OutGain, MIN_OutGain * SCL_OutGain);
289  mOutGainS->SetName(_("Output gain (dB)"));
290  mOutGainS->SetMinSize(wxSize(100, -1));
291  }
292  S.EndMultiColumn();
293 }
294 
296 {
297  if (!mUIParent->TransferDataToWindow())
298  {
299  return false;
300  }
301 
302  mFreqS->SetValue((int) (mFreq * SCL_Freq));
303  mPhaseS->SetValue((int) (mPhase * SCL_Phase));
304  mDepthS->SetValue((int) (mDepth * SCL_Depth));
305  mResS->SetValue((int) (mRes * SCL_Res));
306  mFreqOfsS->SetValue((int) (mFreqOfs * SCL_FreqOfs));
307  mOutGainS->SetValue((int) (mOutGain * SCL_OutGain));
308 
309  return true;
310 }
311 
313 {
314  if (!mUIParent->Validate() || !mUIParent->TransferDataFromWindow())
315  {
316  return false;
317  }
318 
319  return true;
320 }
321 
322 // EffectWahwah implementation
323 
324 void EffectWahwah::InstanceInit(EffectWahwahState & data, float sampleRate)
325 {
326  data.samplerate = sampleRate;
327  data.lfoskip = mFreq * 2 * M_PI / sampleRate;
328  data.skipcount = 0;
329  data.xn1 = 0;
330  data.xn2 = 0;
331  data.yn1 = 0;
332  data.yn2 = 0;
333  data.b0 = 0;
334  data.b1 = 0;
335  data.b2 = 0;
336  data.a0 = 0;
337  data.a1 = 0;
338  data.a2 = 0;
339 
340  data.depth = mDepth / 100.0;
341  data.freqofs = mFreqOfs / 100.0;
342  data.phase = mPhase * M_PI / 180.0;
343  data.outgain = DB_TO_LINEAR(mOutGain);
344 }
345 
346 size_t EffectWahwah::InstanceProcess(EffectWahwahState & data, float **inBlock, float **outBlock, size_t blockLen)
347 {
348  float *ibuf = inBlock[0];
349  float *obuf = outBlock[0];
350  double frequency, omega, sn, cs, alpha;
351  double in, out;
352 
353  data.lfoskip = mFreq * 2 * M_PI / data.samplerate;
354  data.depth = mDepth / 100.0;
355  data.freqofs = mFreqOfs / 100.0;
356 
357  data.phase = mPhase * M_PI / 180.0;
358  data.outgain = DB_TO_LINEAR(mOutGain);
359 
360  for (decltype(blockLen) i = 0; i < blockLen; i++)
361  {
362  in = (double) ibuf[i];
363 
364  if ((data.skipcount++) % lfoskipsamples == 0)
365  {
366  frequency = (1 + cos(data.skipcount * data.lfoskip + data.phase)) / 2;
367  frequency = frequency * data.depth * (1 - data.freqofs) + data.freqofs;
368  frequency = exp((frequency - 1) * 6);
369  omega = M_PI * frequency;
370  sn = sin(omega);
371  cs = cos(omega);
372  alpha = sn / (2 * mRes);
373  data.b0 = (1 - cs) / 2;
374  data.b1 = 1 - cs;
375  data.b2 = (1 - cs) / 2;
376  data.a0 = 1 + alpha;
377  data.a1 = -2 * cs;
378  data.a2 = 1 - alpha;
379  };
380  out = (data.b0 * in + data.b1 * data.xn1 + data.b2 * data.xn2 - data.a1 * data.yn1 - data.a2 * data.yn2) / data.a0;
381  data.xn2 = data.xn1;
382  data.xn1 = in;
383  data.yn2 = data.yn1;
384  data.yn1 = out;
385  out *= data.outgain;
386 
387  obuf[i] = (float) out;
388  }
389 
390  return blockLen;
391 }
392 
393 void EffectWahwah::OnFreqSlider(wxCommandEvent & evt)
394 {
395  mFreq = (double) evt.GetInt() / SCL_Freq;
396  mFreqT->GetValidator()->TransferToWindow();
397  EnableApply(mUIParent->Validate());
398 }
399 
400 void EffectWahwah::OnPhaseSlider(wxCommandEvent & evt)
401 {
402  int val = ((evt.GetInt() + 5) / 10) * 10; // round to nearest multiple of 10
403  val = val > MAX_Phase * SCL_Phase ? MAX_Phase * SCL_Phase : val;
404  mPhaseS->SetValue(val);
405  mPhase = (double) val / SCL_Phase;
406  mPhaseT->GetValidator()->TransferToWindow();
407  EnableApply(mUIParent->Validate());
408 }
409 
410 void EffectWahwah::OnDepthSlider(wxCommandEvent & evt)
411 {
412  mDepth = evt.GetInt() / SCL_Depth;
413  mDepthT->GetValidator()->TransferToWindow();
414  EnableApply(mUIParent->Validate());
415 }
416 
417 void EffectWahwah::OnResonanceSlider(wxCommandEvent & evt)
418 {
419  mRes = (double) evt.GetInt() / SCL_Res;
420  mResT->GetValidator()->TransferToWindow();
421  EnableApply(mUIParent->Validate());
422 }
423 
424 void EffectWahwah::OnFreqOffSlider(wxCommandEvent & evt)
425 {
426  mFreqOfs = evt.GetInt() / SCL_FreqOfs;
427  mFreqOfsT->GetValidator()->TransferToWindow();
428  EnableApply(mUIParent->Validate());
429 }
430 
431 void EffectWahwah::OnGainSlider(wxCommandEvent & evt)
432 {
433  mOutGain = evt.GetInt() / SCL_OutGain;
434  mOutGainT->GetValidator()->TransferToWindow();
435  EnableApply(mUIParent->Validate());
436 }
437 
438 void EffectWahwah::OnFreqText(wxCommandEvent & WXUNUSED(evt))
439 {
440  if (!EnableApply(mUIParent->TransferDataFromWindow()))
441  {
442  return;
443  }
444 
445  mFreqS->SetValue((int) (mFreq * SCL_Freq));
446 }
447 
448 void EffectWahwah::OnPhaseText(wxCommandEvent & WXUNUSED(evt))
449 {
450  if (!EnableApply(mUIParent->TransferDataFromWindow()))
451  {
452  return;
453  }
454 
455  mPhaseS->SetValue((int) (mPhase * SCL_Phase));
456 }
457 
458 void EffectWahwah::OnDepthText(wxCommandEvent & WXUNUSED(evt))
459 {
460  if (!EnableApply(mUIParent->TransferDataFromWindow()))
461  {
462  return;
463  }
464 
465  mDepthS->SetValue((int) (mDepth * SCL_Depth));
466 }
467 
468 void EffectWahwah::OnResonanceText(wxCommandEvent & WXUNUSED(evt))
469 {
470  if (!EnableApply(mUIParent->TransferDataFromWindow()))
471  {
472  return;
473  }
474 
475  mResS->SetValue((int) (mRes * SCL_Res));
476 }
477 
478 void EffectWahwah::OnFreqOffText(wxCommandEvent & WXUNUSED(evt))
479 {
480  if (!EnableApply(mUIParent->TransferDataFromWindow()))
481  {
482  return;
483  }
484 
485  mFreqOfsS->SetValue((int) (mFreqOfs * SCL_FreqOfs));
486 }
487 
488 void EffectWahwah::OnGainText(wxCommandEvent & WXUNUSED(evt))
489 {
490  if (!EnableApply(mUIParent->TransferDataFromWindow()))
491  {
492  return;
493  }
494 
495  mOutGainS->SetValue((int) (mOutGain * SCL_OutGain));
496 }
void PopulateOrExchange(ShuttleGui &S) override
Definition: Wahwah.cpp:222
void OnFreqOffSlider(wxCommandEvent &evt)
Definition: Wahwah.cpp:424
double yn1
Definition: Wahwah.h:40
Derived from ShuttleGuiBase, an Audacity specific class for shuttling data to and from GUI...
Definition: ShuttleGui.h:366
Param(Freq, double, wxT("Freq"), 1.5, 0.1, 4.0, 10)
wxTextCtrl * mResT
Definition: Wahwah.h:129
double mPhase
Definition: Wahwah.h:120
bool SetAutomationParameters(EffectAutomationParameters &parms) override
Definition: Wahwah.cpp:201
double xn2
Definition: Wahwah.h:40
size_t SetBlockSize(size_t maxBlockSize) override
Definition: Effect.cpp:357
wxTextCtrl * mFreqT
Definition: Wahwah.h:126
std::vector< EffectWahwahState > mSlaves
Definition: Wahwah.h:105
bool RealtimeAddProcessor(unsigned numChannels, float sampleRate) override
Definition: Wahwah.cpp:162
wxTextCtrl * mOutGainT
Definition: Wahwah.h:131
bool SupportsRealtime() override
Definition: Wahwah.cpp:115
void EndMultiColumn()
unsigned GetAudioInCount() override
Definition: Wahwah.cpp:126
wxSlider * mOutGainS
Definition: Wahwah.h:138
size_t InstanceProcess(EffectWahwahState &data, float **inBlock, float **outBlock, size_t blockLen)
Definition: Wahwah.cpp:346
bool RealtimeFinalize() override
Definition: Wahwah.cpp:173
double lfoskip
Definition: Wahwah.h:38
double mSampleRate
Definition: Effect.h:458
bool RealtimeInitialize() override
Definition: Wahwah.cpp:153
size_t ProcessBlock(float **inBlock, float **outBlock, size_t blockLen) override
Definition: Wahwah.cpp:148
float samplerate
Definition: Wahwah.h:33
void OnGainSlider(wxCommandEvent &evt)
Definition: Wahwah.cpp:431
bool GetAutomationParameters(EffectAutomationParameters &parms) override
Definition: Wahwah.cpp:189
void OnResonanceSlider(wxCommandEvent &evt)
Definition: Wahwah.cpp:417
double yn2
Definition: Wahwah.h:40
wxTextCtrl * mDepthT
Definition: Wahwah.h:128
wxTextCtrl * AddTextBox(const wxString &Caption, const wxString &Value, const int nChars)
Definition: ShuttleGui.cpp:493
#define ReadAndVerifyInt(name)
Definition: Effect.h:790
wxString GetSymbol() override
Definition: Wahwah.cpp:93
wxSlider * mFreqS
Definition: Wahwah.h:133
wxSlider * mDepthS
Definition: Wahwah.h:135
wxSlider * mPhaseS
Definition: Wahwah.h:134
double xn1
Definition: Wahwah.h:40
void StartMultiColumn(int nCols, int PositionFlags=wxALIGN_LEFT)
Definition: ShuttleGui.cpp:998
double freqofs
Definition: Wahwah.h:35
ShuttleGui & Id(int id)
void SetStyle(int Style)
Definition: ShuttleGui.h:252
An Effect that adds a 'spectral glide'.
Definition: Wahwah.h:44
void OnFreqText(wxCommandEvent &evt)
Definition: Wahwah.cpp:438
#define ReadAndVerifyDouble(name)
Definition: Effect.h:791
wxString GetDescription() override
Definition: Wahwah.cpp:98
double mRes
Definition: Wahwah.h:122
void OnDepthSlider(wxCommandEvent &evt)
Definition: Wahwah.cpp:410
void InstanceInit(EffectWahwahState &data, float sampleRate)
Definition: Wahwah.cpp:324
EffectWahwahState mMaster
Definition: Wahwah.h:104
double depth
Definition: Wahwah.h:34
#define WAHWAH_PLUGIN_SYMBOL
Definition: Wahwah.h:28
wxTextCtrl * mPhaseT
Definition: Wahwah.h:127
wxString ManualPage() override
Definition: Wahwah.cpp:103
wxWindow * mUIParent
Definition: Effect.h:475
_("Move Track &Down")+wxT("\t")+(GetActiveProject() -> GetCommandManager() ->GetKeyFromName(wxT("TrackMoveDown"))), OnMoveTrack) POPUP_MENU_ITEM(OnMoveTopID, _("Move Track to &Top")+wxT("\t")+(GetActiveProject() ->GetCommandManager() ->GetKeyFromName(wxT("TrackMoveTop"))), OnMoveTrack) POPUP_MENU_ITEM(OnMoveBottomID, _("Move Track to &Bottom")+wxT("\t")+(GetActiveProject() ->GetCommandManager() ->GetKeyFromName(wxT("TrackMoveBottom"))), OnMoveTrack) void TrackMenuTable::OnSetName(wxCommandEvent &)
EffectType GetType() override
Definition: Wahwah.cpp:110
void OnGainText(wxCommandEvent &evt)
Definition: Wahwah.cpp:488
wxSlider * mFreqOfsS
Definition: Wahwah.h:137
#define M_PI
Definition: Distortion.cpp:28
void OnDepthText(wxCommandEvent &evt)
Definition: Wahwah.cpp:458
unsigned long skipcount
Definition: Wahwah.h:39
void OnFreqSlider(wxCommandEvent &evt)
Definition: Wahwah.cpp:393
wxTextCtrl * mFreqOfsT
Definition: Wahwah.h:130
size_t RealtimeProcess(int group, float **inbuf, float **outbuf, size_t numSamples) override
Definition: Wahwah.cpp:180
bool ProcessInitialize(sampleCount totalLen, ChannelNames chanMap=NULL) override
Definition: Wahwah.cpp:136
double mFreq
Definition: Wahwah.h:119
void OnPhaseSlider(wxCommandEvent &evt)
Definition: Wahwah.cpp:400
bool TransferDataToWindow() override
Definition: Wahwah.cpp:295
#define lfoskipsamples
Definition: Wahwah.cpp:54
double phase
Definition: Wahwah.h:36
void OnResonanceText(wxCommandEvent &evt)
Definition: Wahwah.cpp:468
unsigned GetAudioOutCount() override
Definition: Wahwah.cpp:131
wxSizerItem * AddSpace(int width, int height)
wxSlider * mResS
Definition: Wahwah.h:136
double mOutGain
Definition: Wahwah.h:124
END_EVENT_TABLE()
virtual ~EffectWahwah()
Definition: Wahwah.cpp:87
void SetBorder(int Border)
Definition: ShuttleGui.h:251
const double MIN_Threshold_Linear DB_TO_LINEAR(MIN_Threshold_dB)
bool TransferDataFromWindow() override
Definition: Wahwah.cpp:312
int mDepth
Definition: Wahwah.h:121
double outgain
Definition: Wahwah.h:37
int mFreqOfs
Definition: Wahwah.h:123
void SetStretchyCol(int i)
Used to modify an already placed FlexGridSizer to make a column stretchy.
Definition: ShuttleGui.cpp:192
virtual bool EnableApply(bool enable=true)
Definition: Effect.cpp:1889
void OnPhaseText(wxCommandEvent &evt)
Definition: Wahwah.cpp:448
void OnFreqOffText(wxCommandEvent &evt)
Definition: Wahwah.cpp:478
wxSlider * AddSlider(const wxString &Prompt, int pos, int Max, int Min=0)
Definition: ShuttleGui.cpp:456