85 lines
1.5 KiB
C++
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
|