mirror of
https://github.com/cookiengineer/audacity
synced 2025-11-08 14:13:57 +01:00
Add output gain control to Phaser effect
This commit is contained in:
@@ -37,7 +37,8 @@ enum
|
|||||||
ID_Freq,
|
ID_Freq,
|
||||||
ID_Phase,
|
ID_Phase,
|
||||||
ID_Depth,
|
ID_Depth,
|
||||||
ID_Feedback
|
ID_Feedback,
|
||||||
|
ID_OutGain
|
||||||
};
|
};
|
||||||
|
|
||||||
// Define keys, defaults, minimums, and maximums for the effect parameters
|
// Define keys, defaults, minimums, and maximums for the effect parameters
|
||||||
@@ -49,6 +50,7 @@ Param( Freq, double, XO("Freq"), 0.4, 0.001,4.0, 10.0 );
|
|||||||
Param( Phase, double, XO("Phase"), 0.0, 0.0, 360.0, 1 );
|
Param( Phase, double, XO("Phase"), 0.0, 0.0, 360.0, 1 );
|
||||||
Param( Depth, int, XO("Depth"), 100, 0, 255, 1 );
|
Param( Depth, int, XO("Depth"), 100, 0, 255, 1 );
|
||||||
Param( Feedback, int, XO("Feedback"), 0, -100, 100, 1 );
|
Param( Feedback, int, XO("Feedback"), 0, -100, 100, 1 );
|
||||||
|
Param( OutGain, double, XO("Gain"), -6.0, -30.0, 30.0, 1 );
|
||||||
|
|
||||||
//
|
//
|
||||||
#define phaserlfoshape 4.0
|
#define phaserlfoshape 4.0
|
||||||
@@ -70,12 +72,14 @@ BEGIN_EVENT_TABLE(EffectPhaser, wxEvtHandler)
|
|||||||
EVT_SLIDER(ID_Phase, EffectPhaser::OnPhaseSlider)
|
EVT_SLIDER(ID_Phase, EffectPhaser::OnPhaseSlider)
|
||||||
EVT_SLIDER(ID_Depth, EffectPhaser::OnDepthSlider)
|
EVT_SLIDER(ID_Depth, EffectPhaser::OnDepthSlider)
|
||||||
EVT_SLIDER(ID_Feedback, EffectPhaser::OnFeedbackSlider)
|
EVT_SLIDER(ID_Feedback, EffectPhaser::OnFeedbackSlider)
|
||||||
|
EVT_SLIDER(ID_OutGain, EffectPhaser::OnGainSlider)
|
||||||
EVT_TEXT(ID_Stages, EffectPhaser::OnStagesText)
|
EVT_TEXT(ID_Stages, EffectPhaser::OnStagesText)
|
||||||
EVT_TEXT(ID_DryWet, EffectPhaser::OnDryWetText)
|
EVT_TEXT(ID_DryWet, EffectPhaser::OnDryWetText)
|
||||||
EVT_TEXT(ID_Freq, EffectPhaser::OnFreqText)
|
EVT_TEXT(ID_Freq, EffectPhaser::OnFreqText)
|
||||||
EVT_TEXT(ID_Phase, EffectPhaser::OnPhaseText)
|
EVT_TEXT(ID_Phase, EffectPhaser::OnPhaseText)
|
||||||
EVT_TEXT(ID_Depth, EffectPhaser::OnDepthText)
|
EVT_TEXT(ID_Depth, EffectPhaser::OnDepthText)
|
||||||
EVT_TEXT(ID_Feedback, EffectPhaser::OnFeedbackText)
|
EVT_TEXT(ID_Feedback, EffectPhaser::OnFeedbackText)
|
||||||
|
EVT_TEXT(ID_OutGain, EffectPhaser::OnGainText)
|
||||||
END_EVENT_TABLE()
|
END_EVENT_TABLE()
|
||||||
|
|
||||||
EffectPhaser::EffectPhaser()
|
EffectPhaser::EffectPhaser()
|
||||||
@@ -86,6 +90,7 @@ EffectPhaser::EffectPhaser()
|
|||||||
mPhase = DEF_Phase;
|
mPhase = DEF_Phase;
|
||||||
mDepth = DEF_Depth;
|
mDepth = DEF_Depth;
|
||||||
mFeedback = DEF_Feedback;
|
mFeedback = DEF_Feedback;
|
||||||
|
mOutGain = DEF_OutGain;
|
||||||
|
|
||||||
SetLinearEffectFlag(true);
|
SetLinearEffectFlag(true);
|
||||||
}
|
}
|
||||||
@@ -194,6 +199,7 @@ bool EffectPhaser::GetAutomationParameters(EffectAutomationParameters & parms)
|
|||||||
parms.Write(KEY_Phase, mPhase);
|
parms.Write(KEY_Phase, mPhase);
|
||||||
parms.Write(KEY_Depth, mDepth);
|
parms.Write(KEY_Depth, mDepth);
|
||||||
parms.Write(KEY_Feedback, mFeedback);
|
parms.Write(KEY_Feedback, mFeedback);
|
||||||
|
parms.Write(KEY_OutGain, mOutGain);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -206,6 +212,7 @@ bool EffectPhaser::SetAutomationParameters(EffectAutomationParameters & parms)
|
|||||||
ReadAndVerifyDouble(Phase);
|
ReadAndVerifyDouble(Phase);
|
||||||
ReadAndVerifyInt(Depth);
|
ReadAndVerifyInt(Depth);
|
||||||
ReadAndVerifyInt(Feedback);
|
ReadAndVerifyInt(Feedback);
|
||||||
|
ReadAndVerifyDouble(OutGain);
|
||||||
|
|
||||||
if (Stages & 1) // must be even, but don't complain about it
|
if (Stages & 1) // must be even, but don't complain about it
|
||||||
{
|
{
|
||||||
@@ -218,6 +225,7 @@ bool EffectPhaser::SetAutomationParameters(EffectAutomationParameters & parms)
|
|||||||
mDryWet = DryWet;
|
mDryWet = DryWet;
|
||||||
mDepth = Depth;
|
mDepth = Depth;
|
||||||
mPhase = Phase;
|
mPhase = Phase;
|
||||||
|
mOutGain = OutGain;
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -295,6 +303,16 @@ void EffectPhaser::PopulateOrExchange(ShuttleGui & S)
|
|||||||
mFeedbackS->SetName(_("Feedback in percent"));
|
mFeedbackS->SetName(_("Feedback in percent"));
|
||||||
mFeedbackS->SetLineSize(10);
|
mFeedbackS->SetLineSize(10);
|
||||||
mFeedbackS->SetMinSize(wxSize(100, -1));
|
mFeedbackS->SetMinSize(wxSize(100, -1));
|
||||||
|
|
||||||
|
FloatingPointValidator<double> vldoutgain(1, &mOutGain);
|
||||||
|
vldoutgain.SetRange(MIN_OutGain, MAX_OutGain);
|
||||||
|
mOutGainT = S.Id(ID_OutGain).AddTextBox(_("Output gain (dB):"), wxT(""), 12);
|
||||||
|
mOutGainT->SetValidator(vldoutgain);
|
||||||
|
|
||||||
|
S.SetStyle(wxSL_HORIZONTAL);
|
||||||
|
mOutGainS = S.Id(ID_OutGain).AddSlider(wxT(""), DEF_OutGain * SCL_OutGain, MAX_OutGain * SCL_OutGain, MIN_OutGain * SCL_OutGain);
|
||||||
|
mOutGainS->SetName(_("Output gain (dB)"));
|
||||||
|
mOutGainS->SetMinSize(wxSize(100, -1));
|
||||||
}
|
}
|
||||||
S.EndMultiColumn();
|
S.EndMultiColumn();
|
||||||
}
|
}
|
||||||
@@ -312,6 +330,7 @@ bool EffectPhaser::TransferDataToWindow()
|
|||||||
mPhaseS->SetValue((int) (mPhase * SCL_Phase));
|
mPhaseS->SetValue((int) (mPhase * SCL_Phase));
|
||||||
mDepthS->SetValue((int) (mDepth * SCL_Depth));
|
mDepthS->SetValue((int) (mDepth * SCL_Depth));
|
||||||
mFeedbackS->SetValue((int) (mFeedback * SCL_Feedback));
|
mFeedbackS->SetValue((int) (mFeedback * SCL_Feedback));
|
||||||
|
mOutGainS->SetValue((int) (mOutGain * SCL_OutGain));
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -347,6 +366,7 @@ void EffectPhaser::InstanceInit(EffectPhaserState & data, float sampleRate)
|
|||||||
data.gain = 0;
|
data.gain = 0;
|
||||||
data.fbout = 0;
|
data.fbout = 0;
|
||||||
data.laststages = 0;
|
data.laststages = 0;
|
||||||
|
data.outgain = 0;
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -364,6 +384,7 @@ sampleCount EffectPhaser::InstanceProcess(EffectPhaserState & data, float **inBl
|
|||||||
|
|
||||||
data.lfoskip = mFreq * 2 * M_PI / data.samplerate;
|
data.lfoskip = mFreq * 2 * M_PI / data.samplerate;
|
||||||
data.phase = mPhase * M_PI / 180;
|
data.phase = mPhase * M_PI / 180;
|
||||||
|
data.outgain = DB_TO_LINEAR(mOutGain);
|
||||||
|
|
||||||
for (sampleCount i = 0; i < blockLen; i++)
|
for (sampleCount i = 0; i < blockLen; i++)
|
||||||
{
|
{
|
||||||
@@ -392,7 +413,7 @@ sampleCount EffectPhaser::InstanceProcess(EffectPhaserState & data, float **inBl
|
|||||||
}
|
}
|
||||||
data.fbout = m;
|
data.fbout = m;
|
||||||
|
|
||||||
obuf[i] = (float) ((m * mDryWet + in * (255 - mDryWet)) / 255);
|
obuf[i] = (float) (data.outgain * (m * mDryWet + in * (255 - mDryWet)) / 255);
|
||||||
}
|
}
|
||||||
|
|
||||||
return blockLen;
|
return blockLen;
|
||||||
@@ -448,6 +469,13 @@ void EffectPhaser::OnFeedbackSlider(wxCommandEvent & evt)
|
|||||||
EnableApply(mUIParent->Validate());
|
EnableApply(mUIParent->Validate());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void EffectPhaser::OnGainSlider(wxCommandEvent & evt)
|
||||||
|
{
|
||||||
|
mOutGain = evt.GetInt() / SCL_OutGain;
|
||||||
|
mOutGainT->GetValidator()->TransferToWindow();
|
||||||
|
EnableApply(mUIParent->Validate());
|
||||||
|
}
|
||||||
|
|
||||||
void EffectPhaser::OnStagesText(wxCommandEvent & WXUNUSED(evt))
|
void EffectPhaser::OnStagesText(wxCommandEvent & WXUNUSED(evt))
|
||||||
{
|
{
|
||||||
if (!EnableApply(mUIParent->TransferDataFromWindow()))
|
if (!EnableApply(mUIParent->TransferDataFromWindow()))
|
||||||
@@ -507,3 +535,13 @@ void EffectPhaser::OnFeedbackText(wxCommandEvent & WXUNUSED(evt))
|
|||||||
|
|
||||||
mFeedbackS->SetValue((int) (mFeedback * SCL_Feedback));
|
mFeedbackS->SetValue((int) (mFeedback * SCL_Feedback));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void EffectPhaser::OnGainText(wxCommandEvent & WXUNUSED(evt))
|
||||||
|
{
|
||||||
|
if (!EnableApply(mUIParent->TransferDataFromWindow()))
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
mOutGainS->SetValue((int) (mOutGain * SCL_OutGain));
|
||||||
|
}
|
||||||
@@ -38,6 +38,7 @@ public:
|
|||||||
double old[NUM_STAGES]; // must be as large as MAX_STAGES
|
double old[NUM_STAGES]; // must be as large as MAX_STAGES
|
||||||
double gain;
|
double gain;
|
||||||
double fbout;
|
double fbout;
|
||||||
|
double outgain;
|
||||||
double lfoskip;
|
double lfoskip;
|
||||||
double phase;
|
double phase;
|
||||||
int laststages;
|
int laststages;
|
||||||
@@ -83,7 +84,7 @@ public:
|
|||||||
bool TransferDataToWindow();
|
bool TransferDataToWindow();
|
||||||
bool TransferDataFromWindow();
|
bool TransferDataFromWindow();
|
||||||
|
|
||||||
protected:
|
private:
|
||||||
// EffectPhaser implementation
|
// EffectPhaser implementation
|
||||||
|
|
||||||
void InstanceInit(EffectPhaserState & data, float sampleRate);
|
void InstanceInit(EffectPhaserState & data, float sampleRate);
|
||||||
@@ -95,12 +96,15 @@ protected:
|
|||||||
void OnDepthSlider(wxCommandEvent & evt);
|
void OnDepthSlider(wxCommandEvent & evt);
|
||||||
void OnPhaseSlider(wxCommandEvent & evt);
|
void OnPhaseSlider(wxCommandEvent & evt);
|
||||||
void OnFreqSlider(wxCommandEvent & evt);
|
void OnFreqSlider(wxCommandEvent & evt);
|
||||||
|
void OnGainSlider(wxCommandEvent & evt);
|
||||||
|
|
||||||
void OnStagesText(wxCommandEvent & evt);
|
void OnStagesText(wxCommandEvent & evt);
|
||||||
void OnDryWetText(wxCommandEvent & evt);
|
void OnDryWetText(wxCommandEvent & evt);
|
||||||
void OnFeedbackText(wxCommandEvent & evt);
|
void OnFeedbackText(wxCommandEvent & evt);
|
||||||
void OnDepthText(wxCommandEvent & evt);
|
void OnDepthText(wxCommandEvent & evt);
|
||||||
void OnPhaseText(wxCommandEvent & evt);
|
void OnPhaseText(wxCommandEvent & evt);
|
||||||
void OnFreqText(wxCommandEvent & evt);
|
void OnFreqText(wxCommandEvent & evt);
|
||||||
|
void OnGainText(wxCommandEvent & evt);
|
||||||
/*
|
/*
|
||||||
Phaser Parameters
|
Phaser Parameters
|
||||||
|
|
||||||
@@ -124,6 +128,7 @@ private:
|
|||||||
double mPhase;
|
double mPhase;
|
||||||
int mDepth;
|
int mDepth;
|
||||||
int mFeedback;
|
int mFeedback;
|
||||||
|
double mOutGain;
|
||||||
|
|
||||||
wxTextCtrl *mStagesT;
|
wxTextCtrl *mStagesT;
|
||||||
wxTextCtrl *mDryWetT;
|
wxTextCtrl *mDryWetT;
|
||||||
@@ -131,6 +136,7 @@ private:
|
|||||||
wxTextCtrl *mPhaseT;
|
wxTextCtrl *mPhaseT;
|
||||||
wxTextCtrl *mDepthT;
|
wxTextCtrl *mDepthT;
|
||||||
wxTextCtrl *mFeedbackT;
|
wxTextCtrl *mFeedbackT;
|
||||||
|
wxTextCtrl *mOutGainT;
|
||||||
|
|
||||||
wxSlider *mStagesS;
|
wxSlider *mStagesS;
|
||||||
wxSlider *mDryWetS;
|
wxSlider *mDryWetS;
|
||||||
@@ -138,6 +144,7 @@ private:
|
|||||||
wxSlider *mPhaseS;
|
wxSlider *mPhaseS;
|
||||||
wxSlider *mDepthS;
|
wxSlider *mDepthS;
|
||||||
wxSlider *mFeedbackS;
|
wxSlider *mFeedbackS;
|
||||||
|
wxSlider *mOutGainS;
|
||||||
|
|
||||||
DECLARE_EVENT_TABLE();
|
DECLARE_EVENT_TABLE();
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user