=============== Sample and Hold =============== **FAUST** Source: faust_tutorial2.pdf / 2.1 :: but = button("Hold!"); SH(trig,x) = (*(1 - trig) + x * trig) ~ _; process = SH(but); The imediate translation to **Stride** would be :: signal Output { rate: none } ( 1 - DigitalIn ) * Output + AudioIn * DigitalIn >> Output; and it would not work since ``DigitalIn`` is not an impulse at ``AudioRate``. When ``DigitalIn`` changes state from ``off`` to ``on``, ``Output`` will change its value at ``AudioRate`` until ``DigitalIn`` changes state from ``on`` to ``off`` and then the value will be held. This can be solved by generating a ``trigger`` using ``DigitalIn`` :: signal Output { rate: none } trigger Trigger {} DigitalIn >> Trigger; ( 1 - Trigger ) * Output + AudioIn * Trigger >> Output; Another way would be to create an impulse using ``DigitalIn``: :: signal Output { rate: none } signal State [2] { rate: AudioRate } signal Trigger { rate: AudioRate } DigitalIn >> State[1] >> FixedDelay ( samples: 1 ) >> State [2] ; State[1] - State[2] >> Compare ( value: 0 operator: 'Greater' ) >> Select ( whenOn: 1 whenOff: 0 ) >> Trigger; ( 1 - Trigger ) * Output + ( AudioIn * Trigger ) >> Output; Another way to do this would be by creating a reaction which gets triggered at the rising edge of ``DigitalIn``: :: signal Output { rate: none } reaction SH { output: Sample onExecution: Reset terminateWhen: Sampled internalBlocks: [ signal Sample { rate: none }, switch Sampled { default: off reset: Reset }, trigger Reset {} ] streams: [ AudioIn >> Sample; on >> Sampled; ] } DigitalIn >> SH () >> Output; The simple way to do it in **Stride** : :: signal Output { rate: none } AudioIn >> SampleHold ( event: DigitalIn ) >> Output;