This works - thanks Julius!

Next: integrated LUFS and gating... will look into it soon ;)

Cheers, Klaus



On 13.07.21 20:43, Julius Smith wrote:
> Hmmm, it looks like the attach is introducing a new instance of x.
> Maybe something like this will work:
>
> process(x,y) = x,y <: x, attach(y, (Lk2 : vbargraph("LUFS",-90,0))) : _,_;
>
> On Tue, Jul 13, 2021 at 6:14 AM Klaus Scheuermann <kla...@posteo.de
> <mailto:kla...@posteo.de>> wrote:
>
>     Hi Julius,
>
>     but this makes two (or n) meters, right?
>
>     I would like to attach the lufs meter (which only has one
>     hbargraph) to
>     a stereo signal and leave the stereo signal untouched.
>
>     Here is the working code for the stereo lufs meter, but it ends up
>     having 3 channels. If I terminate the last channel with (_,_,!) , the
>     meter is optimized out too. What I need is a function
>     Lufs_Meter_Stereo
>     that does nothing to the stereo sound, but only adds one meter (and
>     preferably takes no arguments): _,_ : Lufs_Meter_Stereo : _,_
>
>     import("stdfaust.lib");
>
>     // Highpass:
>     // At 48 kHz, this is the right highpass filter (maybe a Bessel or
>     Thiran filter?):
>     //A48kHz = ( /* 1.0, */ -1.99004745483398, 0.99007225036621);
>     //B48kHz = (1.0, -2.0, 1.0);
>     //highpass48kHz = fi.iir(B48kHz,A48kHz);
>     highpass = fi.highpass(2, 40); // Butterworth highpass: roll-off is a
>     little too sharp
>
>     // High Shelf:
>     boostDB = 4;
>     boostFreqHz = 1430; // a little too high - they should give us this!
>     highshelf = fi.high_shelf(boostDB, boostFreqHz); // Looks very close,
>     but 1 kHz gain has to be nailed
>
>     kfilter = highshelf : highpass;
>
>     // Power sum:
>     Tg = 0.4; // spec calls for 75% overlap of successive rectangular
>     windows - we're overlapping MUCH more (sliding window)
>     //zi = an.ms_envelope_rect(Tg); // mean square: average power =
>     energy/Tg = integral of squared signal / Tg
>
>     //envelope via lp by dario
>     lp1p(cf, x) = fi.pole(b, x * (1 - b)) with {
>         b = exp(-2 * ma.PI * cf / ma.SR);
>     };
>
>     zi_lp(x) = lp1p(1 / Tg, x * x);
>
>     // Gain vector Gv = (GL,GR,GC,GLs,GRs):
>     N = 5;
>     Gv = (1, 1, 1, 1.41, 1.41); // left GL(-30deg), right GR (30), center
>     GC(0), left surround GLs(-110), right surr. GRs(110)
>     G(i) = *(ba.take(i+1,Gv));
>     Lk(i) = kfilter : zi_lp : G(i); // one channel, before summing and
>     before taking dB and offsetting
>     LkDB(i) = Lk(i) : 10 * log10 : -(0.691); // Use this for a mono
>     input signal
>
>     // Five-channel surround input:
>     Lk5 = par(i,5,Lk(i)) :> 10 * log10 : -(0.691);
>     // stereo
>     Lk2 = Lk(0),Lk(2) :> 10 * log10 : -(0.691);
>
>     process(x,y) = x,y <: (_,_), attach(x, (Lk2 :
>     vbargraph("LUFS",-90,0)))
>     : _,_,_ ;
>
>
>
>
>
>     On 12.07.21 03:08, Julius Smith wrote:
>     > Hi Klaus,
>     >
>     > I sympathize!  Been there!
>     >
>     > There are various examples in demos.lib.   This seems to be
>     right, but
>     > let me know if not:
>     >
>     > import("stdfaust.lib");
>     >
>     > level_meter(chan) = abs : max(ma.EPSILON) : 20*log10 :
>     > hbargraph("Channel %chan [unit:dB]",-70,10);
>     > meter_lk(N) = si.bus(N) <: ro.interleave(N,N) :
>     > par(i,N,attach(level_meter(i+1)));
>     >
>     > // Test:
>     > sig(i) = 0.1 * no.noise;
>     > process = sig(1),sig(2) : meter_lk(2) : _,_;
>     >
>     > Where would be a good place for this in the Faust libraries or
>     examples?
>     >
>     > Cheers,
>     > Julius
>     >
>     >
>     > On Sun, Jul 11, 2021 at 10:23 AM Klaus Scheuermann
>     <kla...@posteo.de <mailto:kla...@posteo.de>
>     > <mailto:kla...@posteo.de <mailto:kla...@posteo.de>>> wrote:
>     >
>     >     Guys, I am biting my teeth out here, although it is probably
>     super
>     >     simple... (making a new thread, as the lufs-loudness-meter
>     is getting
>     >     quite full...)
>     >
>     >     I have a function Lk2 which has 2 inputs and one output. The
>     output does
>     >     not matter to me, but it contains a vbargraph meter.
>     >
>     >     How do I make a function meter_lk2 that has 2 inputs, 2
>     outputs and no
>     >     arguments, that attaches Lk2 to it only for metering,
>     passing through
>     >     the inputs to the outputs?
>     >
>     >     process = _,_ : meter_lk2 : _,_;
>     >
>     >     meter_lk2 = ???
>     >
>     >     (mono is easy, but stereo is killing me.)
>     >
>     >     Thanks,
>     >     Klaus
>     >
>     >
>     >     _______________________________________________
>     >     Faudiostream-users mailing list
>     >     Faudiostream-users@lists.sourceforge.net
>     <mailto:Faudiostream-users@lists.sourceforge.net>
>     >     <mailto:Faudiostream-users@lists.sourceforge.net
>     <mailto:Faudiostream-users@lists.sourceforge.net>>
>     >   
>      https://lists.sourceforge.net/lists/listinfo/faudiostream-users
>     <https://lists.sourceforge.net/lists/listinfo/faudiostream-users>
>     >   
>      <https://lists.sourceforge.net/lists/listinfo/faudiostream-users
>     <https://lists.sourceforge.net/lists/listinfo/faudiostream-users>>
>     >
>     >
>     >
>     > --
>     > "Anybody who knows all about nothing knows everything" --
>     Leonard Susskind
>
>
>
> -- 
> "Anybody who knows all about nothing knows everything" -- Leonard Susskind
_______________________________________________
Faudiostream-users mailing list
Faudiostream-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/faudiostream-users

Reply via email to