Hi Klaus,

Thanks for the example. If I understand correctly, I think you can
generalize:


gate_stereo(thresh,att,hold,rel,x,y) = ggm*x, ggm*y with {
ggm = gate_gain_mono(thresh,att,hold,rel,abs(x)+abs(y));
};


by the following definition:

gate_any(N,thresh,att,hold,rel) = B <: B, (B :> ggm <: B) : ro.interleave(N,
2) : par(i,N,*)
with {
B = si.bus(N);
ggm = gate_gain_mono(thresh,att,hold,rel);
};

process = gate_any(4);

Cheers,

Yann


Le mar. 27 juil. 2021 à 10:22, Klaus Scheuermann <kla...@posteo.de> a
écrit :

> Thanks Yann,
>
> I am learning, but still not succeeding...
>
> This is not my end-game, but maybe a good example that I can't solve...
>
> How would I make an N-channel (linked) gate out of this?
> gate_stereo(thresh,att,hold,rel,x,y) = ggm*x, ggm*y with {
> ggm = gate_gain_mono(thresh,att,hold,rel,abs(x)+abs(y));
> };
> gate_gain_mono(thresh,att,hold,rel,x) = x : extendedrawgate :
> an.amp_follower_ar(att,rel) with {
> extendedrawgate(x) = max(float(rawgatesig(x)),holdsig(x));
> rawgatesig(x) = inlevel(x) > ba.db2linear(thresh);
> minrate = min(att,rel);
> inlevel = an.amp_follower_ar(minrate,minrate);
> holdcounter(x) = (max(holdreset(x) * holdsamps,_) ~-(1));
> holdsig(x) = holdcounter(x) > 0;
> holdreset(x) = rawgatesig(x) < rawgatesig(x)'; // reset hold when raw
> gate falls
> holdsamps = int(hold*ma.SR);
> };
>
> Thanks,
> Klaus
>
>
>
>
> On 26.07.21 16:27, Yann Orlarey wrote:
>
> Hi Klaus,
>
> You can give names to the input signals as in your example, but you don't
> have to. In other words, instead of writing:
>
> process(x) = f(g(x));
>
> you can use a more idiomatic style, and write:
>
> process = g : f;
>
> Faust is inspired by Moses Schönfinkel's combinatory logic (1924) and John
> Backus' FP (1977). The idea of Schönfinkel was to eliminate the need for
> variables in mathematical logic. In functional programming, this style is
> known as "point-free" or "tacit" programming.
>
> At first sight, it seems complicated to do without variables. But a
> variable is just one way (among others) to move a value to its point of
> use. In Faust, you can use the `_` and `!` primitives, as well as the five
> operations of the block diagram algebra (or the route{} primitive) to
> create complex routing to move signals to their point of use.
>
> The advantage of point-free expressions is that they are more modular and
> often easier to generalize. Let say you want to write a
> quadriphonic amplifier. You can write:
>
> amp4(v,x1,x2,x3,x4) = v*x1, v*x2, v*x3, v*x4;
>
> but it is better to write:
>
> amp4(v) = *(v), *(v), *(v), *(v);
>
> or even better to write:
>
> amp4(v) =  par(c,4,*(v));
>
> This is now easy to generalize to a variable number N of channels:
>
> anyamp(N,v) = par(c,N,*(v));
>
> (note: by convention, we use capital letters for parameters that need to
> be known at compile-time, here N)
>
> You can now specialize this general definition, as in:
>
> amp4 = anyamp(4);
> amp8 = anyamp(8);
>
> So much for the principle, on an extremely simple example. What you are
> trying to do is probably more complicated. Don't hesitate to post a little
> diagram if you need help...
>
> Cheers,
>
>
> Yann
>
>
> Le lun. 26 juil. 2021 à 10:23, Klaus Scheuermann <kla...@posteo.de> a
> écrit :
>
>> Hi All,
>>
>> so for stereo, I have
>> process(x1,x2) = x1,x2;
>>
>> How would I use 'par' in 'process' for N-channel operation?
>>
>> (I need the inputs x1, x2, xN later in a function.)
>>
>> Maybe a list with N entries?
>>
>> Thanks, Klaus
>>
>>
>> _______________________________________________
>> Faudiostream-users mailing list
>> Faudiostream-users@lists.sourceforge.net
>> https://lists.sourceforge.net/lists/listinfo/faudiostream-users
>>
>
_______________________________________________
Faudiostream-users mailing list
Faudiostream-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/faudiostream-users

Reply via email to