// Gate.h #ifndef Gate_h #define Gate_h #include "Output.h" #include "Settings.h" #include "globals.h" #include struct GateSettings { uint32_t dur; uint32_t len; uint16_t modifier; int8_t modifierSelectionIndex; uint8_t divideMode; uint8_t width; uint8_t p; uint8_t level; uint8_t shape; }; class Gate : public Output { private: float currentRandomVal; uint32_t len; uint64_t startTimeUs; uint32_t pulseDurationUs; public: uint32_t dur; Gate(uint8_t pin, uint8_t idx, uint8_t slotIdx1, uint8_t slotIdx2); uint8_t modDest1; uint8_t modDest2; uint8_t level; float levelMod = 0.0f; uint8_t width; float widthMod = 0.0f; uint8_t p; float pMod = 0.0f; uint8_t swing = 50; float swingMod = 0.0f; void resetMods() { levelMod = 0.0f; pMod = 0.0f; widthMod = 0.0f; swingMod = 0.0f; } float lastOutVal = 0.0f; uint32_t triggerCount; uint32_t scheduledTick; uint32_t lastTriggerTick = 0xFFFFFFFF; WaveShape shape = SQUARE; uint32_t startTick = 0; uint32_t pulseWidthTicks = 0; bool sticky = false; int8_t modifierSelectionIndex; uint8_t divideMode; uint16_t modifier; uint16_t tickInterval; void turnOn() override; void update(); void turnOff() override; void calculatePulseWidth(); void setupPatches(); void writeAnalog(uint16_t val); void setLen(uint32_t currentPeriod); void setDiv(uint8_t modifier_selection_index); void setWidth(uint16_t newWidth); void pack(OutputConfig &cfg); void unpack(const OutputConfig &cfg); }; #endif