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 // EffectDefinitionInterface 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 
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 
190  S.SHUTTLE_PARAM( mFreq, Freq );
191  S.SHUTTLE_PARAM( mPhase, Phase );
192  S.SHUTTLE_PARAM( mDepth, Depth );
193  S.SHUTTLE_PARAM( mRes, Res );
194  S.SHUTTLE_PARAM( mFreqOfs, FreqOfs );
195  S.SHUTTLE_PARAM( mOutGain, OutGain );
196  return true;
197 }
198 
200 {
201  parms.Write(KEY_Freq, mFreq);
202  parms.Write(KEY_Phase, mPhase);
203  parms.Write(KEY_Depth, mDepth);
204  parms.Write(KEY_Res, mRes);
205  parms.Write(KEY_FreqOfs, mFreqOfs);
206  parms.Write(KEY_OutGain, mOutGain);
207 
208  return true;
209 }
210 
212 {
213  ReadAndVerifyDouble(Freq);
214  ReadAndVerifyDouble(Phase);
215  ReadAndVerifyInt(Depth);
216  ReadAndVerifyDouble(Res);
217  ReadAndVerifyInt(FreqOfs);
218  ReadAndVerifyDouble(OutGain);
219 
220  mFreq = Freq;
221  mPhase = Phase;
222  mDepth = Depth;
223  mRes = Res;
224  mFreqOfs = FreqOfs;
225  mOutGain = OutGain;
226 
227  return true;
228 }
229 
230 // Effect implementation
231 
233 {
234  S.SetBorder(5);
235  S.AddSpace(0, 5);
236 
237  S.StartMultiColumn(3, wxEXPAND);
238  {
239  S.SetStretchyCol(2);
240 
241  FloatingPointValidator<double> vldfreq(5, &mFreq, NumValidatorStyle::ONE_TRAILING_ZERO);
242  vldfreq.SetRange(MIN_Freq, MAX_Freq);
243  mFreqT = S.Id(ID_Freq).AddTextBox(_("LFO Freq&uency (Hz):"), wxT(""), 12);
244  mFreqT->SetValidator(vldfreq);
245 
246  S.SetStyle(wxSL_HORIZONTAL);
247  mFreqS = S.Id(ID_Freq).AddSlider( {}, DEF_Freq * SCL_Freq, MAX_Freq * SCL_Freq, MIN_Freq * SCL_Freq);
248  mFreqS->SetName(_("LFO frequency in hertz"));
249  mFreqS->SetMinSize(wxSize(100, -1));
250 
251  FloatingPointValidator<double> vldphase(1, &mPhase);
252  vldphase.SetRange(MIN_Phase, MAX_Phase);
253  mPhaseT = S.Id(ID_Phase).AddTextBox(_("LFO Sta&rt Phase (deg.):"), wxT(""), 12);
254  mPhaseT->SetValidator(vldphase);
255 
256  S.SetStyle(wxSL_HORIZONTAL);
257  mPhaseS = S.Id(ID_Phase).AddSlider( {}, DEF_Phase * SCL_Phase, MAX_Phase * SCL_Phase, MIN_Phase * SCL_Phase);
258  mPhaseS->SetName(_("LFO start phase in degrees"));
259  mPhaseS->SetLineSize(10);
260  mPhaseS->SetMinSize(wxSize(100, -1));
261 
262  IntegerValidator<int> vlddepth(&mDepth);
263  vlddepth.SetRange(MIN_Depth, MAX_Depth);
264  mDepthT = S.Id(ID_Depth).AddTextBox(_("Dept&h (%):"), wxT(""), 12);
265  mDepthT->SetValidator(vlddepth);
266 
267  S.SetStyle(wxSL_HORIZONTAL);
268  mDepthS = S.Id(ID_Depth).AddSlider( {}, DEF_Depth * SCL_Depth, MAX_Depth * SCL_Depth, MIN_Depth * SCL_Depth);
269  mDepthS->SetName(_("Depth in percent"));
270  mDepthS->SetMinSize(wxSize(100, -1));
271 
272  FloatingPointValidator<double> vldres(1, &mRes);
273  vldres.SetRange(MIN_Res, MAX_Res);
274  mResT = S.Id(ID_Res).AddTextBox(_("Reso&nance:"), wxT(""), 12);
275  mResT->SetValidator(vldres);
276 
277  S.SetStyle(wxSL_HORIZONTAL);
278  mResS = S.Id(ID_Res).AddSlider( {}, DEF_Res * SCL_Res, MAX_Res * SCL_Res, MIN_Res * SCL_Res);
279  mResS->SetName(_("Resonance"));
280  mResS->SetMinSize(wxSize(100, -1));
281 
282  IntegerValidator<int> vldfreqoffset(&mFreqOfs);
283  vldfreqoffset.SetRange(MIN_FreqOfs, MAX_FreqOfs);
284  mFreqOfsT = S.Id(ID_FreqOfs).AddTextBox(_("Wah Frequency Offse&t (%):"), wxT(""), 12);
285  mFreqOfsT->SetValidator(vldfreqoffset);
286 
287  S.SetStyle(wxSL_HORIZONTAL);
288  mFreqOfsS = S.Id(ID_FreqOfs).AddSlider( {}, DEF_FreqOfs * SCL_FreqOfs, MAX_FreqOfs * SCL_FreqOfs, MIN_FreqOfs * SCL_FreqOfs);
289  mFreqOfsT->SetName(_("Wah frequency offset in percent"));
290  mFreqOfsT->SetMinSize(wxSize(100, -1));
291 
292  FloatingPointValidator<double> vldoutgain(1, &mOutGain);
293  vldoutgain.SetRange(MIN_OutGain, MAX_OutGain);
294  mOutGainT = S.Id(ID_OutGain).AddTextBox(_("&Output gain (dB):"), wxT(""), 12);
295  mOutGainT->SetValidator(vldoutgain);
296 
297  S.SetStyle(wxSL_HORIZONTAL);
298  mOutGainS = S.Id(ID_OutGain).AddSlider( {}, DEF_OutGain * SCL_OutGain, MAX_OutGain * SCL_OutGain, MIN_OutGain * SCL_OutGain);
299  mOutGainS->SetName(_("Output gain (dB)"));
300  mOutGainS->SetMinSize(wxSize(100, -1));
301  }
302  S.EndMultiColumn();
303 }
304 
306 {
307  if (!mUIParent->TransferDataToWindow())
308  {
309  return false;
310  }
311 
312  mFreqS->SetValue((int) (mFreq * SCL_Freq));
313  mPhaseS->SetValue((int) (mPhase * SCL_Phase));
314  mDepthS->SetValue((int) (mDepth * SCL_Depth));
315  mResS->SetValue((int) (mRes * SCL_Res));
316  mFreqOfsS->SetValue((int) (mFreqOfs * SCL_FreqOfs));
317  mOutGainS->SetValue((int) (mOutGain * SCL_OutGain));
318 
319  return true;
320 }
321 
323 {
324  if (!mUIParent->Validate() || !mUIParent->TransferDataFromWindow())
325  {
326  return false;
327  }
328 
329  return true;
330 }
331 
332 // EffectWahwah implementation
333 
334 void EffectWahwah::InstanceInit(EffectWahwahState & data, float sampleRate)
335 {
336  data.samplerate = sampleRate;
337  data.lfoskip = mFreq * 2 * M_PI / sampleRate;
338  data.skipcount = 0;
339  data.xn1 = 0;
340  data.xn2 = 0;
341  data.yn1 = 0;
342  data.yn2 = 0;
343  data.b0 = 0;
344  data.b1 = 0;
345  data.b2 = 0;
346  data.a0 = 0;
347  data.a1 = 0;
348  data.a2 = 0;
349 
350  data.depth = mDepth / 100.0;
351  data.freqofs = mFreqOfs / 100.0;
352  data.phase = mPhase * M_PI / 180.0;
353  data.outgain = DB_TO_LINEAR(mOutGain);
354 }
355 
356 size_t EffectWahwah::InstanceProcess(EffectWahwahState & data, float **inBlock, float **outBlock, size_t blockLen)
357 {
358  float *ibuf = inBlock[0];
359  float *obuf = outBlock[0];
360  double frequency, omega, sn, cs, alpha;
361  double in, out;
362 
363  data.lfoskip = mFreq * 2 * M_PI / data.samplerate;
364  data.depth = mDepth / 100.0;
365  data.freqofs = mFreqOfs / 100.0;
366 
367  data.phase = mPhase * M_PI / 180.0;
368  data.outgain = DB_TO_LINEAR(mOutGain);
369 
370  for (decltype(blockLen) i = 0; i < blockLen; i++)
371  {
372  in = (double) ibuf[i];
373 
374  if ((data.skipcount++) % lfoskipsamples == 0)
375  {
376  frequency = (1 + cos(data.skipcount * data.lfoskip + data.phase)) / 2;
377  frequency = frequency * data.depth * (1 - data.freqofs) + data.freqofs;
378  frequency = exp((frequency - 1) * 6);
379  omega = M_PI * frequency;
380  sn = sin(omega);
381  cs = cos(omega);
382  alpha = sn / (2 * mRes);
383  data.b0 = (1 - cs) / 2;
384  data.b1 = 1 - cs;
385  data.b2 = (1 - cs) / 2;
386  data.a0 = 1 + alpha;
387  data.a1 = -2 * cs;
388  data.a2 = 1 - alpha;
389  };
390  out = (data.b0 * in + data.b1 * data.xn1 + data.b2 * data.xn2 - data.a1 * data.yn1 - data.a2 * data.yn2) / data.a0;
391  data.xn2 = data.xn1;
392  data.xn1 = in;
393  data.yn2 = data.yn1;
394  data.yn1 = out;
395  out *= data.outgain;
396 
397  obuf[i] = (float) out;
398  }
399 
400  return blockLen;
401 }
402 
403 void EffectWahwah::OnFreqSlider(wxCommandEvent & evt)
404 {
405  mFreq = (double) evt.GetInt() / SCL_Freq;
406  mFreqT->GetValidator()->TransferToWindow();
407  EnableApply(mUIParent->Validate());
408 }
409 
410 void EffectWahwah::OnPhaseSlider(wxCommandEvent & evt)
411 {
412  int val = ((evt.GetInt() + 5) / 10) * 10; // round to nearest multiple of 10
413  val = val > MAX_Phase * SCL_Phase ? MAX_Phase * SCL_Phase : val;
414  mPhaseS->SetValue(val);
415  mPhase = (double) val / SCL_Phase;
416  mPhaseT->GetValidator()->TransferToWindow();
417  EnableApply(mUIParent->Validate());
418 }
419 
420 void EffectWahwah::OnDepthSlider(wxCommandEvent & evt)
421 {
422  mDepth = evt.GetInt() / SCL_Depth;
423  mDepthT->GetValidator()->TransferToWindow();
424  EnableApply(mUIParent->Validate());
425 }
426 
427 void EffectWahwah::OnResonanceSlider(wxCommandEvent & evt)
428 {
429  mRes = (double) evt.GetInt() / SCL_Res;
430  mResT->GetValidator()->TransferToWindow();
431  EnableApply(mUIParent->Validate());
432 }
433 
434 void EffectWahwah::OnFreqOffSlider(wxCommandEvent & evt)
435 {
436  mFreqOfs = evt.GetInt() / SCL_FreqOfs;
437  mFreqOfsT->GetValidator()->TransferToWindow();
438  EnableApply(mUIParent->Validate());
439 }
440 
441 void EffectWahwah::OnGainSlider(wxCommandEvent & evt)
442 {
443  mOutGain = evt.GetInt() / SCL_OutGain;
444  mOutGainT->GetValidator()->TransferToWindow();
445  EnableApply(mUIParent->Validate());
446 }
447 
448 void EffectWahwah::OnFreqText(wxCommandEvent & WXUNUSED(evt))
449 {
450  if (!EnableApply(mUIParent->TransferDataFromWindow()))
451  {
452  return;
453  }
454 
455  mFreqS->SetValue((int) (mFreq * SCL_Freq));
456 }
457 
458 void EffectWahwah::OnPhaseText(wxCommandEvent & WXUNUSED(evt))
459 {
460  if (!EnableApply(mUIParent->TransferDataFromWindow()))
461  {
462  return;
463  }
464 
465  mPhaseS->SetValue((int) (mPhase * SCL_Phase));
466 }
467 
468 void EffectWahwah::OnDepthText(wxCommandEvent & WXUNUSED(evt))
469 {
470  if (!EnableApply(mUIParent->TransferDataFromWindow()))
471  {
472  return;
473  }
474 
475  mDepthS->SetValue((int) (mDepth * SCL_Depth));
476 }
477 
478 void EffectWahwah::OnResonanceText(wxCommandEvent & WXUNUSED(evt))
479 {
480  if (!EnableApply(mUIParent->TransferDataFromWindow()))
481  {
482  return;
483  }
484 
485  mResS->SetValue((int) (mRes * SCL_Res));
486 }
487 
488 void EffectWahwah::OnFreqOffText(wxCommandEvent & WXUNUSED(evt))
489 {
490  if (!EnableApply(mUIParent->TransferDataFromWindow()))
491  {
492  return;
493  }
494 
495  mFreqOfsS->SetValue((int) (mFreqOfs * SCL_FreqOfs));
496 }
497 
498 void EffectWahwah::OnGainText(wxCommandEvent & WXUNUSED(evt))
499 {
500  if (!EnableApply(mUIParent->TransferDataFromWindow()))
501  {
502  return;
503  }
504 
505  mOutGainS->SetValue((int) (mOutGain * SCL_OutGain));
506 }
void PopulateOrExchange(ShuttleGui &S) override
Definition: Wahwah.cpp:232
void OnFreqOffSlider(wxCommandEvent &evt)
Definition: Wahwah.cpp:434
double yn1
Definition: Wahwah.h:40
Derived from ShuttleGuiBase, an Audacity specific class for shuttling data to and from GUI...
Definition: ShuttleGui.h:409
Param(Freq, double, wxT("Freq"), 1.5, 0.1, 4.0, 10)
wxTextCtrl * mResT
Definition: Wahwah.h:130
double mPhase
Definition: Wahwah.h:121
double xn2
Definition: Wahwah.h:40
size_t SetBlockSize(size_t maxBlockSize) override
Definition: Effect.cpp:332
wxTextCtrl * mFreqT
Definition: Wahwah.h:127
std::vector< EffectWahwahState > mSlaves
Definition: Wahwah.h:106
bool RealtimeAddProcessor(unsigned numChannels, float sampleRate) override
Definition: Wahwah.cpp:162
wxTextCtrl * mOutGainT
Definition: Wahwah.h:132
bool SupportsRealtime() override
Definition: Wahwah.cpp:115
void EndMultiColumn()
unsigned GetAudioInCount() override
Definition: Wahwah.cpp:126
wxSlider * mOutGainS
Definition: Wahwah.h:139
bool SetAutomationParameters(CommandParameters &parms) override
Definition: Wahwah.cpp:211
bool DefineParams(ShuttleParams &S) override
Definition: Wahwah.cpp:189
size_t InstanceProcess(EffectWahwahState &data, float **inBlock, float **outBlock, size_t blockLen)
Definition: Wahwah.cpp:356
Shuttle that deals with parameters. This is a base class with lots of virtual functions that do nothi...
Definition: Shuttle.h:60
bool RealtimeFinalize() override
Definition: Wahwah.cpp:173
double lfoskip
Definition: Wahwah.h:38
double mSampleRate
Definition: Effect.h:455
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:441
void OnResonanceSlider(wxCommandEvent &evt)
Definition: Wahwah.cpp:427
double yn2
Definition: Wahwah.h:40
wxTextCtrl * mDepthT
Definition: Wahwah.h:129
bool GetAutomationParameters(CommandParameters &parms) override
Definition: Wahwah.cpp:199
wxTextCtrl * AddTextBox(const wxString &Caption, const wxString &Value, const int nChars)
Definition: ShuttleGui.cpp:540
#define ReadAndVerifyInt(name)
Definition: Effect.h:797
wxSlider * mFreqS
Definition: Wahwah.h:134
wxSlider * mDepthS
Definition: Wahwah.h:136
wxSlider * mPhaseS
Definition: Wahwah.h:135
double xn1
Definition: Wahwah.h:40
void StartMultiColumn(int nCols, int PositionFlags=wxALIGN_LEFT)
CommandParameters, derived from wxFileConfig, is essentially doing the same things as the Shuttle cla...
double freqofs
Definition: Wahwah.h:35
ShuttleGui & Id(int id)
void SetStyle(int Style)
Definition: ShuttleGui.h:287
An Effect that adds a 'spectral glide'.
Definition: Wahwah.h:44
void OnFreqText(wxCommandEvent &evt)
Definition: Wahwah.cpp:448
#define ReadAndVerifyDouble(name)
Definition: Effect.h:798
wxString GetDescription() override
Definition: Wahwah.cpp:98
double mRes
Definition: Wahwah.h:123
void OnDepthSlider(wxCommandEvent &evt)
Definition: Wahwah.cpp:420
void InstanceInit(EffectWahwahState &data, float sampleRate)
Definition: Wahwah.cpp:334
EffectWahwahState mMaster
Definition: Wahwah.h:105
double depth
Definition: Wahwah.h:34
IdentInterfaceSymbol pairs a persistent string identifier used internally with an optional...
enum ChannelName * ChannelNames
#define WAHWAH_PLUGIN_SYMBOL
Definition: Wahwah.h:28
IdentInterfaceSymbol GetSymbol() override
Definition: Wahwah.cpp:93
wxTextCtrl * mPhaseT
Definition: Wahwah.h:128
wxString ManualPage() override
Definition: Wahwah.cpp:103
wxWindow * mUIParent
Definition: Effect.h:472
EffectType GetType() override
Definition: Wahwah.cpp:110
_("Move Track &Down")+wxT("\t")+(GetActiveProject() -> GetCommandManager() ->GetKeyFromName(wxT("TrackMoveDown")).Raw()), OnMoveTrack) POPUP_MENU_ITEM(OnMoveTopID, _("Move Track to &Top")+wxT("\t")+(GetActiveProject() ->GetCommandManager() ->GetKeyFromName(wxT("TrackMoveTop")).Raw()), OnMoveTrack) POPUP_MENU_ITEM(OnMoveBottomID, _("Move Track to &Bottom")+wxT("\t")+(GetActiveProject() ->GetCommandManager() ->GetKeyFromName(wxT("TrackMoveBottom")).Raw()), OnMoveTrack)#define SET_TRACK_NAME_PLUGIN_SYMBOLclass SetTrackNameCommand:public AudacityCommand
void OnGainText(wxCommandEvent &evt)
Definition: Wahwah.cpp:498
EffectType
wxSlider * mFreqOfsS
Definition: Wahwah.h:138
#define M_PI
Definition: Distortion.cpp:28
void OnDepthText(wxCommandEvent &evt)
Definition: Wahwah.cpp:468
unsigned long skipcount
Definition: Wahwah.h:39
void OnFreqSlider(wxCommandEvent &evt)
Definition: Wahwah.cpp:403
wxTextCtrl * mFreqOfsT
Definition: Wahwah.h:131
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:120
void OnPhaseSlider(wxCommandEvent &evt)
Definition: Wahwah.cpp:410
bool TransferDataToWindow() override
Definition: Wahwah.cpp:305
#define lfoskipsamples
Definition: Wahwah.cpp:54
double phase
Definition: Wahwah.h:36
void OnResonanceText(wxCommandEvent &evt)
Definition: Wahwah.cpp:478
unsigned GetAudioOutCount() override
Definition: Wahwah.cpp:131
wxSizerItem * AddSpace(int width, int height)
wxSlider * mResS
Definition: Wahwah.h:137
double mOutGain
Definition: Wahwah.h:125
END_EVENT_TABLE()
virtual ~EffectWahwah()
Definition: Wahwah.cpp:87
void SetBorder(int Border)
Definition: ShuttleGui.h:286
const double MIN_Threshold_Linear DB_TO_LINEAR(MIN_Threshold_dB)
bool TransferDataFromWindow() override
Definition: Wahwah.cpp:322
int mDepth
Definition: Wahwah.h:122
double outgain
Definition: Wahwah.h:37
int mFreqOfs
Definition: Wahwah.h:124
void SetStretchyCol(int i)
Used to modify an already placed FlexGridSizer to make a column stretchy.
Definition: ShuttleGui.cpp:203
virtual bool EnableApply(bool enable=true)
Definition: Effect.cpp:1886
void OnPhaseText(wxCommandEvent &evt)
Definition: Wahwah.cpp:458
void OnFreqOffText(wxCommandEvent &evt)
Definition: Wahwah.cpp:488
wxSlider * AddSlider(const wxString &Prompt, int pos, int Max, int Min=0)
Definition: ShuttleGui.cpp:497