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 <[email protected]
> <mailto:[email protected]>> 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
> [email protected]
> <mailto:[email protected]>
> 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
[email protected]
https://lists.sourceforge.net/lists/listinfo/faudiostream-users