master_clock/include/Gate.h

85 lines
1.5 KiB
C++

// Gate.h
#ifndef Gate_h
#define Gate_h
#include "Output.h"
#include "Settings.h"
#include "globals.h"
#include <cstdint>
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