268 lines
6.0 KiB
C++
268 lines
6.0 KiB
C++
/**********************************************************************
|
|
|
|
Audacity: A Digital Audio Editor
|
|
|
|
EffectScienFilter.h
|
|
|
|
Norm C
|
|
Mitch Golden
|
|
Vaughan Johnson (Preview)
|
|
|
|
***********************************************************************/
|
|
|
|
#ifndef __AUDACITY_EFFECT_SCIENFILTER__
|
|
#define __AUDACITY_EFFECT_SCIENFILTER__
|
|
|
|
#define MAX_FILTER_ORDER 10
|
|
|
|
#include <wx/button.h>
|
|
#include <wx/panel.h>
|
|
#include <wx/dialog.h>
|
|
#include <wx/dynarray.h>
|
|
#include <wx/intl.h>
|
|
#include <wx/stattext.h>
|
|
#include <wx/slider.h>
|
|
#include <wx/sizer.h>
|
|
#include <wx/string.h>
|
|
#include <wx/bitmap.h>
|
|
#include <wx/choice.h>
|
|
#include <wx/checkbox.h>
|
|
|
|
#if wxUSE_ACCESSIBILITY
|
|
#include <wx/access.h>
|
|
#endif
|
|
|
|
#include "Effect.h"
|
|
#include "../WaveTrack.h"
|
|
#include "../widgets/Ruler.h"
|
|
#include "Biquad.h"
|
|
|
|
class ScienFilterDialog;
|
|
|
|
|
|
class EffectScienFilter: public Effect {
|
|
|
|
public:
|
|
|
|
EffectScienFilter();
|
|
virtual ~EffectScienFilter();
|
|
|
|
virtual wxString GetEffectName() {
|
|
return wxString(_("Classic Filters..."));
|
|
}
|
|
|
|
virtual std::set<wxString> GetEffectCategories() {
|
|
std::set<wxString> result;
|
|
result.insert(wxT("http://lv2plug.in/ns/lv2core#EQPlugin"));
|
|
return result;
|
|
}
|
|
|
|
virtual wxString GetEffectIdentifier() {
|
|
return wxString(wxT("Classic Filters"));
|
|
}
|
|
|
|
virtual wxString GetEffectAction() {
|
|
return wxString(_("Performing Classic Filtering"));
|
|
}
|
|
|
|
virtual bool Init();
|
|
virtual bool PromptUser();
|
|
virtual bool DontPromptUser();
|
|
virtual bool TransferParameters( Shuttle & shuttle );
|
|
bool CalcFilterCoeffs (void);
|
|
|
|
virtual bool Process();
|
|
|
|
// Lowest frequency to display in response graph
|
|
enum {loFreqI=20};
|
|
|
|
private:
|
|
bool ProcessOne(int count, WaveTrack * t,
|
|
sampleCount start, sampleCount len);
|
|
|
|
void Filter(sampleCount len,
|
|
float *buffer);
|
|
void ReadPrefs();
|
|
|
|
//int mM;
|
|
|
|
float mCutoff;
|
|
int mOrder;
|
|
float mRipple;
|
|
float mStopbandRipple;
|
|
int mFilterType; // Butterworth etc.
|
|
int mFilterSubtype; // lowpass, highpass
|
|
BiquadStruct* mpBiquad[5]; // MAX_ORDER/2
|
|
|
|
double mdBMax;
|
|
double mdBMin;
|
|
bool mPrompting;
|
|
bool mEditingBatchParams;
|
|
|
|
public:
|
|
|
|
friend class ScienFilterDialog;
|
|
friend class ScienFilterPanel;
|
|
};
|
|
|
|
|
|
class ScienFilterPanel: public wxPanel
|
|
{
|
|
public:
|
|
ScienFilterPanel( double loFreq, double hiFreq,
|
|
ScienFilterDialog *parent,
|
|
wxWindowID id,
|
|
const wxPoint& pos = wxDefaultPosition,
|
|
const wxSize& size = wxDefaultSize);
|
|
~ScienFilterPanel();
|
|
|
|
#if 0
|
|
Needed only if user can draw in the graph
|
|
void OnMouseEvent(wxMouseEvent & event);
|
|
void OnCaptureLost(wxMouseCaptureLostEvent & event);
|
|
#endif
|
|
void OnPaint(wxPaintEvent & event);
|
|
void OnSize (wxSizeEvent & event);
|
|
|
|
// We don't need or want to accept focus.
|
|
bool AcceptsFocus() const { return false; }
|
|
|
|
float dBMax;
|
|
float dBMin;
|
|
|
|
private:
|
|
|
|
wxBitmap *mBitmap;
|
|
wxRect mEnvRect;
|
|
ScienFilterDialog *mParent;
|
|
int mWidth;
|
|
int mHeight;
|
|
|
|
double mLoFreq;
|
|
double mHiFreq;
|
|
|
|
DECLARE_EVENT_TABLE()
|
|
};
|
|
|
|
|
|
// WDR: class declarations
|
|
|
|
//----------------------------------------------------------------------------
|
|
// ScienFilterDialog
|
|
//----------------------------------------------------------------------------
|
|
|
|
class ScienFilterDialog: public wxDialog //, public XMLTagHandler
|
|
{
|
|
public:
|
|
// constructors and destructors
|
|
ScienFilterDialog(EffectScienFilter * effect,
|
|
double loFreq, double hiFreq,
|
|
wxWindow *parent, wxWindowID id,
|
|
const wxString &title,
|
|
const wxPoint& pos = wxDefaultPosition,
|
|
const wxSize& size = wxDefaultSize,
|
|
long style = wxDEFAULT_DIALOG_STYLE );
|
|
~ScienFilterDialog();
|
|
|
|
// WDR: method declarations for ScienFilterDialog
|
|
virtual bool Validate();
|
|
virtual bool TransferDataToWindow();
|
|
virtual bool TransferGraphLimitsFromWindow();
|
|
virtual bool CalcFilter(EffectScienFilter* effect);
|
|
float FilterMagnAtFreq (float Freq);
|
|
|
|
wxChoice* mFilterTypeCtl;
|
|
wxChoice* mFilterSubTypeCtl;
|
|
wxChoice* mFilterOrderCtl;
|
|
|
|
float Cutoff;
|
|
int Order;
|
|
float Ripple;
|
|
float StopbandRipple;
|
|
int FilterType; // Butterworth etc.
|
|
int FilterSubtype; // lowpass, highpass
|
|
|
|
float dBMin;
|
|
float dBMax;
|
|
int interp;
|
|
RulerPanel *dBRuler;
|
|
RulerPanel *freqRuler;
|
|
|
|
private:
|
|
void MakeScienFilterDialog();
|
|
void Finish(bool ok);
|
|
|
|
private:
|
|
// WDR: member variable declarations for ScienFilterDialog
|
|
|
|
enum
|
|
{
|
|
ID_FILTERPANEL = 10000,
|
|
ID_DBMAX,
|
|
ID_DBMIN,
|
|
ID_FILTER_TYPE,
|
|
ID_FILTER_SUBTYPE,
|
|
ID_FILTER_ORDER,
|
|
ID_RIPPLE,
|
|
ID_CUTOFF,
|
|
ID_STOPBAND_RIPPLE
|
|
};
|
|
|
|
private:
|
|
// WDR: handler declarations for ScienFilterDialog
|
|
void OnPaint( wxPaintEvent &event );
|
|
void OnSize( wxSizeEvent &event );
|
|
void OnErase( wxEraseEvent &event );
|
|
void OnSlider( wxCommandEvent &event );
|
|
|
|
void OnOrder( wxCommandEvent &event );
|
|
void OnCutoff( wxCommandEvent &event );
|
|
void OnRipple( wxCommandEvent &event );
|
|
void OnStopbandRipple( wxCommandEvent &event );
|
|
void OnFilterType( wxCommandEvent &event );
|
|
void OnFilterSubtype( wxCommandEvent &event );
|
|
|
|
void OnSliderDBMAX( wxCommandEvent &event );
|
|
void OnSliderDBMIN( wxCommandEvent &event );
|
|
void OnPreview(wxCommandEvent &event);
|
|
void OnOk( wxCommandEvent &event );
|
|
void OnCancel( wxCommandEvent &event );
|
|
void EnableDisableRippleCtl (int FilterType);
|
|
private:
|
|
EffectScienFilter * m_pEffect;
|
|
|
|
double mLoFreq;
|
|
double mNyquist;
|
|
|
|
ScienFilterPanel *mPanel;
|
|
wxSlider *dBMinSlider;
|
|
wxSlider *dBMaxSlider;
|
|
wxBoxSizer *szrV;
|
|
wxFlexGridSizer *szr3;
|
|
wxBoxSizer *szr4;
|
|
wxBoxSizer *szr2;
|
|
wxFlexGridSizer *szr1;
|
|
wxSize size;
|
|
wxTextCtrl* mRippleCtl;
|
|
wxTextCtrl* mStopbandRippleCtl;
|
|
wxTextCtrl* mCutoffCtl;
|
|
|
|
// sizers for pass and stop-band attenuations
|
|
wxBoxSizer *szrPass;
|
|
wxBoxSizer *szrStop;
|
|
|
|
private:
|
|
DECLARE_EVENT_TABLE()
|
|
|
|
};
|
|
|
|
#if wxUSE_ACCESSIBILITY
|
|
|
|
// ScienceFilter and Equalisation effects both need SliderAx class.
|
|
// For now it is declared and defined in Equalisation effect.
|
|
// TODO: Move it to its own file.
|
|
|
|
#endif // wxUSE_ACCESSIBILITY
|
|
|
|
#endif
|