29#include "../widgets/valnum.h"
30#include <wx/weakref.h>
49#define phaserlfoshape 4.0
52#define lfoskipsamples 20
141 const float*
const* inBlock,
float*
const* outBlock,
size_t blockLen)
override;
146 EffectOutputs *pOutputs,
unsigned numChannels,
float sampleRate)
override;
151 const float*
const* inbuf,
float*
const* outbuf,
size_t numSamples)
161 const float*
const* inBlock,
162 float*
const* outBlock,
165 void Coefficients(
double hz,
double slope,
double gain,
double samplerate,
int type,
166 double& a0,
double& a1,
double& a2,
double& b0,
double& b1,
double& b2);
175std::shared_ptr<EffectInstance>
178 return std::make_shared<Instance>(*
this);
201 return XO(
"Combines phase-shifted signals with the original signal");
241 const float *
const *inBlock,
float *
const *outBlock,
size_t blockLen)
243 return InstanceProcess(
settings,
mState, inBlock, outBlock, blockLen);
260 mSlaves.push_back(slave);
273 const float *
const *inbuf,
float *
const *outbuf,
size_t numSamples)
275 if (group >= mSlaves.size())
277 return InstanceProcess(
settings, mSlaves[group].
mState, inbuf, outbuf, numSamples);
288 auto result = std::make_unique<Editor>(*
this, access, myEffSettings);
289 result->PopulateOrExchange(
S);
295 mUIParent =
S.GetParent();
296 auto& ms = mSettings;
301 S.StartMultiColumn(3, wxEXPAND);
306 .Validator<IntegerValidator<int>>(
308 .AddTextBox(
XXO(
"&Stages:"), L
"", 15);
313 .Style(wxSL_HORIZONTAL)
314 .MinSize( { 100, -1 } )
316 mStagesS->SetLineSize(2);
320 .Validator<IntegerValidator<int>>(
322 .AddTextBox(
XXO(
"&Dry/Wet:"), L
"", 15);
327 .Style(wxSL_HORIZONTAL)
328 .MinSize( { 100, -1 } )
333 .Validator<FloatingPointValidator<double>>(
334 5, &ms.mFreq, NumValidatorStyle::ONE_TRAILING_ZERO,
Freq.
min,
Freq.
max)
335 .AddTextBox(
XXO(
"LFO Freq&uency (Hz):"), L
"", 15);
339 .Name(
XO(
"LFO frequency in hertz"))
340 .Style(wxSL_HORIZONTAL)
341 .MinSize( { 100, -1 } )
346 .Validator<FloatingPointValidator<double>>(
348 .AddTextBox(
XXO(
"LFO Sta&rt Phase (deg.):"), L
"", 15);
352 .Name(
XO(
"LFO start phase in degrees"))
353 .Style(wxSL_HORIZONTAL)
354 .MinSize( { 100, -1 } )
356 mPhaseS->SetLineSize(10);
360 .Validator<IntegerValidator<int>>(
362 .AddTextBox(
XXO(
"Dept&h:"), L
"", 15);
366 .Name(
XO(
"Depth in percent"))
367 .Style(wxSL_HORIZONTAL)
368 .MinSize( { 100, -1 } )
373 .Validator<IntegerValidator<int>>(
375 .AddTextBox(
XXO(
"Feedbac&k (%):"), L
"", 15);
379 .Name(
XO(
"Feedback in percent"))
380 .Style(wxSL_HORIZONTAL)
381 .MinSize( { 100, -1 } )
383 mFeedbackS->SetLineSize(10);
387 .Validator<FloatingPointValidator<double>>(
389 .AddTextBox(
XXO(
"&Output gain (dB):"), L
"", 12);
393 .Name(
XO(
"Output gain (dB)"))
394 .Style(wxSL_HORIZONTAL)
395 .MinSize( { 100, -1 } )
406 const auto&
settings = mAccess.Get();
410 if (!mUIParent->TransferDataToWindow())
415 mStagesS-> SetValue((
int) (mSettings.mStages *
Stages.
scale));
416 mDryWetS-> SetValue((
int) (mSettings.mDryWet *
DryWet.
scale));
417 mFreqS-> SetValue((
int) (mSettings.mFreq *
Freq.
scale));
418 mPhaseS-> SetValue((
int) (mSettings.mPhase *
Phase.
scale));
419 mDepthS-> SetValue((
int) (mSettings.mDepth *
Depth.
scale));
420 mFeedbackS->SetValue((
int) (mSettings.mFeedback *
Feedback.
scale));
421 mOutGainS-> SetValue((
int) (mSettings.mOutGain *
OutGain.
scale));
430 if (!mUIParent->Validate() || !mUIParent->TransferDataFromWindow())
435 auto& ms = mSettings;
440 mStagesT->GetValidator()->TransferToWindow();
443 mAccess.ModifySettings
466 for (
int j = 0; j < ms.mStages; j++)
482 const float *
const *inBlock,
float *
const *outBlock,
size_t blockLen)
486 const float *ibuf = inBlock[0];
487 float *obuf = outBlock[0];
489 for (
int j = data.
laststages; j < ms.mStages; j++)
499 for (
decltype(blockLen) i = 0; i < blockLen; i++)
503 double m = in + data.
fbout * ms.mFeedback / 101;
511 + data.
phase)) / 2.0;
517 data.
gain = 1.0 - data.
gain / 255.0 * ms.mDepth;
521 for (
int j = 0; j < ms.mStages; j++)
523 double tmp = data.
old[j];
524 data.
old[j] = data.
gain * tmp + m;
525 m = tmp - data.
gain * data.
old[j];
529 obuf[i] = (float) (data.
outgain * (m * ms.mDryWet + in * (255 - ms.mDryWet)) / 255);
537 auto& ms = mSettings;
540 mStagesT->GetValidator()->TransferToWindow();
541 EnableApplyFromValidate();
549 auto& ms = mSettings;
552 mDryWetT->GetValidator()->TransferToWindow();
553 EnableApplyFromValidate();
561 auto& ms = mSettings;
563 ms.mFreq = (double) evt.GetInt() /
Freq.
scale;
565 mFreqT->GetValidator()->TransferToWindow();
566 EnableApplyFromValidate();
574 auto& ms = mSettings;
576 int val = ((evt.GetInt() + 5) / 10) * 10;
578 mPhaseS->SetValue(val);
580 mPhaseT->GetValidator()->TransferToWindow();
581 EnableApplyFromValidate();
589 auto& ms = mSettings;
592 mDepthT->GetValidator()->TransferToWindow();
593 EnableApplyFromValidate();
601 auto& ms = mSettings;
603 int val = evt.GetInt();
604 val = ((val + (val > 0 ? 5 : -5)) / 10) * 10;
606 mFeedbackS->SetValue(val);
608 mFeedbackT->GetValidator()->TransferToWindow();
609 EnableApplyFromValidate();
617 auto& ms = mSettings;
620 mOutGainT->GetValidator()->TransferToWindow();
621 EnableApplyFromValidate();
629 auto& ms = mSettings;
631 if (!EnableApplyFromTransferDataFromWindow())
636 mStagesS->SetValue((
int) (ms.mStages *
Stages.
scale));
644 auto& ms = mSettings;
646 if (!EnableApplyFromTransferDataFromWindow())
651 mDryWetS->SetValue((
int) (ms.mDryWet *
DryWet.
scale));
659 auto& ms = mSettings;
661 if (!EnableApplyFromTransferDataFromWindow())
666 mFreqS->SetValue((
int) (ms.mFreq *
Freq.
scale));
674 auto& ms = mSettings;
676 if (!EnableApplyFromTransferDataFromWindow())
681 mPhaseS->SetValue((
int) (ms.mPhase *
Phase.
scale));
689 auto& ms = mSettings;
691 if (!EnableApplyFromTransferDataFromWindow())
696 mDepthS->SetValue((
int) (ms.mDepth *
Depth.
scale));
704 auto& ms = mSettings;
706 if (!EnableApplyFromTransferDataFromWindow())
719 auto& ms = mSettings;
721 if (!EnableApplyFromTransferDataFromWindow())
726 mOutGainS->SetValue((
int) (ms.mOutGain *
OutGain.
scale));
XXO("&Cut/Copy/Paste Toolbar")
static Settings & settings()
bool ValidateUI(const EffectPlugin &context, EffectSettings &) const override
Generates EffectParameterMethods overrides from variadic template arguments.
ComponentInterfaceSymbol pairs a persistent string identifier used internally with an optional,...
void SetLinearEffectFlag(bool linearEffectFlag)
RealtimeSince
In which versions of Audacity was an effect realtime capable?
static bool EnableApply(wxWindow *parent, bool enable=true)
Enable or disable the Apply button of the dialog that contains parent.
Performs effect computation.
Inherit to add a state variable to an EffectInstance subclass.
Hold values to send to effect output meters.
Interface for manipulations of an Effect's settings.
An Effect that changes frequencies in a time varying manner.
static constexpr EffectParameter Feedback
std::unique_ptr< EffectEditor > MakeEditor(ShuttleGui &S, EffectInstance &instance, EffectSettingsAccess &access, const EffectOutputs *pOutputs) const override
Called only from PopulateUI, to add controls to effect panel.
static constexpr EffectParameter DryWet
static constexpr EffectParameter Stages
static constexpr EffectParameter Phase
std::shared_ptr< EffectInstance > MakeInstance() const override
Make an object maintaining short-term state of an Effect.
static const ComponentInterfaceSymbol Symbol
RealtimeSince RealtimeSupport() const override
Since which version of Audacity has the effect supported realtime?
static constexpr EffectParameter Depth
static constexpr EffectParameter Freq
const EffectParameterMethods & Parameters() const override
TranslatableString GetDescription() const override
ComponentInterfaceSymbol GetSymbol() const override
EffectType GetType() const override
Type determines how it behaves.
static constexpr EffectParameter OutGain
ManualPageID ManualPage() const override
Name of a page in the Audacity alpha manual, default is empty.
virtual const EffectSettings & Get()=0
static EffectPhaserSettings & GetSettings(EffectSettings &settings)
Assume settings originated from MakeSettings() and copies thereof.
Base class for many of the effects in Audacity.
Derived from ShuttleGuiBase, an Audacity specific class for shuttling data to and from GUI.
Holds a msgid for the translation catalog; may also bind format arguments.
BuiltinEffectsModule::Registration< EffectPhaser > reg
const Type scale
Scaling factor, for slider control.
const Type def
Default value.
const Type min
Minimum value.
const Type max
Maximum value.
wxWeakRef< wxWindow > mUIParent
bool EnableApplyFromTransferDataFromWindow()
bool ValidateUI() override
Get settings data from the panel; may make error dialogs and return false.
void OnGainSlider(wxCommandEvent &evt)
bool UpdateUI() override
Update appearance of the panel for changes in settings.
void OnStagesSlider(wxCommandEvent &evt)
Editor(const EffectUIServices &services, EffectSettingsAccess &access, const EffectPhaserSettings &settings)
void OnFreqSlider(wxCommandEvent &evt)
void OnGainText(wxCommandEvent &evt)
void OnFeedbackSlider(wxCommandEvent &evt)
EffectPhaserSettings mSettings
void OnPhaseSlider(wxCommandEvent &evt)
void OnPhaseText(wxCommandEvent &evt)
void OnFeedbackText(wxCommandEvent &evt)
void OnDryWetText(wxCommandEvent &evt)
void EnableApplyFromValidate()
void OnDryWetSlider(wxCommandEvent &evt)
void OnDepthSlider(wxCommandEvent &evt)
void OnFreqText(wxCommandEvent &evt)
virtual ~Editor()=default
void OnStagesText(wxCommandEvent &evt)
void OnDepthText(wxCommandEvent &evt)
void PopulateOrExchange(ShuttleGui &S)
Instance(const PerTrackEffect &effect)
size_t RealtimeProcess(size_t group, EffectSettings &settings, const float *const *inbuf, float *const *outbuf, size_t numSamples) override
bool RealtimeInitialize(EffectSettings &settings, double) override
void InstanceInit(EffectSettings &settings, EffectPhaserState &data, float sampleRate)
bool RealtimeFinalize(EffectSettings &settings) noexcept override
std::vector< EffectPhaser::Instance > mSlaves
bool ProcessInitialize(EffectSettings &settings, double sampleRate, ChannelNames chanMap) override
float DoFilter(EffectPhaserState &data, float in)
unsigned GetAudioInCount() const override
How many input buffers to allocate at once.
size_t ProcessBlock(EffectSettings &settings, const float *const *inBlock, float *const *outBlock, size_t blockLen) override
Called for destructive effect computation.
unsigned GetAudioOutCount() const override
How many output buffers to allocate at once.
void Coefficients(double hz, double slope, double gain, double samplerate, int type, double &a0, double &a1, double &a2, double &b0, double &b1, double &b2)
size_t InstanceProcess(EffectSettings &settings, EffectPhaserState &data, const float *const *inBlock, float *const *outBlock, size_t blockLen)
bool RealtimeAddProcessor(EffectSettings &settings, EffectOutputs *pOutputs, unsigned numChannels, float sampleRate) override
Message sent by EffectEditor when a setting is changed by the user.
Externalized state of a plug-in.