W3C home > Mailing lists > Public > public-audio@w3.org > July to September 2014

Re: Making a VU meter

From: Marcus Geelnard <mage@opera.com>
Date: Mon, 18 Aug 2014 09:14:42 +0200
Message-ID: <53F1A7E2.2090705@opera.com>
To: adelespinasse@gmail.com, public-audio@w3.org
Hi Alan,

In SoundBox [1] I use a fairly simple piece of JavaScript to calculate 
VU levels:

https://gitorious.org/soundbox/soundbox/source/908435fc1e10178398a3d4965c910ce2483c68c6:gui.js#L2024-2069

In this case, I'm using 1000 samples of sound data (and I assume that 
we're using 44100 Hz and 60 FPS). I'm not actually using WebAudio, but 
you should be able to do the same thing in a ScriptProcessorNode or 
using a RealtimeAnalyzerNode.

Regards,

   Marcus


[1] http://sb.bitsnbites.eu


2014-08-13 02:02, Alan deLespinasse skrev:
> I'm asking this, not to find out if there's a better way, but to 
> stimulate discussion of new API features that would make it easier and 
> more efficient. (Though if you know of a better way under the current 
> spec, I'd be glad to hear it.)
>
> In my case, I'm interested in implementing an on-screen VU meter that 
> "looks right" to an average user. It doesn't need to be mathematically 
> correct in any way.
>
> The most obvious way is to use a ScriptProcessorNode to compute a 
> sum-of-squares of each successive buffer, and scale the result 
> appropriately. Optional improvements would be to apply a filter first 
> (remove DC, give more weight to the more audible frequencies) and to 
> apply a window function to each buffer.
>
> I don't want to do that because of the inefficiency of 
> ScriptProcessorNode. So here's what I'm doing instead:
>
> I square the signal by feeding it to a gain node and also to the gain 
> node's gain parameter. Then I lowpass filter it with a biquad filter. 
> Then I use a ScriptProcessorNode to grab just one sample from it each 
> time I need a value. (Maybe using an AnalyserNode to get time domain 
> data would be better, though I think how that works may be 
> underspecified.)
>
> Obviously it's not optimal, but it seems to work pretty well. I 
> probably should filter the signal a bit first, but I haven't bothered.
>
> A slightly different problem would be if you wanted a real 
> peak-to-peak meter, so the user would know how close the signal was to 
> clipping. I think the only way to do that currently would be to do it 
> all in a ScriptProcessorNode.
>
> I expect both will be needed pretty frequently in web audio apps. So 
> should there be a special feature for this? Or more general-purpose 
> features that make them easier to implement? Or am I missing an 
> already-existing way?
>
> One general-purpose feature that would make it relatively easy would 
> be if Float32Array had vector operations like "sum of squares" and 
> "find maximum/minimum value". I'm sort of surprised that it doesn't.


-- 
Marcus Geelnard
Opera Software
Received on Monday, 18 August 2014 07:15:45 UTC

This archive was generated by hypermail 2.3.1 : Tuesday, 6 January 2015 21:50:14 UTC