#include "common.hpp" #include #include #include #include "rntSequencer.hpp" namespace rack_plugin_TheXOR { //////////////////// // module widgets //////////////////// struct Renato; struct RenatoWidget : SequencerWidget { public: void onMenu(int action); RenatoWidget(Renato * module); private: enum MENUACTIONS { RANDOMIZE_PITCH, RANDOMIZE_GATEX, RANDOMIZE_GATEY, RANDOMIZE_ACCESS }; Menu *addContextMenu(Menu *menu) override; }; struct Renato : Module { enum ParamIds { COUNTMODE_X, COUNTMODE_Y, SEEKSLEEP, ACCESS_1, GATEX_1 = ACCESS_1 + 16, GATEY_1 = GATEX_1 + 16, VOLTAGE_1 = GATEY_1 + 16, NUM_PARAMS = VOLTAGE_1 + 16 }; enum InputIds { XCLK, YCLK, RESET, ACCESS_IN1, GATEX_IN1 = ACCESS_IN1 + 16, GATEY_IN1 = GATEX_IN1 + 16, NUM_INPUTS = GATEY_IN1+16 }; enum OutputIds { CV, XGATE, YGATE, CV_OUTSTEP1, NUM_OUTPUTS = CV_OUTSTEP1+16 }; enum LightIds { LED_GATEX, LED_GATEY, LED_1, NUM_LIGHTS = LED_1 + 16 }; Renato() : Module(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS) { #ifdef LAUNCHPAD drv = new LaunchpadBindingDriver(this, Scene3, 2); drv->SetAutoPageKey(LaunchpadKey::SESSION, 0); drv->SetAutoPageKey(LaunchpadKey::NOTE, 1); #endif #ifdef OSCTEST_MODULE oscDrv = new OSCDriver(this, 3); #endif on_loaded(); } #ifdef DIGITAL_EXT ~Renato() { #if defined(LAUNCHPAD) delete drv; #endif #if defined(OSCTEST_MODULE) delete oscDrv; #endif } #endif void step() override; void reset() override { load(); } void fromJson(json_t *root) override { Module::fromJson(root); on_loaded(); } json_t *toJson() override { json_t *rootJ = json_object(); return rootJ; } bool _accessX(int p) { return _access(xy(p, seqY.Position())); } bool _accessY(int p) { return _access(xy(seqX.Position(), p)); } #ifdef DIGITAL_EXT float connected; #endif #ifdef LAUNCHPAD LaunchpadBindingDriver *drv; #endif #if defined(OSCTEST_MODULE) OSCDriver *oscDrv; #endif private: float getStatus(int pid, int iid) { return inputs[iid].normalize(0.0) + params[pid].value; } private: SchmittTrigger resetTrigger; void on_loaded(); void load(); void led(int n) { for(int k = 0; k < 16; k++) lights[LED_1 + k].value = k == n ? 10.0 : 0.0; } int xy(int x, int y) { return 4 * y + x; } bool _access(int n) { return getStatus(ACCESS_1 + n, ACCESS_IN1 + n) > 0; } bool _gateX(int n) { return getStatus(GATEX_1 + n, GATEX_IN1 + n) > 0; } bool _gateY(int n) { return getStatus(GATEY_1 + n, GATEY_IN1 + n) > 0; } rntSequencer seqX; rntSequencer seqY; }; } // namespace rack_plugin_TheXOR