SquidgeDSP/plugins/SquidgeDistortion/SquidgeDistortion.cpp

145 lines
4.3 KiB
C++
Raw Normal View History

#include "DistrhoDetails.hpp"
2026-08-02 05:37:06 +01:00
#include "DistrhoPlugin.hpp"
#include "DistrhoPluginInfo.h"
#include <cmath>
2026-08-02 20:14:51 +01:00
#include "../../core/Clipper.hpp"
#include "../../core/Gain.hpp"
#include "../../core/Mixer.hpp"
2026-08-02 20:14:51 +01:00
2026-08-02 05:37:06 +01:00
START_NAMESPACE_DISTRHO
const int BUFFER_SIZE = 16384;
2026-08-05 13:46:12 +01:00
struct AudioBuffers {
float clippedL[BUFFER_SIZE];
float clippedR[BUFFER_SIZE];
float lpL[BUFFER_SIZE];
float lpR[BUFFER_SIZE];
};
2026-08-02 05:37:06 +01:00
class SquidgeDistortion : public Plugin {
2026-08-02 20:14:51 +01:00
2026-08-02 05:37:06 +01:00
public:
2026-08-04 05:15:46 +01:00
enum MixerChannels { kChannelDry, kChannelWet, kChannelCount };
2026-08-02 20:14:51 +01:00
enum Parameters {
kParamGain,
2026-08-02 22:58:56 +01:00
kParamClipMode,
kParamMixVolume,
2026-08-02 20:14:51 +01:00
kParameterCount // must be last
};
SquidgeDistortion()
: Plugin(kParameterCount, 0, 0), gain_(2.0f), mixer_(1.0f) {
mixer_.setInputGain(kChannelDry, 0.0f);
mixer_.setInputGain(kChannelWet, 1.0f);
}
2026-08-02 05:37:06 +01:00
protected:
const char *getLabel() const override { return "SquidgeDistortion"; }
const char *getDescription() const override {
return "Simple distortion plugin.";
}
const char *getMaker() const override { return "SquidgeSoft"; }
const char *getLicense() const override { return "GPL3"; }
uint32_t getVersion() const override { return d_version(0, 1, 0); }
int64_t getUniqueId() const override { return d_cconst('S', 'Q', 'D', 'T'); }
2026-08-02 05:37:06 +01:00
2026-08-02 20:14:51 +01:00
void initParameter(uint32_t index, Parameter &parameter) override {
switch (index) {
case kParamGain:
parameter.name = "Gain";
parameter.symbol = "gain";
parameter.ranges.min = 1.0f;
parameter.ranges.def = 2.0f;
parameter.ranges.max = 10.0f;
parameter.hints = kParameterIsAutomatable;
2026-08-02 22:58:56 +01:00
break;
case kParamClipMode:
parameter.name = "Clip Mode";
parameter.symbol = "clipmode";
parameter.ranges.min = 0.0f;
parameter.ranges.def = 0.0f;
parameter.ranges.max = Clipper::kClipperModeCount - 1;
parameter.hints = kParameterIsAutomatable | kParameterIsInteger;
parameter.enumValues.count = Clipper::kClipperModeCount;
parameter.enumValues.restrictedMode = true;
static const ParameterEnumerationValue
sClipModes[Clipper::kClipperModeCount] = {
{0.0f, "Soft"}, {1.0f, "Hard"}, {2.0f, "Fold"}};
parameter.enumValues.values =
const_cast<ParameterEnumerationValue *>(sClipModes);
2026-08-02 20:14:51 +01:00
break;
case kParamMixVolume:
parameter.name = "Dry/Wet";
parameter.symbol = "drywetvolume";
parameter.ranges.min = 0.0f;
parameter.ranges.def = 1.0f;
parameter.ranges.max = 1.0f;
parameter.hints = kParameterIsAutomatable;
break;
2026-08-02 20:14:51 +01:00
}
}
float getParameterValue(uint32_t index) const override {
switch (index) {
case kParamGain:
return gain_.getGain();
2026-08-02 22:58:56 +01:00
case kParamClipMode:
return (float)clipper_.getMode();
case kParamMixVolume:
return mixer_.getInputGain(kChannelWet);
2026-08-02 20:14:51 +01:00
}
return 0.0f;
}
void setParameterValue(uint32_t index, float value) override {
switch (index) {
case kParamGain:
gain_.setGain(value);
break;
2026-08-02 22:58:56 +01:00
case kParamClipMode:
value = std::fmin(std::fmax(value, 0.0f),
static_cast<float>(Clipper::kClipperModeCount - 1));
clipper_.setMode(static_cast<Clipper::ClipperMode>(std::lround(value)));
2026-08-02 22:58:56 +01:00
break;
case kParamMixVolume:
mixer_.setInputGain(kChannelWet, value);
mixer_.setInputGain(kChannelDry, 1.0f - value);
break;
2026-08-02 20:14:51 +01:00
}
}
void run(const float **inputs, float **outputs, uint32_t frames) override {
if (frames > BUFFER_SIZE) {
for (uint32_t i = 0; i < frames; ++i) {
outputs[0][i] = inputs[0][i];
outputs[1][i] = inputs[1][i];
}
return;
}
2026-08-05 13:46:12 +01:00
gain_.processStereo(inputs[0], inputs[1], buffers_.clippedL,
buffers_.clippedR, frames);
clipper_.processStereo(buffers_.clippedL, buffers_.clippedR,
buffers_.clippedL, buffers_.clippedR, frames);
const float *inputsL[2] = {inputs[0], buffers_.clippedL};
const float *inputsR[2] = {inputs[1], buffers_.clippedR};
mixer_.processStereo(inputsL, inputsR, outputs[0], outputs[1], frames);
2026-08-02 20:14:51 +01:00
}
2026-08-02 05:37:06 +01:00
private:
2026-08-02 20:14:51 +01:00
Gain gain_;
Clipper clipper_;
Mixer<2> mixer_;
2026-08-05 13:46:12 +01:00
AudioBuffers buffers_;
2026-08-02 05:37:06 +01:00
DISTRHO_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(SquidgeDistortion);
};
Plugin *createPlugin() { return new SquidgeDistortion(); }
END_NAMESPACE_DISTRHO