yaw-audio/src/yaw-tab/dsp.cpp

136 lines
2.9 KiB
C++

#include "DistrhoPlugin.hpp"
START_NAMESPACE_DISTRHO
class TabPlugin : public Plugin
{
public:
TabPlugin()
: Plugin(kParameterCount, 0, 0),
sampleRate(getSampleRate())
{
// clear all parameters
std::memset(fParameters, 0, sizeof(float) * kParameterCount);
}
protected:
const char* getLabel() const override { return "yaw-tab"; }
const char* getDescription() const override { return "Drawing tablet synth UI"; }
const char* getMaker() const override { return "yaw-audio"; }
const char* getHomePage() const override { return "https://yaw.man/plugins/yaw-tab"; }
const char* getLicense() const override { return "ISC"; }
uint32_t getVersion() const override { return d_version(1, 0, 0); }
int64_t getUniqueId() const override { return d_cconst('y', 'w', 't', 'b'); }
void initParameter(uint32_t index, Parameter& parameter) override
{
parameter.hints = kParameterIsAutomable;
parameter.ranges.def = 0.0f;
parameter.ranges.min = 0.0f;
parameter.ranges.max = 1.0f;
switch (index)
{
case ktpax:
parameter.name = "x";
parameter.symbol = "x";
break;
case ktpay:
parameter.name = "y";
parameter.symbol = "y";
break;
case ktpaz:
parameter.name = "z";
parameter.symbol = "z";
break;
case ktpap:
parameter.name = "p";
parameter.symbol = "p";
break;
case kParameterButtonA:
parameter.name = "Button A";
parameter.symbol = "A";
parameter.hints |= kParameterIsBoolean;
break;
case kParameterButtonB:
parameter.name = "Button B";
parameter.symbol = "B";
parameter.hints |= kParameterIsBoolean;
break;
case kParameterTime:
parameter.name = "t";
parameter.symbol = "t";
parameter.hints = kParameterIsOutput;
break;
}
}
void sampleRateChanged(double newRate) override
{
sampleRate = newRate;
}
float getParameterValue(uint32_t index) const override
{
return fParameters[index];
}
void setParameterValue(uint32_t idx, float val) override
{
fParameters[idx] = val;
switch (idx) {
case ktpax:
period = 0.02f * val * static_cast<float>(sampleRate);
break;
case ktpay:
break;
case ktpaz:
break;
case ktpap:
volume = val;
break;
case kParameterButtonA:
break;
case kParameterButtonB:
break;
}
}
void run(const float** inputs, float** outputs, uint32_t frames) override
{
for (uint32_t i = 0; i < frames; ++i) {
counter++;
if (counter > period) {
outputs[0][i] = outputs[1][i] = volume;
counter = 0;
}
else {
outputs[0][i] = outputs[1][i] = 0.0f;
}
}
parity = !parity;
fParameters[kParameterTime] += parity ? 1 : -1;
}
private:
float fParameters[kParameterCount];
float period = 0.f;
float counter = 0.f;
float volume = 0.f;
double sampleRate;
bool parity = false;
DISTRHO_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(TabPlugin)
};
Plugin* createPlugin()
{
return new TabPlugin();
}
END_NAMESPACE_DISTRHO