1
0
mirror of https://github.com/cookiengineer/audacity synced 2025-08-11 09:31:13 +02:00

Split Equalization into GraphicEq and FilterCurve effects.

First step in https://wiki.audacityteam.org/wiki/Proposal_Equalization
We still have Equalization as an effect, but if the split works well, will remove it for 2.3.2
This commit is contained in:
James Crook 2019-03-22 11:10:41 +00:00
parent bedd4f1f3f
commit de427da4c8
3 changed files with 96 additions and 51 deletions

View File

@ -213,11 +213,14 @@ BEGIN_EVENT_TABLE(EffectEqualization, wxEvtHandler)
#endif #endif
END_EVENT_TABLE() END_EVENT_TABLE()
EffectEqualization::EffectEqualization() EffectEqualization::EffectEqualization(int Options)
: mFFTBuffer{ windowSize } : mFFTBuffer{ windowSize }
, mFilterFuncR{ windowSize } , mFilterFuncR{ windowSize }
, mFilterFuncI{ windowSize } , mFilterFuncI{ windowSize }
{ {
mOptions = Options;
mGraphic = NULL;
mDraw = NULL;
mCurve = NULL; mCurve = NULL;
mPanel = NULL; mPanel = NULL;
@ -288,6 +291,10 @@ EffectEqualization::~EffectEqualization()
ComponentInterfaceSymbol EffectEqualization::GetSymbol() ComponentInterfaceSymbol EffectEqualization::GetSymbol()
{ {
if( mOptions == kEqOptionGraphic )
return GRAPHICEQ_PLUGIN_SYMBOL;
if( mOptions == kEqOptionCurve )
return FILTERCURVE_PLUGIN_SYMBOL;
return EQUALIZATION_PLUGIN_SYMBOL; return EQUALIZATION_PLUGIN_SYMBOL;
} }
@ -360,6 +367,11 @@ bool EffectEqualization::LoadFactoryDefaults()
mDrawMode = DEF_DrawMode; mDrawMode = DEF_DrawMode;
mDrawGrid = DEF_DrawGrid; mDrawGrid = DEF_DrawGrid;
if( mOptions == kEqOptionCurve)
mDrawMode = true;
if( mOptions == kEqOptionGraphic)
mDrawMode = false;
return Effect::LoadFactoryDefaults(); return Effect::LoadFactoryDefaults();
} }
@ -412,9 +424,20 @@ bool EffectEqualization::ValidateUI()
// Effect implementation // Effect implementation
bool EffectEqualization::Startup() wxString EffectEqualization::GetPrefsPrefix()
{ {
wxString base = wxT("/Effects/Equalization/"); wxString base = wxT("/Effects/Equalization/");
if( mOptions == kEqOptionGraphic )
base = wxT("/Effects/GraphicEq/");
else if( mOptions == kEqOptionCurve )
base = wxT("/Effects/FilterCurve/");
return base;
}
bool EffectEqualization::Startup()
{
wxString base = GetPrefsPrefix();
// Migrate settings from 2.1.0 or before // Migrate settings from 2.1.0 or before
@ -741,19 +764,21 @@ void EffectEqualization::PopulateOrExchange(ShuttleGui & S)
} }
S.EndHorizontalLay(); S.EndHorizontalLay();
S.StartHorizontalLay(wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL, 1); if( mOptions == kEqLegacy ){
{
S.StartHorizontalLay(wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL, 1); S.StartHorizontalLay(wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL, 1);
{ {
mDraw = S.Id(ID_Draw).AddRadioButton(_("&Draw")); S.StartHorizontalLay(wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL, 1);
mDraw->SetName(_("Draw Curves")); {
mDraw = S.Id(ID_Draw).AddRadioButton(_("&Draw"));
mDraw->SetName(_("Draw Curves"));
mGraphic = S.Id(ID_Graphic).AddRadioButtonToGroup(_("&Graphic")); mGraphic = S.Id(ID_Graphic).AddRadioButtonToGroup(_("&Graphic"));
mGraphic->SetName(_("Graphic EQ")); mGraphic->SetName(_("Graphic EQ"));
}
S.EndHorizontalLay();
} }
S.EndHorizontalLay(); S.EndHorizontalLay();
} }
S.EndHorizontalLay();
S.StartHorizontalLay(wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL, 1); S.StartHorizontalLay(wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL, 1);
{ {
@ -844,7 +869,9 @@ void EffectEqualization::PopulateOrExchange(ShuttleGui & S)
S.EndHorizontalLay(); S.EndHorizontalLay();
} }
S.EndHorizontalLay(); S.EndHorizontalLay();
S.Id(ID_Manage).AddButton(_("S&ave/Manage Curves..."));
if( mOptions == kEqLegacy )
S.Id(ID_Manage).AddButton(_("S&ave/Manage Curves..."));
S.StartHorizontalLay(wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL, 1); S.StartHorizontalLay(wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL, 1);
{ {
@ -964,17 +991,25 @@ bool EffectEqualization::TransferDataToWindow()
// Set graphic interpolation mode // Set graphic interpolation mode
mInterpChoice->SetSelection(mInterp); mInterpChoice->SetSelection(mInterp);
// Override draw mode, if we're not displaying the radio buttons.
if( mOptions == kEqOptionCurve)
mDrawMode = true;
if( mOptions == kEqOptionGraphic)
mDrawMode = false;
// Set Graphic (Fader) or Draw mode // Set Graphic (Fader) or Draw mode
if (mDrawMode) if (mDrawMode)
{ {
mDraw->SetValue(true); if( mDraw )
mDraw->SetValue(true);
szrV->Show(szrG,false); // eq sliders szrV->Show(szrG,false); // eq sliders
szrH->Show(szrI,false); // interpolation choice szrH->Show(szrI,false); // interpolation choice
szrH->Show(szrL,true); // linear freq checkbox szrH->Show(szrL,true); // linear freq checkbox
} }
else else
{ {
mGraphic->SetValue(true); if( mGraphic)
mGraphic->SetValue(true);
UpdateGraphic(); UpdateGraphic();
} }
@ -1348,7 +1383,7 @@ void EffectEqualization::LoadCurves(const wxString &fileName, bool append)
// Check if presets are up to date. // Check if presets are up to date.
wxString eqCurvesCurrentVersion = wxString::Format(wxT("%d.%d"), EQCURVES_VERSION, EQCURVES_REVISION); wxString eqCurvesCurrentVersion = wxString::Format(wxT("%d.%d"), EQCURVES_VERSION, EQCURVES_REVISION);
wxString eqCurvesInstalledVersion; wxString eqCurvesInstalledVersion;
gPrefs->Read(wxT("/Effects/Equalization/PresetVersion"), &eqCurvesInstalledVersion, wxT("")); gPrefs->Read(GetPrefsPrefix() + "PresetVersion", &eqCurvesInstalledVersion, wxT(""));
bool needUpdate = (eqCurvesCurrentVersion != eqCurvesInstalledVersion); bool needUpdate = (eqCurvesCurrentVersion != eqCurvesInstalledVersion);
@ -1531,7 +1566,7 @@ void EffectEqualization::UpdateDefaultCurves(bool updateAll /* false */)
// Write current EqCurve version number // Write current EqCurve version number
// TODO: Probably better if we used pluginregistry.cfg // TODO: Probably better if we used pluginregistry.cfg
wxString eqCurvesCurrentVersion = wxString::Format(wxT("%d.%d"), EQCURVES_VERSION, EQCURVES_REVISION); wxString eqCurvesCurrentVersion = wxString::Format(wxT("%d.%d"), EQCURVES_VERSION, EQCURVES_REVISION);
gPrefs->Write(wxT("/Effects/Equalization/PresetVersion"), eqCurvesCurrentVersion); gPrefs->Write(GetPrefsPrefix()+"PresetVersion", eqCurvesCurrentVersion);
gPrefs->Flush(); gPrefs->Flush();
return; return;
@ -2632,7 +2667,8 @@ void EffectEqualization::OnSlider(wxCommandEvent & event)
void EffectEqualization::OnInterp(wxCommandEvent & WXUNUSED(event)) void EffectEqualization::OnInterp(wxCommandEvent & WXUNUSED(event))
{ {
if (mGraphic->GetValue()) bool bIsGraphic = !mDrawMode;
if (bIsGraphic)
{ {
GraphicEQ(mLogEnvelope.get()); GraphicEQ(mLogEnvelope.get());
EnvelopeUpdated(); EnvelopeUpdated();
@ -2642,16 +2678,14 @@ void EffectEqualization::OnInterp(wxCommandEvent & WXUNUSED(event))
void EffectEqualization::OnDrawMode(wxCommandEvent & WXUNUSED(event)) void EffectEqualization::OnDrawMode(wxCommandEvent & WXUNUSED(event))
{ {
UpdateDraw();
mDrawMode = true; mDrawMode = true;
UpdateDraw();
} }
void EffectEqualization::OnGraphicMode(wxCommandEvent & WXUNUSED(event)) void EffectEqualization::OnGraphicMode(wxCommandEvent & WXUNUSED(event))
{ {
UpdateGraphic();
mDrawMode = false; mDrawMode = false;
UpdateGraphic();
} }
void EffectEqualization::OnSliderM(wxCommandEvent & WXUNUSED(event)) void EffectEqualization::OnSliderM(wxCommandEvent & WXUNUSED(event))
@ -3050,7 +3084,7 @@ void EqualizationPanel::OnPaint(wxPaintEvent & WXUNUSED(event))
} }
memDC.SetPen(*wxBLACK_PEN); memDC.SetPen(*wxBLACK_PEN);
if( mEffect->mDraw->GetValue() ) if( mEffect->mDrawMode )
{ {
ZoomInfo zoomInfo( 0.0, mEnvRect.width-1 ); ZoomInfo zoomInfo( 0.0, mEnvRect.width-1 );

View File

@ -45,7 +45,14 @@
#include "../SampleFormat.h" #include "../SampleFormat.h"
#define EQUALIZATION_PLUGIN_SYMBOL ComponentInterfaceSymbol{ XO("Equalization") } #define EQUALIZATION_PLUGIN_SYMBOL ComponentInterfaceSymbol{ XO("Equalization") }
#define GRAPHICEQ_PLUGIN_SYMBOL ComponentInterfaceSymbol{ XO("Graphic EQ") }
#define FILTERCURVE_PLUGIN_SYMBOL ComponentInterfaceSymbol{ XO("Filter Curve") }
// Flags to specialise the UI
const int kEqOptionGraphic =1;
const int kEqOptionCurve =1<<1;
// The legacy version offers both Graphic and curve on the same UI.
const int kEqLegacy = kEqOptionGraphic + kEqOptionCurve;
class Envelope; class Envelope;
class EnvelopeEditor; class EnvelopeEditor;
@ -101,7 +108,7 @@ class EffectEqualization final : public Effect,
public XMLTagHandler public XMLTagHandler
{ {
public: public:
EffectEqualization(); EffectEqualization(int Options);
virtual ~EffectEqualization(); virtual ~EffectEqualization();
// ComponentInterface implementation // ComponentInterface implementation
@ -139,6 +146,7 @@ public:
private: private:
// EffectEqualization implementation // EffectEqualization implementation
wxString GetPrefsPrefix();
// Number of samples in an FFT window // Number of samples in an FFT window
static const size_t windowSize = 16384u; //MJS - work out the optimum for this at run time? Have a dialog box for it? static const size_t windowSize = 16384u; //MJS - work out the optimum for this at run time? Have a dialog box for it?
@ -205,6 +213,7 @@ private:
#endif #endif
private: private:
int mOptions;
HFFT hFFT; HFFT hFFT;
Floats mFFTBuffer, mFilterFuncR, mFilterFuncI; Floats mFFTBuffer, mFilterFuncR, mFilterFuncI;
size_t mM; size_t mM;

View File

@ -109,36 +109,38 @@
// Define the list of effects that will be autoregistered and how to instantiate each // Define the list of effects that will be autoregistered and how to instantiate each
// //
#define EFFECT_LIST \ #define EFFECT_LIST \
EFFECT( CHIRP, EffectToneGen, (true) ) \ EFFECT( CHIRP, EffectToneGen, (true) ) \
EFFECT( DTMFTONES, EffectDtmf, () ) \ EFFECT( DTMFTONES, EffectDtmf, () ) \
EFFECT( NOISE, EffectNoise, () ) \ EFFECT( NOISE, EffectNoise, () ) \
EFFECT( SILENCE, EffectSilence, () ) \ EFFECT( SILENCE, EffectSilence, () ) \
EFFECT( TONE, EffectToneGen, (false) ) \ EFFECT( TONE, EffectToneGen, (false) ) \
EFFECT( AMPLIFY, EffectAmplify, () ) \ EFFECT( AMPLIFY, EffectAmplify, () ) \
EFFECT( BASSTREBLE, EffectBassTreble, () ) \ EFFECT( BASSTREBLE, EffectBassTreble, () ) \
EFFECT( CHANGESPEED, EffectChangeSpeed, () ) \ EFFECT( CHANGESPEED, EffectChangeSpeed, () ) \
EFFECT( CLICKREMOVAL, EffectClickRemoval, () ) \ EFFECT( CLICKREMOVAL, EffectClickRemoval, () ) \
EFFECT( COMPRESSOR, EffectCompressor, () ) \ EFFECT( COMPRESSOR, EffectCompressor, () ) \
EFFECT( DISTORTION, EffectDistortion, () ) \ EFFECT( DISTORTION, EffectDistortion, () ) \
EFFECT( ECHO, EffectEcho, () ) \ EFFECT( ECHO, EffectEcho, () ) \
EFFECT( EQUALIZATION, EffectEqualization, () ) \ EFFECT( EQUALIZATION, EffectEqualization, (kEqLegacy) ) \
EFFECT( FADEIN, EffectFade, (true) ) \ EFFECT( FADEIN, EffectFade, (true) ) \
EFFECT( FADEOUT, EffectFade, (false) ) \ EFFECT( FADEOUT, EffectFade, (false) ) \
EFFECT( INVERT, EffectInvert, () ) \ EFFECT( FILTERCURVE, EffectEqualization, (kEqOptionCurve) ) \
EFFECT( NORMALIZE, EffectNormalize, () ) \ EFFECT( GRAPHICEQ, EffectEqualization, (kEqOptionGraphic) ) \
EFFECT( PHASER, EffectPhaser, () ) \ EFFECT( INVERT, EffectInvert, () ) \
EFFECT( REPAIR, EffectRepair, () ) \ EFFECT( NORMALIZE, EffectNormalize, () ) \
EFFECT( REPEAT, EffectRepeat, () ) \ EFFECT( PHASER, EffectPhaser, () ) \
EFFECT( REVERB, EffectReverb, () ) \ EFFECT( REPAIR, EffectRepair, () ) \
EFFECT( REVERSE, EffectReverse, () ) \ EFFECT( REPEAT, EffectRepeat, () ) \
EFFECT( STEREOTOMONO, EffectStereoToMono, () ) \ EFFECT( REVERB, EffectReverb, () ) \
EFFECT( TRUNCATESILENCE, EffectTruncSilence, () ) \ EFFECT( REVERSE, EffectReverse, () ) \
EFFECT( WAHWAH, EffectWahwah, () ) \ EFFECT( STEREOTOMONO, EffectStereoToMono, () ) \
EFFECT( FINDCLIPPING, EffectFindClipping, () ) \ EFFECT( TRUNCATESILENCE, EffectTruncSilence, () ) \
NOISEREDUCTION_EFFECT \ EFFECT( WAHWAH, EffectWahwah, () ) \
SOUNDTOUCH_EFFECTS \ EFFECT( FINDCLIPPING, EffectFindClipping, () ) \
EFFECT( AUTODUCK, EffectAutoDuck, () ) \ NOISEREDUCTION_EFFECT \
EFFECT( PAULSTRETCH, EffectPaulstretch, () ) \ SOUNDTOUCH_EFFECTS \
EFFECT( AUTODUCK, EffectAutoDuck, () ) \
EFFECT( PAULSTRETCH, EffectPaulstretch, () ) \
SBSMS_EFFECTS SBSMS_EFFECTS
// //