Dear James, all,
your hint helped a lot, thanks, James!
Dario off-list pointed me into the right direction to use sample and hold, also
for fixing the (otherwise ongoing) computation.
here's a working example implementing a simple state machine that evaluates
only when triggered:
```
import("stdfaust.lib");
strictRising(x) = x > x';
// one-sample trigger (1) when signal passes 0 (from - to +), otherwise (0)
trig1_1(x) = strictRising(x > 0);
// pass new value when triggered, otherwise hold
latch(trig) = _ : select2(trig1_1(trig), _, _) ~ _;
triggerSignal = os.lf_squarewave(2000);
// of triggered, compute new value (set) of f
// initial state os always 0 or (0, 0) or ... or (0, 0, ...)
demand_1(f, tr) = f ~ par(i, outputs(f), latch(tr));
statemachine(state) = states : ba.selectn(ba.count(states), state) with {
states = (1, 3, 4, 8, 0, 2, 5, 7, 6);
};
process = demand_1(statemachine, triggerSignal);
```
this should also work with multi-dimensional states, i.e. list of states.
However, after reading this paper
https://hal.archives-ouvertes.fr/hal-02159011/document
(thanks for the pointer, sletz!)
I think that computation still happens for every sample, despite the input
value (i.e. previous state) not changing and thus the output also keeping at a
constant value.
Maybe an expert in faust optimisation could shed some light on this (and proof
me wrong?)
all the best
Till
--
Till Bovermann
https://tai-studio.org | http://lfsaw.de | https://www.instagram.com/_lfsaw/
> On 29. Jun 2020, at 11:35, James Mckernon <[email protected]> wrote:
>
> On 6/29/20, Till Bovermann <[email protected]> wrote:
>> Dear list,
>>
>> I wonder if anyone has a clue how to implement demand-rate in faust.
>
> Hi Till,
>
> Have you looked at latch and/or sAndH in basics.lib? They may be the
> closest thing to what you're looking for. Either using those functions
> directly or looking at their definition may help you.
>
> The key trick is to use a feedback loop (~) and a conditional
> (select2) to create behaviour along these lines: if trigger then
> output a value from a generator function; else output whatever value I
> output last time.
>
> But faust has a quirk in how it treats the unused branch of a
> conditional statement, if the branch has some kind of internal state:
> it evaluates them anyway in order to update the state. In other words,
> a counter (1, 2, 3...) latched to a trigger running every second
> sample (1, 0, 1, 0...) will output not 1, 1, 2, 2, 3, 3... but rather
> 1, 1, 3, 3, 5, 5... This may not be what you want in this case.
> Unfortunately, I don't believe there's a way to escape it.
>
> For what it's worth, I find this very frustrating and wish there were
> a way to defeat it.
_______________________________________________
Faudiostream-users mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/faudiostream-users