44#include <wx/dcclient.h>
45#include <wx/dcmemory.h>
46#include <wx/settings.h>
48#include <wx/stattext.h>
60#include "../widgets/valnum.h"
62#include "../widgets/RulerPanel.h"
63#include "../widgets/IntFormat.h"
64#include "../widgets/LinearDBFormat.h"
68#define PI = 3.1415926535897932384626433832795
72#define square(a) ((a)*(a))
90 {
XO(
"Butterworth") },
92 {
XO(
"Chebyshev Type I") },
94 {
XO(
"Chebyshev Type II") }
112 e.mOrderIndex = e.mOrder - 1;
126{
XO(
"Classic Filters") };
128#ifdef EXPERIMENTAL_SCIENCE_FILTERS
148 Parameters().Reset(*
this);
149 SetLinearEffectFlag(
true);
151 mOrderIndex = mOrder - 1;
157 mNyquist = 44100.0 / 2.0;
174 return XO(
"Performs IIR filtering that emulates analog filters");
179 return L
"Classic_Filters";
203 for (
int iPair = 0; iPair < (
mOrder + 1) / 2; iPair++)
209 const float *
const *inBlock,
float *
const *outBlock,
size_t blockLen)
211 const float *ibuf = inBlock[0];
212 for (
int iPair = 0; iPair < (
mOrder + 1) / 2; iPair++)
214 mpBiquad[iPair].Process(ibuf, outBlock[0], blockLen);
231 auto t = *trackRange.begin();
239 for (
auto t : trackRange) {
243 if (t->GetRate() != rate) {
246"To apply a filter, all selected tracks must have the same sample rate.") );
262 S.SetSizerProportion(1);
263 S.StartMultiColumn(3, wxEXPAND);
272 S.StartVerticalLay();
275 S.GetParent(), wxID_ANY, wxVERTICAL,
287 .Position(wxALIGN_RIGHT | wxTOP)
294 S.GetParent(), wxID_ANY,
300 .Position(wxEXPAND | wxRIGHT)
301 .MinSize( { -1, -1 } )
304 S.StartVerticalLay();
306 S.AddVariableText(
XO(
"+ dB"),
false, wxCENTER);
309 .Style(wxSL_VERTICAL | wxSL_INVERSE)
310 .AddSlider( {}, 10, 20, 0);
311#if wxUSE_ACCESSIBILITY
316 .Style(wxSL_VERTICAL | wxSL_INVERSE)
317 .AddSlider( {}, -10, -10, -120);
318#if wxUSE_ACCESSIBILITY
322 S.AddVariableText(
XO(
"- dB"),
false, wxCENTER);
333 S.GetParent(), wxID_ANY, wxHORIZONTAL,
345 .Position(wxEXPAND | wxALIGN_LEFT | wxRIGHT)
355 S.SetSizerProportion(0);
356 S.StartMultiColumn(8, wxALIGN_CENTER);
363 .MinSize( { -1, -1 } )
364 .AddChoice(
XXO(
"&Filter Type:"),
370 .MinSize( { -1, -1 } )
372 .AddChoice(
XXO(
"O&rder:"),
375 for (
int i = 1; i <= 10; i++)
383 false, wxALL | wxALIGN_RIGHT | wxALIGN_CENTER_VERTICAL);
385 .Name(
XO(
"Passband Ripple (dB)"))
386 .Validator<FloatingPointValidator<float>>(
387 1, &
mRipple, NumValidatorStyle::DEFAULT,
389 .AddTextBox( {}, L
"", 10);
391 false, wxALL | wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL);
395 .MinSize( { -1, -1 } )
396 .AddChoice(
XXO(
"&Subtype:"),
401 .Name(
XO(
"Cutoff (Hz)"))
402 .
Validator<FloatingPointValidator<float>>(
403 1, &
mCutoff, NumValidatorStyle::DEFAULT,
405 .AddTextBox(
XXO(
"C&utoff:"), L
"", 10);
406 S.AddUnits(
XO(
"Hz"));
409 S.AddVariableText(
XO(
"Minimum S&topband Attenuation:"),
410 false, wxALL | wxALIGN_RIGHT | wxALIGN_CENTER_VERTICAL);
412 .Name(
XO(
"Minimum S&topband Attenuation (dB)"))
413 .
Validator<FloatingPointValidator<float>>(
416 .AddTextBox( {}, L
"", 10);
418 S.AddVariableText(
XO(
"dB"),
419 false, wxALL | wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL);
481 tip.Printf(
_(
"%d dB"), (
int)
mdBMin);
489 tip.Printf(
_(
"%d dB"),(
int)
mdBMax);
538 float FreqWarped = tan (
PI * Freq/(2*
mNyquist));
542 float fOverflowThresh = pow (10.0, 12.0 / (2*
mOrder));
552 if (FreqWarped/CutoffWarped > fOverflowThresh)
555 Magn =
sqrt (1 / (1 + pow (FreqWarped/CutoffWarped, 2*
mOrder)));
558 if (FreqWarped/CutoffWarped > fOverflowThresh)
561 Magn =
sqrt (pow (FreqWarped/CutoffWarped, 2*
mOrder) / (1 + pow (FreqWarped/CutoffWarped, 2*
mOrder)));
567 double eps; eps =
sqrt(pow (10.0, wxMax(0.001,
mRipple)/10.0) - 1);
713 wxWindow *parent, wxWindowID winid,
715:
wxPanelWrapper(parent, winid, wxDefaultPosition, wxSize(400, 200))
728 SetFreqRange(lo, hi);
768 GetSize(&width, &height);
777 wxBrush bkgndBrush(wxSystemSettings::GetColour(wxSYS_COLOUR_3DFACE));
787 memDC.SetBrush(bkgndBrush);
788 memDC.SetPen(*wxTRANSPARENT_PEN);
789 memDC.DrawRectangle(bkgndRect);
792 memDC.DrawRectangle(bkgndRect);
800 memDC.SetBrush(*wxWHITE_BRUSH);
801 memDC.SetPen(*wxBLACK_PEN);
802 memDC.DrawRectangle(border);
808 memDC.SetPen(wxPen(
theTheme.
Colour(clrGraphLines), 1, wxPENSTYLE_SOLID));
816 memDC.SetPen(wxPen(
theTheme.
Colour(clrResponseLines), 3, wxPENSTYLE_SOLID));
821 double step = log10(
mHiFreq) - loLog;
822 step /= ((double)
mEnvRect.width - 1.0);
824 int x, y, xlast = 0, ylast = 0;
825 for (
int i = 0; i <
mEnvRect.width; i++)
828 freq = pow(10.0, loLog + i * step);
837 yF = center-scale * yF;
840 yF = (double)
mEnvRect.height - 1.0;
846 y = (int) (yF + 0.5);
856 memDC.SetPen(*wxBLACK_PEN);
862 memDC.SelectObject(wxNullBitmap);
XXO("&Cut/Copy/Paste Toolbar")
TranslatableStrings Msgids(const EnumValueSymbol strings[], size_t nStrings)
Convenience function often useful when adding choice controls.
TranslatableString Verbatim(wxString str)
Require calls to the one-argument constructor to go through this distinct global function name.
std::vector< TranslatableString > TranslatableStrings
static void Line(wxDC &dc, wxCoord x1, wxCoord y1, wxCoord x2, wxCoord y2)
Generates EffectParameterMethods overrides from variadic template arguments.
ComponentInterfaceSymbol pairs a persistent string identifier used internally with an optional,...
const TrackList * inputTracks() const
static bool EnableApply(wxWindow *parent, bool enable=true)
Enable or disable the Apply button of the dialog that contains parent.
Performs effect computation.
Hold values to send to effect output meters.
Interface for manipulations of an Effect's settings.
An Effect that applies 'classical' IIR filters.
void OnFilterSubtype(wxCommandEvent &evt)
EffectScienFilterPanel * mPanel
TranslatableString GetDescription() const override
void OnSliderDBMAX(wxCommandEvent &evt)
static const EnumValueSymbol kSubTypeStrings[nSubTypes]
wxStaticText * mRippleCtlU
void OnStopbandRipple(wxCommandEvent &evt)
friend class EffectScienFilterPanel
bool ProcessInitialize(EffectSettings &settings, double sampleRate, ChannelNames chanMap) override
void OnCutoff(wxCommandEvent &evt)
static const EnumValueSymbol kTypeStrings[nTypes]
ArrayOf< Biquad > mpBiquad
void EnableDisableRippleCtl(int FilterType)
wxChoice * mFilterSubTypeCtl
virtual ~EffectScienFilter()
static constexpr EffectParameter Stopband
unsigned GetAudioOutCount() const override
How many output buffers to allocate at once.
static constexpr EffectParameter Cutoff
size_t ProcessBlock(EffectSettings &settings, const float *const *inBlock, float *const *outBlock, size_t blockLen) override
Called for destructive effect computation.
static constexpr EnumParameter Subtype
bool TransferDataFromWindow(EffectSettings &settings) override
wxChoice * mFilterTypeCtl
void OnFilterType(wxCommandEvent &evt)
ManualPageID ManualPage() const override
Name of a page in the Audacity alpha manual, default is empty.
wxChoice * mFilterOrderCtl
wxWeakRef< wxWindow > mUIParent
wxStaticText * mStopbandRippleCtlP
const EffectParameterMethods & Parameters() const override
std::unique_ptr< EffectEditor > PopulateOrExchange(ShuttleGui &S, EffectInstance &instance, EffectSettingsAccess &access, const EffectOutputs *pOutputs) override
Add controls to effect panel; always succeeds.
static constexpr EnumParameter Type
static constexpr EffectParameter Passband
EffectType GetType() const override
Type determines how it behaves.
static constexpr EffectParameter Order
wxTextCtrl * mStopbandRippleCtl
bool TransferGraphLimitsFromWindow()
static const ComponentInterfaceSymbol Symbol
bool TransferDataToWindow(const EffectSettings &settings) override
void OnSliderDBMIN(wxCommandEvent &evt)
void OnOrder(wxCommandEvent &evt)
void OnRipple(wxCommandEvent &evt)
wxStaticText * mRippleCtlP
float FilterMagnAtFreq(float Freq)
unsigned GetAudioInCount() const override
How many input buffers to allocate at once.
ComponentInterfaceSymbol GetSymbol() const override
wxStaticText * mStopbandRippleCtlU
void OnSize(wxSizeEvent &evt)
EffectScienFilterPanel is used with EffectScienFilter and controls a graph for EffectScienFilter.
void OnPaint(wxPaintEvent &evt)
void OnSize(wxSizeEvent &evt)
virtual ~EffectScienFilterPanel()
void SetDbRange(double min, double max)
bool AcceptsFocus() const
bool AcceptsFocusFromKeyboard() const
EffectScienFilter * mEffect
std::unique_ptr< wxBitmap > mBitmap
void SetFreqRange(double lo, double hi)
static int DoMessageBox(const EffectPlugin &plugin, const TranslatableString &message, long style=DefaultMessageBoxStyle, const TranslatableString &titleStr={})
void DrawGrid(wxDC &dc, int length, bool minor=true, bool major=true, int xOffset=0, int yOffset=0) const
void GetMaxSize(wxCoord *width, wxCoord *height)
void SetRange(double min, double max)
RulerPanel class allows you to work with a Ruler like any other wxWindow.
std::pair< double, double > Range
Derived from ShuttleGuiBase, an Audacity specific class for shuttling data to and from GUI.
wxColour & Colour(int iIndex)
auto Selected() -> TrackIterRange< TrackType >
Holds a msgid for the translation catalog; may also bind format arguments.
TranslatableString & Format(Args &&...args) &
Capture variadic format arguments (by copy) when there is no plural.
A Validator is an object which checks whether a wxVariant satisfies a certain criterion....
A Track that contains audio waveform data.
BuiltinCommandsModule::Registration< CompareAudioCommand > reg
__finl float_x4 __vecc sqrt(const float_x4 &a)
static ArrayOf< Biquad > CalcButterworthFilter(int order, double fn, double fc, int type)
static ArrayOf< Biquad > CalcChebyshevType2Filter(int order, double fn, double fc, double ripple, int type)
static double ChebyPoly(int Order, double NormFreq)
static ArrayOf< Biquad > CalcChebyshevType1Filter(int order, double fn, double fc, double ripple, int type)
const Type min
Minimum value.
const Type max
Maximum value.
Externalized state of a plug-in.
Options & LabelEdges(bool l)