Browse Source

Remove low and high thresholds from SchmittTrigger, use 0 and 1 as fixed

defaults
tags/v0.6.0
Andrew Belt 7 years ago
parent
commit
bd39bbb34c
1 changed files with 20 additions and 16 deletions
  1. +20
    -16
      include/dsp/digital.hpp

+ 20
- 16
include/dsp/digital.hpp View File

@@ -6,35 +6,39 @@
namespace rack {


/** Turns high when value reaches the high threshold, turns low when value reaches the low threshold */
/** Turns high when value reaches 1, turns low when value reaches 0 */
struct SchmittTrigger {
// UNKNOWN is used to represent a stable state when the previous state is not yet set
enum {UNKNOWN, LOW, HIGH} state = UNKNOWN;
float low = 0.0;
float high = 1.0;
void setThresholds(float low, float high) {
this->low = low;
this->high = high;
}
/** Returns true if triggered */
enum State {
UNKNOWN,
LOW,
HIGH
};
State state = UNKNOWN;
/** Updates the state of the Schmitt Trigger given a value.
Returns true if triggered, i.e. the value increases from 0 to 1.
If different trigger thresholds are needed, use
process(rescale(in, low, high, 0.f, 1.f))
for example.
*/
bool process(float in) {
switch (state) {
case LOW:
if (in >= high) {
if (in >= 1.f) {
state = HIGH;
return true;
}
break;
case HIGH:
if (in <= low) {
if (in <= 0.f) {
state = LOW;
}
break;
default:
if (in >= high) {
if (in >= 1.f) {
state = HIGH;
}
else if (in <= low) {
else if (in <= 0.f) {
state = LOW;
}
break;
@@ -52,8 +56,8 @@ struct SchmittTrigger {

/** When triggered, holds a high value for a specified time before going low again */
struct PulseGenerator {
float time = 0.0;
float pulseTime = 0.0;
float time = 0.f;
float pulseTime = 0.f;
bool process(float deltaTime) {
time += deltaTime;
return time < pulseTime;
@@ -61,7 +65,7 @@ struct PulseGenerator {
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) {
time = 0.0;
time = 0.f;
this->pulseTime = pulseTime;
}
}


Loading…
Cancel
Save