| @@ -6,7 +6,7 @@ | |||||
| namespace rack { | namespace rack { | ||||
| /** Turns high when value reaches 1, turns low when value reaches 0 */ | |||||
| /** Turns HIGH when value reaches 1.f, turns LOW when value reaches 0.f. */ | |||||
| struct SchmittTrigger { | struct SchmittTrigger { | ||||
| // UNKNOWN is used to represent a stable state when the previous state is not yet set | // UNKNOWN is used to represent a stable state when the previous state is not yet set | ||||
| enum State { | enum State { | ||||
| @@ -14,7 +14,14 @@ struct SchmittTrigger { | |||||
| LOW, | LOW, | ||||
| HIGH | HIGH | ||||
| }; | }; | ||||
| State state = UNKNOWN; | |||||
| State state; | |||||
| SchmittTrigger() { | |||||
| reset(); | |||||
| } | |||||
| void reset() { | |||||
| state = UNKNOWN; | |||||
| } | |||||
| /** Updates the state of the Schmitt Trigger given a value. | /** Updates the state of the Schmitt Trigger given a value. | ||||
| Returns true if triggered, i.e. the value increases from 0 to 1. | Returns true if triggered, i.e. the value increases from 0 to 1. | ||||
| If different trigger thresholds are needed, use | If different trigger thresholds are needed, use | ||||
| @@ -48,28 +55,39 @@ struct SchmittTrigger { | |||||
| bool isHigh() { | bool isHigh() { | ||||
| return state == HIGH; | return state == HIGH; | ||||
| } | } | ||||
| void reset() { | |||||
| state = UNKNOWN; | |||||
| } | |||||
| }; | }; | ||||
| /** When triggered, holds a high value for a specified time before going low again */ | /** When triggered, holds a high value for a specified time before going low again */ | ||||
| struct PulseGenerator { | |||||
| float time = 0.f; | |||||
| float pulseTime = 0.f; | |||||
| struct TriggerGenerator { | |||||
| float time; | |||||
| float triggerDuration; | |||||
| TriggerGenerator() { | |||||
| reset(); | |||||
| } | |||||
| /** Immediately resets the state to LOW */ | |||||
| void reset() { | |||||
| time = 0.f; | |||||
| triggerDuration = 0.f; | |||||
| } | |||||
| /** Advances the state by `deltaTime`. Returns whether the pulse is in the HIGH state. */ | |||||
| bool process(float deltaTime) { | bool process(float deltaTime) { | ||||
| time += deltaTime; | time += deltaTime; | ||||
| return time < pulseTime; | |||||
| return time < triggerDuration; | |||||
| } | } | ||||
| void trigger(float pulseTime) { | |||||
| // Keep the previous pulseTime if the existing pulse would be held longer than the currently requested one. | |||||
| if (time + pulseTime >= this->pulseTime) { | |||||
| /** Begins a trigger with the given `triggerDuration`. */ | |||||
| void trigger(float triggerDuration) { | |||||
| // Keep the previous triggerDuration if the existing pulse would be held longer than the currently requested one. | |||||
| if (time + triggerDuration >= this->triggerDuration) { | |||||
| time = 0.f; | time = 0.f; | ||||
| this->pulseTime = pulseTime; | |||||
| this->triggerDuration = triggerDuration; | |||||
| } | } | ||||
| } | } | ||||
| }; | }; | ||||
| /** Deprecated name for TriggerGenerator */ | |||||
| typedef TriggerGenerator PulseGenerator; | |||||
| } // namespace rack | } // namespace rack | ||||