Previous topic

Counter

Next topic

Chuck Examples

This Page

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;