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;