Quote:
Originally Posted by mrlimbic
Anyone know the maths to calculate a rolling value for the width of the stereo field?

Mmm. This could be one of those deceptively simple questions.
Do you mean RMS or DB or peak levels over time? It should be the same as what is used in DB level displays or compressors, just with the side being used.
vumeter has code to calculate DB over time. dynamics_meter contains code for 3 types of levels over time. Depends on how complex or "accurate" you need it.
Here is some basic code using a decay style level. Or, you can implement a window style level, which is just calculating the level of the average over a time period (window).
Code:
desc: MidSide Levels
@init
sc = 6 / log(2);
response = 0.5;
@sample
// Calculate the DB of mid/side
mid_db = max(log(abs(spl0 + spl1)) * sc, 80);
sid_db = max(log(abs(spl0  spl1)) * sc, 80);
// Or, calculate the abs level of mid/side
mid_le1 = abs(spl0 + spl1);
sid_le1 = abs(spl0  spl1);
// Or, calculate the sqrt of abs level of mid/side. (I think this might be RMS)
mid_le2 = sqrt(abs(spl0 + spl1));
sid_le2 = sqrt(abs(spl0  spl1));
// You can then use a response formular to soften the level changes.
// This is the same type of code used in a compressor.
mid_level += (mid_db  mid_level) * response;
sid_level += (sid_db  sid_level) * response;
@gfx
// Some code to display two DB bars. Needs to be adjusted for other level types.
gfx_r = gfx_g = gfx_b = gfx_a = 1;
gfx_x = 0; gfx_y = 10; gfx_rectto(80 + mid_level, gfx_y + 16);
gfx_x = 0; gfx_y = 40; gfx_rectto(80 + sid_level, gfx_y + 16);