30#define M_PI 3.1415926535897932384626433832795
33#define M_PI_2 1.57079632679489661923132169163975
36#include <wx/checkbox.h>
41#include <wx/stattext.h>
42#include <wx/weakref.h>
46#include "../widgets/valnum.h"
50 {
XO(
"Hard Clipping") },
51 {
XO(
"Soft Clipping") },
52 {
XO(
"Soft Overdrive") },
53 {
XO(
"Medium Overdrive") },
54 {
XO(
"Hard Overdrive") },
55 {
XO(
"Cubic Curve (odd harmonics)") },
56 {
XO(
"Even Harmonics") },
57 {
XO(
"Expand and Compress") },
59 {
XO(
"Rectifier Distortion") },
60 {
XO(
"Hard Limiter 1413") }
72#define skipsamples 1000
85 {
XO(
"Hard clip -12dB, 80% make-up gain"), { 0, 0, -12.0, -70.0, 0.0, 80.0, 0 } },
87 {
XO(
"Soft clip -12dB, 80% make-up gain"), { 1, 0, -12.0, -70.0, 50.0, 80.0, 0 } },
88 {
XO(
"Fuzz Box"), { 1, 0, -30.0, -70.0, 80.0, 80.0, 0 } },
89 {
XO(
"Walkie-talkie"), { 1, 0, -50.0, -70.0, 60.0, 80.0, 0 } },
90 {
XO(
"Blues drive sustain"), { 2, 0, -6.0, -70.0, 30.0, 80.0, 0 } },
91 {
XO(
"Light Crunch Overdrive"), { 3, 0, -6.0, -70.0, 20.0, 80.0, 0 } },
92 {
XO(
"Heavy Overdrive"), { 4, 0, -6.0, -70.0, 90.0, 80.0, 0 } },
93 {
XO(
"3rd Harmonic (Perfect Fifth)"), { 5, 0, -6.0, -70.0, 100.0, 60.0, 0 } },
94 {
XO(
"Valve Overdrive"), { 6, 1, -6.0, -70.0, 30.0, 40.0, 0 } },
95 {
XO(
"2nd Harmonic (Octave)"), { 6, 1, -6.0, -70.0, 50.0, 0.0, 0 } },
96 {
XO(
"Gated Expansion Distortion"), { 7, 0, -6.0, -70.0, 30.0, 80.0, 0 } },
97 {
XO(
"Leveller, Light, -70dB noise floor"), { 8, 0, -6.0, -70.0, 0.0, 50.0, 1 } },
98 {
XO(
"Leveller, Moderate, -70dB noise floor"), { 8, 0, -6.0, -70.0, 0.0, 50.0, 2 } },
99 {
XO(
"Leveller, Heavy, -70dB noise floor"), { 8, 0, -6.0, -70.0, 0.0, 50.0, 3 } },
100 {
XO(
"Leveller, Heavier, -70dB noise floor"), { 8, 0, -6.0, -70.0, 0.0, 50.0, 4 } },
101 {
XO(
"Leveller, Heaviest, -70dB noise floor"), { 8, 0, -6.0, -70.0, 0.0, 50.0, 5 } },
102 {
XO(
"Half-wave Rectifier"), { 9, 0, -6.0, -70.0, 50.0, 50.0, 0 } },
103 {
XO(
"Full-wave Rectifier"), { 9, 0, -6.0, -70.0, 100.0, 50.0, 0 } },
104 {
XO(
"Full-wave Rectifier (DC blocked)"), { 9, 1, -6.0, -70.0, 100.0, 50.0, 0 } },
105 {
XO(
"Percussion Limiter"), {10, 0, -12.0, -70.0, 100.0, 30.0, 0 } },
111 XO(
"Upper Threshold"),
115 XO(
"Number of repeats"),
118 return names[ index ];
211 if ( !
mUIParent->TransferDataFromWindow())
246 const float*
const* inBlock,
float*
const* outBlock,
size_t blockLen)
override;
256 const float*
const* inbuf,
float*
const* outbuf,
size_t numSamples)
263 const float*
const* inBlock,
float*
const* outBlock,
size_t blockLen);
290 inline float LogCurve(
double threshold,
float value,
double ratio);
309std::shared_ptr<EffectInstance>
312 return std::make_shared<Instance>(*
this);
318 return mInstance.mMaster;
341 return XO(
"Waveshaping distortion effect");
346 return L
"Distortion";
379 const float*
const* inBlock,
float*
const* outBlock,
size_t blockLen)
381 return InstanceProcess(
settings, mMaster, inBlock, outBlock, blockLen);
398 mSlaves.push_back(slave);
411 const float*
const* inbuf,
float*
const* outbuf,
size_t numSamples)
413 if (group >= mSlaves.size())
415 return InstanceProcess(
settings, mSlaves[group], inbuf, outbuf, numSamples);
452std::unique_ptr<EffectEditor>
460 result->PopulateOrExchange(
S);
467 mUIParent =
S.GetParent();
468 auto& ms = mSettings;
471 S.StartVerticalLay();
473 S.StartMultiColumn(4, wxCENTER);
476 .MinSize( { -1, -1 } )
478 .AddChoice(
XXO(
"Distortion type:"),
483 mDCBlockCheckBox =
S.AddCheckBox(
XXO(
"DC blocking filter"),
492 S.StartStatic(
XO(
"Threshold controls"));
494 S.StartMultiColumn(4, wxEXPAND);
498 S.AddSpace(250,0);
S.AddSpace(0,0);
S.AddSpace(0,0);
S.AddSpace(0,0);
502 false, wxALIGN_CENTER_VERTICAL | wxALIGN_LEFT);
505 .Validator<FloatingPointValidator<double>>(
506 2, &ms.mThreshold_dB, NumValidatorStyle::DEFAULT,
508 .AddTextBox( {},
wxT(
""), 10);
514 .Style(wxSL_HORIZONTAL)
524 false, wxALIGN_CENTER_VERTICAL | wxALIGN_LEFT);
527 .Validator<FloatingPointValidator<double>>(
528 2, &ms.mNoiseFloor, NumValidatorStyle::DEFAULT,
531 .AddTextBox( {},
wxT(
""), 10);
537 .Style(wxSL_HORIZONTAL)
547 S.StartStatic(
XO(
"Parameter controls"));
549 S.StartMultiColumn(4, wxEXPAND);
553 S.AddSpace(250,0);
S.AddSpace(0,0);
S.AddSpace(0,0);
S.AddSpace(0,0);
557 false, wxALIGN_CENTER_VERTICAL | wxALIGN_LEFT);
560 .Validator<FloatingPointValidator<double>>(
561 2, &ms.mParam1, NumValidatorStyle::DEFAULT,
564 .AddTextBox( {},
wxT(
""), 10);
570 .Style(wxSL_HORIZONTAL)
578 false, wxALIGN_CENTER_VERTICAL | wxALIGN_LEFT);
581 .Validator<FloatingPointValidator<double>>(
582 2, &ms.mParam2, NumValidatorStyle::DEFAULT,
585 .AddTextBox( {},
wxT(
""), 10);
591 .Style(wxSL_HORIZONTAL)
600 false, wxALIGN_CENTER_VERTICAL | wxALIGN_LEFT);
603 .Validator<IntegerValidator<int>>(
604 &ms.mRepeats, NumValidatorStyle::DEFAULT,
607 .AddTextBox( {},
wxT(
""), 10);
613 .Style(wxSL_HORIZONTAL)
631 const auto& ms = mSettings;
633 if (!mUIParent->TransferDataToWindow())
638 const double threshold =
DB_TO_LINEAR(ms.mThreshold_dB);
641 mDCBlockCheckBox->SetValue( ms.mDCBlock);
642 mNoiseFloorS-> SetValue((
int)ms.mNoiseFloor + 0.5);
643 mParam1S-> SetValue((
int)ms.mParam1 + 0.5);
644 mParam2S-> SetValue((
int)ms.mParam2 + 0.5);
645 mRepeatsS-> SetValue( ms.mRepeats);
647 GetState().mbSavedFilterState = ms.mDCBlock;
683 const float *
const *inBlock,
float *
const *outBlock,
size_t blockLen)
687 const float *ibuf = inBlock[0];
688 float *obuf = outBlock[0];
693 ms.mParam1 == data.
param1 &&
694 ms.mParam2 == data.
param2 &&
695 ms.mRepeats == data.
repeats)?
false :
true;
697 double p1 = ms.mParam1 / 100.0;
698 double p2 = ms.mParam2 / 100.0;
706 for (
decltype(blockLen) i = 0; i < blockLen; i++) {
711 switch (ms.mTableChoiceIndx)
715 obuf[i] = WaveShaper(ibuf[i], ms) * ((1 - p2) + (data.
mMakeupGain * p2));
719 obuf[i] = WaveShaper(ibuf[i], ms) * ((1 - p2) + (data.
mMakeupGain * p2));
722 obuf[i] = WaveShaper(ibuf[i], ms) * p2;
725 obuf[i] = WaveShaper(ibuf[i], ms) * p2;
728 obuf[i] = WaveShaper(ibuf[i], ms) * p2;
731 obuf[i] = WaveShaper(ibuf[i], ms) * p2;
734 obuf[i] = WaveShaper(ibuf[i], ms);
737 obuf[i] = WaveShaper(ibuf[i], ms) * p2;
740 obuf[i] = WaveShaper(ibuf[i], ms);
743 obuf[i] = WaveShaper(ibuf[i], ms);
747 obuf[i] = (WaveShaper(ibuf[i], ms) * (p1 - p2)) + (ibuf[i] * p2);
750 obuf[i] = WaveShaper(ibuf[i], ms);
753 obuf[i] = DCFilter(data, obuf[i]);
762 mTypeChoiceCtrl->GetValidator()->TransferFromWindow();
772 auto& ms = mSettings;
774 ms.mDCBlock = mDCBlockCheckBox->GetValue();
776 GetState().mbSavedFilterState = ms.mDCBlock;
785 const auto& ms = mSettings;
787 mThresholdT->GetValidator()->TransferFromWindow();
788 const double threshold =
DB_TO_LINEAR(ms.mThreshold_dB);
797 auto& ms = mSettings;
804 mThresholdT->GetValidator()->TransferToWindow();
812 const auto& ms = mSettings;
814 mNoiseFloorT->GetValidator()->TransferFromWindow();
815 mNoiseFloorS->SetValue((
int) floor(ms.mNoiseFloor + 0.5));
823 auto& ms = mSettings;
825 ms.mNoiseFloor = (double) evt.GetInt();
826 mNoiseFloorT->GetValidator()->TransferToWindow();
835 const auto& ms = mSettings;
837 mParam1T->GetValidator()->TransferFromWindow();
838 mParam1S->SetValue((
int) floor(ms.mParam1 + 0.5));
846 auto& ms = mSettings;
848 ms.mParam1 = (double) evt.GetInt();
849 mParam1T->GetValidator()->TransferToWindow();
857 const auto& ms = mSettings;
859 mParam2T->GetValidator()->TransferFromWindow();
860 mParam2S->SetValue((
int) floor(ms.mParam2 + 0.5));
868 auto& ms = mSettings;
870 ms.mParam2 = (double) evt.GetInt();
871 mParam2T->GetValidator()->TransferToWindow();
879 const auto& ms = mSettings;
881 mRepeatsT->GetValidator()->TransferFromWindow();
882 mRepeatsS->SetValue(ms.mRepeats);
890 auto& ms = mSettings;
892 ms.mRepeats = evt.GetInt();
893 mRepeatsT->GetValidator()->TransferToWindow();
901 const auto& ms = mSettings;
904 switch (ms.mTableChoiceIndx)
907 UpdateControlText(mThresholdT, mOldThresholdTxt,
true);
908 UpdateControlText(mNoiseFloorT, mOldmNoiseFloorTxt,
false);
909 UpdateControlText(mParam1T, mOldParam1Txt,
true);
910 UpdateControlText(mParam2T, mOldParam2Txt,
true);
911 UpdateControlText(mRepeatsT, mOldRepeatsTxt,
false);
916 UpdateControl(
ID_Param2,
true,
XO(
"Make-up Gain"));
921 UpdateControlText(mThresholdT, mOldThresholdTxt,
true);
922 UpdateControlText(mNoiseFloorT, mOldmNoiseFloorTxt,
false);
923 UpdateControlText(mParam1T, mOldParam1Txt,
true);
924 UpdateControlText(mParam2T, mOldParam2Txt,
true);
925 UpdateControlText(mRepeatsT, mOldRepeatsTxt,
false);
930 UpdateControl(
ID_Param2,
true,
XO(
"Make-up Gain"));
935 UpdateControlText(mThresholdT, mOldThresholdTxt,
false);
936 UpdateControlText(mNoiseFloorT, mOldmNoiseFloorTxt,
false);
937 UpdateControlText(mParam1T, mOldParam1Txt,
true);
938 UpdateControlText(mParam2T, mOldParam2Txt,
true);
939 UpdateControlText(mRepeatsT, mOldRepeatsTxt,
false);
943 UpdateControl(
ID_Param1,
true,
XO(
"Distortion amount"));
944 UpdateControl(
ID_Param2,
true,
XO(
"Output level"));
949 UpdateControlText(mThresholdT, mOldThresholdTxt,
false);
950 UpdateControlText(mNoiseFloorT, mOldmNoiseFloorTxt,
false);
951 UpdateControlText(mParam1T, mOldParam1Txt,
true);
952 UpdateControlText(mParam2T, mOldParam2Txt,
true);
953 UpdateControlText(mRepeatsT, mOldRepeatsTxt,
false);
957 UpdateControl(
ID_Param1,
true,
XO(
"Distortion amount"));
958 UpdateControl(
ID_Param2,
true,
XO(
"Output level"));
963 UpdateControlText(mThresholdT, mOldThresholdTxt,
false);
964 UpdateControlText(mNoiseFloorT, mOldmNoiseFloorTxt,
false);
965 UpdateControlText(mParam1T, mOldParam1Txt,
true);
966 UpdateControlText(mParam2T, mOldParam2Txt,
true);
967 UpdateControlText(mRepeatsT, mOldRepeatsTxt,
false);
971 UpdateControl(
ID_Param1,
true,
XO(
"Distortion amount"));
972 UpdateControl(
ID_Param2,
true,
XO(
"Output level"));
977 UpdateControlText(mThresholdT, mOldThresholdTxt,
false);
978 UpdateControlText(mNoiseFloorT, mOldmNoiseFloorTxt,
false);
979 UpdateControlText(mParam1T, mOldParam1Txt,
true);
980 UpdateControlText(mParam2T, mOldParam2Txt,
true);
981 UpdateControlText(mRepeatsT, mOldRepeatsTxt,
true);
985 UpdateControl(
ID_Param1,
true,
XO(
"Distortion amount"));
986 UpdateControl(
ID_Param2,
true,
XO(
"Output level"));
987 UpdateControl(
ID_Repeats,
true,
XO(
"Repeat processing"));
991 UpdateControlText(mThresholdT, mOldThresholdTxt,
false);
992 UpdateControlText(mNoiseFloorT, mOldmNoiseFloorTxt,
false);
993 UpdateControlText(mParam1T, mOldParam1Txt,
true);
994 UpdateControlText(mParam2T, mOldParam2Txt,
true);
995 UpdateControlText(mRepeatsT, mOldRepeatsTxt,
false);
999 UpdateControl(
ID_Param1,
true,
XO(
"Distortion amount"));
1000 UpdateControl(
ID_Param2,
true,
XO(
"Harmonic brightness"));
1005 UpdateControlText(mThresholdT, mOldThresholdTxt,
false);
1006 UpdateControlText(mNoiseFloorT, mOldmNoiseFloorTxt,
false);
1007 UpdateControlText(mParam1T, mOldParam1Txt,
true);
1008 UpdateControlText(mParam2T, mOldParam2Txt,
true);
1009 UpdateControlText(mRepeatsT, mOldRepeatsTxt,
false);
1013 UpdateControl(
ID_Param1,
true,
XO(
"Distortion amount"));
1014 UpdateControl(
ID_Param2,
true,
XO(
"Output level"));
1019 UpdateControlText(mThresholdT, mOldThresholdTxt,
false);
1020 UpdateControlText(mNoiseFloorT, mOldmNoiseFloorTxt,
true);
1021 UpdateControlText(mParam1T, mOldParam1Txt,
true);
1022 UpdateControlText(mParam2T, mOldParam2Txt,
false);
1023 UpdateControlText(mRepeatsT, mOldRepeatsTxt,
true);
1027 UpdateControl(
ID_Param1,
true,
XO(
"Levelling fine adjustment"));
1029 UpdateControl(
ID_Repeats,
true,
XO(
"Degree of Levelling"));
1033 UpdateControlText(mThresholdT, mOldThresholdTxt,
false);
1034 UpdateControlText(mNoiseFloorT, mOldmNoiseFloorTxt,
false);
1035 UpdateControlText(mParam1T, mOldParam1Txt,
true);
1036 UpdateControlText(mParam2T, mOldParam2Txt,
false);
1037 UpdateControlText(mRepeatsT, mOldRepeatsTxt,
false);
1041 UpdateControl(
ID_Param1,
true,
XO(
"Distortion amount"));
1047 UpdateControlText(mThresholdT, mOldThresholdTxt,
true);
1048 UpdateControlText(mNoiseFloorT, mOldmNoiseFloorTxt,
false);
1049 UpdateControlText(mParam1T, mOldParam1Txt,
true);
1050 UpdateControlText(mParam2T, mOldParam2Txt,
true);
1051 UpdateControlText(mRepeatsT, mOldRepeatsTxt,
false);
1056 UpdateControl(
ID_Param2,
true,
XO(
"Residual level"));
1074 auto& ms = mSettings;
1076 auto suffix =
XO(
"(Not Used):");
1081 if (enabled) suffix =
XO(
"(-100 to 0 dB):");
1085 const double threshold =
DB_TO_LINEAR(ms.mThreshold_dB);
1089 mThresholdTxt->SetLabel(translated);
1090 mThresholdS->SetName(translated);
1091 mThresholdT->SetName(translated);
1092 mThresholdS->Enable(enabled);
1093 mThresholdT->Enable(enabled);
1098 if (enabled) suffix =
XO(
"(-80 to -20 dB):");
1102 mNoiseFloorTxt->SetLabel(translated);
1103 mNoiseFloorS->SetName(translated);
1104 mNoiseFloorT->SetName(translated);
1105 mNoiseFloorS->Enable(enabled);
1106 mNoiseFloorT->Enable(enabled);
1111 if (enabled) suffix =
XO(
"(0 to 100):");
1115 mParam1Txt->SetLabel(translated);
1116 mParam1S->SetName(translated);
1117 mParam1T->SetName(translated);
1118 mParam1S->Enable(enabled);
1119 mParam1T->Enable(enabled);
1124 if (enabled) suffix =
XO(
"(0 to 100):");
1128 mParam2Txt->SetLabel(translated);
1129 mParam2S->SetName(translated);
1130 mParam2T->SetName(translated);
1131 mParam2S->Enable(enabled);
1132 mParam2T->Enable(enabled);
1137 if (enabled) suffix =
XO(
"(0 to 5):");
1141 mRepeatsTxt->SetLabel(translated);
1142 mRepeatsS->SetName(translated);
1143 mRepeatsT->SetName(translated);
1144 mRepeatsS->Enable(enabled);
1145 mRepeatsT->Enable(enabled);
1150 mDCBlockCheckBox->SetValue(GetState().mbSavedFilterState);
1151 ms.mDCBlock = GetState().mbSavedFilterState;
1154 mDCBlockCheckBox->SetValue(
false);
1155 ms.mDCBlock =
false;
1158 mDCBlockCheckBox->Enable(enabled);
1169 if (textCtrl->GetValue().empty())
1170 textCtrl->SetValue(
string);
1172 string = textCtrl->GetValue();
1175 if (!textCtrl->GetValue().empty())
1176 string = textCtrl->GetValue();
1177 textCtrl->SetValue(
wxT(
""));
1190 HardClip(state, ms);
1193 SoftClip(state, ms);
1199 ExponentialTable(ms);
1202 LogarithmicTable(ms);
1208 EvenHarmonicTable(ms);
1220 HardLimiter(state, ms);
1238 double lowThresh = 1 - threshold;
1239 double highThresh = 1 + threshold;
1242 if (n < (
STEPS * lowThresh))
1243 mTable[n] = - threshold;
1244 else if (n > (
STEPS * highThresh))
1245 mTable[n] = threshold;
1247 mTable[n] = n/(double)
STEPS - 1;
1260 double threshold = 1 + thresholdLinear;
1261 double amount = std::pow(2.0, 7.0 * ms.
mParam1 / 100.0);
1262 double peak = LogCurve(thresholdLinear, 1.0, amount);
1264 mTable[
STEPS] = 0.0;
1268 if (n < (
STEPS * threshold))
1269 mTable[n] = n/(float)
STEPS - 1;
1271 mTable[n] = LogCurve(thresholdLinear, n/(
double)
STEPS - 1, amount);
1278 return threshold + ((std::exp(ratio * (threshold - value)) - 1) / -ratio);
1286 double linVal = n/(float)
STEPS;
1287 double scale = -1.0 / (1.0 - amount);
1288 double curve = std::exp((linVal - 1) * std::log(amount));
1289 mTable[n] = scale * (curve -1);
1297 double stepsize = 1.0 /
STEPS;
1308 mTable[n] = std::log(1 + (amount * linVal)) / std::log(1 + amount);
1317 int iter = std::floor(ms.
mParam1 / 20.0);
1318 double fractionalpart = (ms.
mParam1 / 20.0) - iter;
1319 double stepsize = 1.0 /
STEPS;
1324 for (
int i = 0; i < iter; i++) {
1325 mTable[n] = std::sin(mTable[n] *
M_PI_2);
1327 mTable[n] += ((std::sin(mTable[n] *
M_PI_2) - mTable[n]) * fractionalpart);
1338 gain = 1.0 / Cubic(ms,
std::min(amount, 1.0));
1340 double stepsize = amount /
STEPS;
1345 mTable[i] = (i / (double)
STEPS) - 1.0;
1350 mTable[i] = gain * Cubic(ms, x);
1351 for (
int j = 0; j < ms.
mRepeats; j++) {
1352 mTable[i] = gain * Cubic(ms, mTable[i] * amount);
1364 return x - (std::pow(x, 3.0) / 3.0);
1370 double amount = ms.
mParam1 / -100.0;
1372 double C = std::max(0.001, ms.
mParam2) / 10.0;
1374 double step = 1.0 /
STEPS;
1378 mTable[i] = ((1 + amount) * xval) -
1379 (xval * (amount / std::tanh(C)) * std::tanh(C * xval));
1386 int iter = std::floor(ms.
mParam1 / 20.0);
1387 double fractionalpart = (ms.
mParam1 / 20.0) - iter;
1388 double stepsize = 1.0 /
STEPS;
1389 double linVal = 0.0;
1393 for (
int i = 0; i < iter; i++) {
1394 mTable[n] = (1.0 + std::sin((mTable[n] *
M_PI) -
M_PI_2)) / 2.0;
1396 mTable[n] += (((1.0 + std::sin((mTable[n] *
M_PI) -
M_PI_2)) / 2.0) - mTable[n]) * fractionalpart;
1406 double fractionalPass = ms.
mParam1 / 100.0;
1408 const int numPoints = 6;
1409 const double gainFactors[numPoints] = { 0.80, 1.00, 1.20, 1.20, 1.00, 0.80 };
1410 double gainLimits[numPoints] = { 0.0001, 0.0, 0.1, 0.3, 0.5, 1.0 };
1411 double addOnValues[numPoints];
1413 gainLimits[1] = noiseFloor;
1426 addOnValues[0] = 0.0;
1427 for (
int i = 0; i < numPoints-1; i++) {
1428 addOnValues[i+1] = addOnValues[i] + (gainLimits[i] * (gainFactors[i] - gainFactors[1 + i]));
1436 mTable[n] = ((double) (n -
STEPS) / (double)
STEPS);
1437 for (
int j = 0; j < numPasses; j++) {
1439 int index = numPoints - 1;
1440 for (
int i = index; i >= 0 && mTable[n] < gainLimits[i]; i--) {
1444 mTable[n] = (mTable[n] * gainFactors[index]) + addOnValues[index];
1448 if (fractionalPass > 0.001) {
1449 int index = numPoints - 1;
1450 for (
int i = index; i >= 0 && mTable[n] < gainLimits[i]; i--) {
1453 mTable[n] += fractionalPass * ((mTable[n] * (gainFactors[index] - 1)) + addOnValues[index]);
1461 double amount = (ms.
mParam1 / 50.0) - 1;
1462 double stepsize = 1.0 /
STEPS;
1466 for (
int n = 0; n <=
STEPS; n++) {
1467 mTable[index] = n * stepsize;
1473 for (
int n = 1; n <=
STEPS; n++) {
1474 mTable[index] = n * stepsize * amount;
1494 for (
int n = 0; n <
STEPS; n++) {
1495 mTable[n] = -mTable[count];
1520 index = wxMax<int>(wxMin<int>(index, 2 *
STEPS - 1), 0);
1521 xOffset = ((1 + sample) *
STEPS) - index;
1522 xOffset = wxMin<double>(wxMax<double>(xOffset, 0.0), 1.0);
1525 out = mTable[index] + (mTable[index + 1] - mTable[index]) * xOffset;
1534 const unsigned int queueLength = std::floor(data.
samplerate / 20.0);
TranslatableString defaultLabel(int index)
EffectDistortionSettings params
static const struct @19 FactoryPresets[]
const TranslatableString name
std::optional< std::unique_ptr< EffectSettingsAccess::Message > > OptionalMessage
XXO("&Cut/Copy/Paste Toolbar")
std::vector< RegistryPath > RegistryPaths
TranslatableStrings Msgids(const EnumValueSymbol strings[], size_t nStrings)
Convenience function often useful when adding choice controls.
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)
RealtimeSince
In which versions of Audacity was an effect realtime capable?
A WaveShaper distortion effect.
static constexpr EffectParameter Threshold_dB
static constexpr EffectParameter Param2
std::shared_ptr< EffectInstance > MakeInstance() const override
Make an object maintaining short-term state of an Effect.
OptionalMessage DoLoadFactoryPreset(int id, EffectSettings &settings)
static const ComponentInterfaceSymbol Symbol
static constexpr EffectParameter Param1
virtual ~EffectDistortion()
static const EnumValueSymbol kTableTypeStrings[nTableTypes]
OptionalMessage LoadFactoryPreset(int id, EffectSettings &settings) const override
ComponentInterfaceSymbol GetSymbol() const override
static constexpr EffectParameter Repeats
static constexpr EffectParameter DCBlock
static constexpr EnumParameter TableTypeIndx
static constexpr EffectParameter NoiseFloor
RealtimeSince RealtimeSupport() const override
Since which version of Audacity has the effect supported realtime?
EffectType GetType() const override
Type determines how it behaves.
TranslatableString GetDescription() const override
const EffectParameterMethods & Parameters() const override
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.
ManualPageID ManualPage() const override
Name of a page in the Audacity alpha manual, default is empty.
RegistryPaths GetFactoryPresets() const override
Report names of factory presets.
std::queue< float > queuesamples
EffectSettingsAccess & mAccess
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.
void ModifySettings(Function &&function)
Do a correct read-modify-write of settings.
virtual const EffectSettings & Get()=0
static EffectDistortionSettings & 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.
TranslatableString & Join(TranslatableString arg, const wxString &separator={}) &
Append another translatable string.
wxString Translation() const
A Validator is an object which checks whether a wxVariant satisfies a certain criterion....
constexpr auto sampleRate
BuiltinEffectsModule::Registration< EffectDistortion > reg
__finl float_x4 __vecc sqrt(const float_x4 &a)
wxStaticText * mRepeatsTxt
virtual ~Editor()=default
void OnParam2Text(wxCommandEvent &evt)
bool ValidateUI() override
Get settings data from the panel; may make error dialogs and return false.
wxString mOldmNoiseFloorTxt
void UpdateControl(control id, bool enable, TranslatableString name)
Editor(const EffectUIServices &services, EffectDistortion::Instance &instance, EffectSettingsAccess &access, const EffectDistortionSettings &settings)
void OnRepeatsText(wxCommandEvent &evt)
void OnRepeatsSlider(wxCommandEvent &evt)
void OnTypeChoice(wxCommandEvent &evt)
wxStaticText * mThresholdTxt
void OnDCBlockCheckbox(wxCommandEvent &evt)
wxStaticText * mParam2Txt
EffectDistortionSettings mSettings
EffectDistortion::Instance & mInstance
bool UpdateUI() override
Update appearance of the panel for changes in settings.
void UpdateControlText(wxTextCtrl *textCtrl, wxString &string, bool enabled)
wxString mOldThresholdTxt
wxCheckBox * mDCBlockCheckBox
void OnNoiseFloorText(wxCommandEvent &evt)
wxWeakRef< wxWindow > mUIParent
void OnParam2Slider(wxCommandEvent &evt)
void OnThresholdText(wxCommandEvent &evt)
wxChoice * mTypeChoiceCtrl
void OnParam1Slider(wxCommandEvent &evt)
void OnParam1Text(wxCommandEvent &evt)
wxStaticText * mParam1Txt
void OnThresholdSlider(wxCommandEvent &evt)
void PopulateOrExchange(ShuttleGui &S)
wxTextCtrl * mNoiseFloorT
wxStaticText * mNoiseFloorTxt
void OnNoiseFloorSlider(wxCommandEvent &evt)
EffectDistortionState & GetState()
void Leveller(const EffectDistortionSettings &)
void LogarithmicTable(const EffectDistortionSettings &)
void InstanceInit(EffectDistortionState &data, EffectSettings &settings, float sampleRate)
void MakeTable(EffectDistortionState &state, const EffectDistortionSettings &ms)
size_t InstanceProcess(EffectSettings &settings, EffectDistortionState &data, const float *const *inBlock, float *const *outBlock, size_t blockLen)
void CubicTable(const EffectDistortionSettings &)
void HalfSinTable(const EffectDistortionSettings &)
void EvenHarmonicTable(const EffectDistortionSettings &)
void SineTable(const EffectDistortionSettings &)
double Cubic(const EffectDistortionSettings &, double x)
unsigned GetAudioOutCount() const override
How many output buffers to allocate at once.
Instance(const PerTrackEffect &effect)
EffectDistortionState mMaster
float LogCurve(double threshold, float value, double ratio)
bool RealtimeAddProcessor(EffectSettings &settings, EffectOutputs *pOutputs, unsigned numChannels, float sampleRate) override
float DCFilter(EffectDistortionState &data, float sample)
void Rectifier(const EffectDistortionSettings &)
unsigned GetAudioInCount() const override
How many input buffers to allocate at once.
bool ProcessInitialize(EffectSettings &settings, double sampleRate, ChannelNames chanMap) override
void SoftClip(EffectDistortionState &, const EffectDistortionSettings &)
bool RealtimeFinalize(EffectSettings &settings) noexcept override
size_t RealtimeProcess(size_t group, EffectSettings &settings, const float *const *inbuf, float *const *outbuf, size_t numSamples) override
std::vector< EffectDistortionState > mSlaves
void ExponentialTable(const EffectDistortionSettings &)
size_t ProcessBlock(EffectSettings &settings, const float *const *inBlock, float *const *outBlock, size_t blockLen) override
Called for destructive effect computation.
void HardClip(EffectDistortionState &, const EffectDistortionSettings &)
float WaveShaper(float sample, EffectDistortionSettings &ms)
bool RealtimeInitialize(EffectSettings &settings, double) override
void HardLimiter(EffectDistortionState &state, const EffectDistortionSettings &)
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.