diff --git a/DSP.md b/DSP.md index 11112af..1f67229 100644 --- a/DSP.md +++ b/DSP.md @@ -122,10 +122,10 @@ You can combine the naive and FFT methods into a hybrid approach with the [overl #### IIR filters -An infinite impulse response (IIR) filter is a general rational transfer function. By multiplying the denominator of the rational $H(z)$ definition above on both sides and applying it to an input and output signal, +An infinite impulse response (IIR) filter is a general rational transfer function. By multiplying the denominator of the rational $H(z)$ definition above on both sides and applying it to an input and output signal, we obtain $$\sum_{m=0}^M a_m y_{k-m} = \sum_{n=0}^N b_n x_{k-n}$$ Usually $a_0$ is normalized to 1, and $y_k$ can be written explicitly. -$$y_k = \sum_{n=0}^N b_n x_{k-n} - \sum_{m=1} a_m y_{k-m}$$ +$$y_k = \sum_{n=0}^N b_n x_{k-n} - \sum_{m=1}^M a_m y_{k-m}$$ For $N, M = 2$, this is a [biquad filter](https://en.wikipedia.org/wiki/Digital_biquad_filter), a very fast, numerically stable (assuming the transfer function itself is mathematical stable), and reasonably good sounding filter. diff --git a/VoltageStandards.md b/VoltageStandards.md index 095a3b9..6a74599 100644 --- a/VoltageStandards.md +++ b/VoltageStandards.md @@ -20,17 +20,18 @@ It is much better to allow voltages outside this range rather than use hard clip If your module is capable of applying >1x gain to an input, it is a good idea to saturate the output. -### Triggers +### Triggers and gates In Eurorack, many modules are triggered by reaching a particular rising slope threshold. -However, because of the [Gibbs phenomenon](https://en.wikipedia.org/wiki/Gibbs_phenomenon), a digital emulation will falsely retrigger many times if the trigger source is bandlimited. +However, because of the [Gibbs phenomenon](https://en.wikipedia.org/wiki/Gibbs_phenomenon), a digital emulation will falsely retrigger many times if the trigger source is bandlimited (e.g. by using a virtual VCO square wave as a trigger input or a hardware trigger through an audio interface.) -Thus, trigger inputs in Rack should use `SchmittTrigger` from `digital.hpp` with a low threshold of about **0.1V** and a high threshold of around **1 to 2V**. -For example, Audible Instruments modules are triggered once the input reaches 1.7V and can only be retriggered after the signal drops to or below 0V. -Rack plugins can implement this with `schmittTrigger.process(rescale(x, 0.1f, 2.f, 0.f, 1.f))` +Thus, trigger inputs in Rack a [Schmitt trigger](https://en.wikipedia.org/wiki/Schmitt_trigger) with a low threshold of about **0.1V** and a high threshold of around **1 to 2V**. +Rack plugins can implement this using `SchmittTrigger` from `digital.hpp` with `schmittTrigger.process(rescale(x, 0.1f, 2.f, 0.f, 1.f))` -Trigger sources should produce **5 to 10V** with a duration of 1 millisecond. -An easy way to do this is to use `PulseGenerator` from `digital.hpp`. +Trigger sources should produce **10V** with a duration of 1 millisecond. +An easy way to hold a trigger for this duration is to use `PulseGenerator` from `digital.hpp` with `pulseGenerator.trigger(1e-3f)`. + +Gates should produce **10V** when active. ### Pitch