23#include <wx/checkbox.h>
26#include <wx/weakref.h>
31#include "../widgets/valnum.h"
49{
XO(
"Bass and Treble") };
120 const float*
const* inBlock,
float*
const* outBlock,
size_t blockLen)
override;
125 unsigned numChannels,
float sampleRate)
override;
130 const float*
const* inbuf,
float*
const* outbuf,
size_t numSamples)
140 const float*
const* inBlock,
141 float*
const* outBlock,
144 static void Coefficients(
double hz,
double slope,
double gain,
double samplerate,
int type,
145 double& a0,
double& a1,
double& a2,
double& b0,
double& b1,
double& b2);
150 std::vector<EffectBassTreble::Instance>
mSlaves;
154std::shared_ptr<EffectInstance>
157 return std::make_shared<Instance>(*
this);
179 return XO(
"Simple tone control effect");
184 return L
"Bass_and_Treble";
218 const float*
const* inBlock,
float*
const* outBlock,
size_t blockLen)
220 return InstanceProcess(
settings,
mState, inBlock, outBlock, blockLen);
232 unsigned numChannels,
float sampleRate)
238 mSlaves.push_back(slave);
251 const float *
const *inbuf,
float *
const *outbuf,
size_t numSamples)
253 if (group >= mSlaves.size())
255 return InstanceProcess(
settings, mSlaves[group].
mState, inbuf, outbuf, numSamples);
262 return (ms.mBass == 0.0 && ms.mTreble == 0.0 && ms.mGain == 0.0);
275 auto result = std::make_unique<Editor>(*
this, access, myEffSettings);
276 result->PopulateOrExchange(
S);
282 mUIParent =
S.GetParent();
283 auto& ms = mSettings;
288 S.StartStatic(
XO(
"Tone controls"));
290 S.StartMultiColumn(3, wxEXPAND);
296 .Name(
XO(
"Bass (dB):"))
297 .Validator<FloatingPointValidator<double>>(
299 .AddTextBox(
XXO(
"Ba&ss (dB):"), L
"", 10);
304 .Style(wxSL_HORIZONTAL)
310 .Validator<FloatingPointValidator<double>>(
312 .AddTextBox(
XXO(
"&Treble (dB):"), L
"", 10);
317 .Style(wxSL_HORIZONTAL)
325 S.StartStatic(
XO(
"Output"));
327 S.StartMultiColumn(3, wxEXPAND);
333 .Validator<FloatingPointValidator<double>>(
335 .AddTextBox(
XXO(
"&Volume (dB):"), L
"", 10);
340 .Style(wxSL_HORIZONTAL)
346 S.StartMultiColumn(2, wxCENTER);
351 .AddCheckBox(
XXO(
"&Link Volume control to Tone controls"),
363 const auto&
settings = mAccess.Get();
367 if (! mUIParent->TransferDataToWindow())
372 mBassS-> SetValue((
int)(mSettings.mBass *
Bass.
scale));
373 mTrebleS-> SetValue((
int)(mSettings.mTreble *
Treble.
scale));
374 mGainS-> SetValue((
int)(mSettings.mGain *
Gain.
scale));
375 mLinkCheckBox->SetValue(mSettings.mLink);
425 const float *
const *inBlock,
float *
const *outBlock,
size_t blockLen)
429 const float *ibuf = inBlock[0];
430 float *obuf = outBlock[0];
439 if (data.
bass != oldBass)
445 if (data.
treble != oldTreble)
450 for (
decltype(blockLen) i = 0; i < blockLen; i++) {
451 obuf[i] = DoFilter(data, ibuf[i]) * data.
gain;
463 double& a0,
double& a1,
double& a2,
464 double& b0,
double& b1,
double& b2)
466 double w = 2 *
M_PI * hz / samplerate;
467 double a = exp(log(10.0) * gain / 40);
468 double b = sqrt((a * a + 1) / slope - (pow((a - 1), 2)));
472 b0 = a * ((a + 1) - (a - 1) * cos(w) + b * sin(w));
473 b1 = 2 * a * ((a - 1) - (a + 1) * cos(w));
474 b2 = a * ((a + 1) - (a - 1) * cos(w) - b * sin(w));
475 a0 = ((a + 1) + (a - 1) * cos(w) + b * sin(w));
476 a1 = -2 * ((a - 1) + (a + 1) * cos(w));
477 a2 = (a + 1) + (a - 1) * cos(w) - b * sin(w);
481 b0 = a * ((a + 1) + (a - 1) * cos(w) + b * sin(w));
482 b1 = -2 * a * ((a - 1) + (a + 1) * cos(w));
483 b2 = a * ((a + 1) + (a - 1) * cos(w) - b * sin(w));
484 a0 = ((a + 1) - (a - 1) * cos(w) + b * sin(w));
485 a1 = 2 * ((a - 1) - (a + 1) * cos(w));
486 a2 = (a + 1) - (a - 1) * cos(w) - b * sin(w);
515 auto& ms = mSettings;
517 double oldBass = ms.mBass;
519 if (!EnableApplyFromTransferDataFromWindow())
525 UpdateGain(oldBass,
kBass);
527 mBassS->SetValue((
int) (ms.mBass *
Bass.
scale));
535 auto& ms = mSettings;
537 double oldTreble = ms.mTreble;
539 if (!EnableApplyFromTransferDataFromWindow())
545 UpdateGain(oldTreble,
kTreble);
547 mTrebleS->SetValue((
int) (ms.mTreble *
Treble.
scale));
555 auto& ms = mSettings;
557 if (!EnableApplyFromTransferDataFromWindow())
562 mGainS->SetValue((
int) (ms.mGain *
Gain.
scale));
570 auto& ms = mSettings;
572 double oldBass = ms.mBass;
573 ms.mBass = (double) evt.GetInt() /
Bass.
scale;
574 mBassT->GetValidator()->TransferToWindow();
577 UpdateGain(oldBass,
kBass);
579 EnableApplyFromValidate();
587 auto& ms = mSettings;
589 double oldTreble = ms.mTreble;
591 mTrebleT->GetValidator()->TransferToWindow();
594 UpdateGain(oldTreble,
kTreble);
596 EnableApplyFromValidate();
604 auto& ms = mSettings;
606 ms.mGain = (double) evt.GetInt() /
Gain.
scale;
607 mGainT->GetValidator()->TransferToWindow();
609 EnableApplyFromValidate();
617 auto& ms = mSettings;
619 ms.mLink = mLinkCheckBox->GetValue();
627 auto& ms = mSettings;
630 oldVal = (oldVal > 0)? oldVal / 2.0 : oldVal / 4.0;
632 if (control ==
kBass)
633 newVal = (ms.mBass > 0)? ms.mBass / 2.0 : ms.mBass / 4.0;
635 newVal = (ms.mTreble > 0)? ms.mTreble / 2.0 : ms.mTreble / 4.0;
637 ms.mGain -= newVal - oldVal;
640 mGainS->SetValue(ms.mGain);
641 mGainT->GetValidator()->TransferToWindow();
651 if (! mUIParent->Validate() || !mUIParent->TransferDataFromWindow())
657 mAccess.ModifySettings
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)
const EffectParameterMethods & Parameters() const override
static constexpr EffectParameter Treble
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.
std::shared_ptr< EffectInstance > MakeInstance() const override
Make an object maintaining short-term state of an Effect.
static constexpr EffectParameter Gain
bool CheckWhetherSkipEffect(const EffectSettings &settings) const override
After Init(), tell whether Process() should be skipped.
RealtimeSince RealtimeSupport() const override
Since which version of Audacity has the effect supported realtime?
static constexpr EffectParameter Bass
ManualPageID ManualPage() const override
Name of a page in the Audacity alpha manual, default is empty.
ComponentInterfaceSymbol GetSymbol() const override
virtual ~EffectBassTreble()
TranslatableString GetDescription() const override
static const ComponentInterfaceSymbol Symbol
EffectType GetType() const override
Type determines how it behaves.
static constexpr EffectParameter Link
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.
virtual const EffectSettings & Get()=0
static EffectBassTrebleSettings & 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< EffectBassTreble > reg
EffectBassTrebleSettings mSettings
void OnTrebleText(wxCommandEvent &evt)
Editor(const EffectUIServices &services, EffectSettingsAccess &access, const EffectBassTrebleSettings &settings)
void PopulateOrExchange(ShuttleGui &S)
void OnLinkCheckbox(wxCommandEvent &evt)
wxWeakRef< wxWindow > mUIParent
void OnGainText(wxCommandEvent &evt)
void OnBassSlider(wxCommandEvent &evt)
wxCheckBox * mLinkCheckBox
bool EnableApplyFromTransferDataFromWindow()
void UpdateGain(double oldVal, int control)
void OnBassText(wxCommandEvent &evt)
bool ValidateUI() override
Get settings data from the panel; may make error dialogs and return false.
void OnTrebleSlider(wxCommandEvent &evt)
bool UpdateUI() override
Update appearance of the panel for changes in settings.
void OnGainSlider(wxCommandEvent &evt)
void EnableApplyFromValidate()
virtual ~Editor()=default
size_t ProcessBlock(EffectSettings &settings, const float *const *inBlock, float *const *outBlock, size_t blockLen) override
Called for destructive effect computation.
static float DoFilter(EffectBassTrebleState &data, float in)
bool ProcessInitialize(EffectSettings &settings, double sampleRate, ChannelNames chanMap) override
bool RealtimeAddProcessor(EffectSettings &settings, EffectOutputs *pOutputs, unsigned numChannels, float sampleRate) override
static void InstanceInit(EffectSettings &settings, EffectBassTrebleState &data, float sampleRate)
bool RealtimeInitialize(EffectSettings &settings, double) override
static size_t InstanceProcess(EffectSettings &settings, EffectBassTrebleState &data, const float *const *inBlock, float *const *outBlock, size_t blockLen)
unsigned GetAudioOutCount() const override
How many output buffers to allocate at once.
EffectBassTrebleState mState
size_t RealtimeProcess(size_t group, EffectSettings &settings, const float *const *inbuf, float *const *outbuf, size_t numSamples) override
static void Coefficients(double hz, double slope, double gain, double samplerate, int type, double &a0, double &a1, double &a2, double &b0, double &b1, double &b2)
bool RealtimeFinalize(EffectSettings &settings) noexcept override
Instance(const PerTrackEffect &effect)
unsigned GetAudioInCount() const override
How many input buffers to allocate at once.
std::vector< EffectBassTreble::Instance > mSlaves
const Type scale
Scaling factor, for slider control.
const Type def
Default value.
const Type min
Minimum value.
const Type max
Maximum value.
Message sent by EffectEditor when a setting is changed by the user.
Externalized state of a plug-in.