#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(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