#include "rack.hpp" #include "dsp/digital.hpp" #include "dsp/ringbuffer.hpp" #include "PatternData.hpp" #include "Transport.hpp" #include "Auditioner.hpp" #include "../ValueChangeTrigger.hpp" namespace rack_plugin_rcm { struct PianoRollModule : rack::Module { enum ParamIds { RUN_BUTTON_PARAM, RESET_BUTTON_PARAM, NUM_PARAMS }; enum InputIds { CLOCK_INPUT, RUN_INPUT, RESET_INPUT, PATTERN_INPUT, RECORD_INPUT, VOCT_INPUT, GATE_INPUT, RETRIGGER_INPUT, VELOCITY_INPUT, NUM_INPUTS }; enum OutputIds { CLOCK_OUTPUT, RUN_OUTPUT, RESET_OUTPUT, PATTERN_OUTPUT, RECORD_OUTPUT, VOCT_OUTPUT, GATE_OUTPUT, RETRIGGER_OUTPUT, VELOCITY_OUTPUT, END_OF_PATTERN_OUTPUT, NUM_OUTPUTS }; enum LightIds { NUM_LIGHTS }; rack::SchmittTrigger clockInputTrigger; rack::SchmittTrigger resetInputTrigger; rack::SchmittTrigger runInputTrigger; rack::PulseGenerator retriggerOutputPulse; rack::PulseGenerator eopOutputPulse; rack::PulseGenerator gateOutputPulse; Auditioner auditioner; ValueChangeTrigger runInputActive; rack::RingBuffer clockBuffer; int clockDelay = 0; rack::SchmittTrigger recordingIn; rack::RingBuffer voctInBuffer; rack::RingBuffer gateInBuffer; rack::RingBuffer retriggerInBuffer; rack::RingBuffer velocityInBuffer; PatternData patternData; Transport transport; PianoRollModule(); void step() override; void onReset() override; json_t *toJson() override; void fromJson(json_t *rootJ) override; }; } // namespace rack_plugin_rcm