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>> 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>
>     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


_______________________________________________
Faudiostream-users mailing list
Faudiostream-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/faudiostream-users

Reply via email to