<HTML><HEAD></HEAD>
<BODY>
<DIV dir=ltr id=idOWAReplyText93336>
<DIV dir=ltr><FONT size=2>As an aside to Chris McCormick's comments,&nbsp;I wonder if it might also be useful/possible/appropriate&nbsp;(or not) to&nbsp;provide access to&nbsp;media data&nbsp;in&nbsp;the way that&nbsp;the&nbsp;ActionScript computeSpectrum function does:&nbsp;</FONT></DIV>
<DIV dir=ltr><FONT size=2></FONT>&nbsp;</DIV>
<DIV dir=ltr><A href="http://livedocs.adobe.com/flash/9.0/ActionScriptLangRefV3/flash/media/SoundMixer.html#computeSpectrum%28%29" target=_blank><FONT size=2>http://livedocs.adobe.com/flash/9.0/ActionScriptLangRefV3/flash/media/SoundMixer.html#computeSpectrum%28%29</FONT></A></DIV>
<DIV dir=ltr><FONT size=2></FONT>&nbsp;</DIV>
<DIV dir=ltr><FONT size=2>Sample visualization using Canvas with computeSpectrum: </FONT><A href="http://www2.nihilogic.dk/labs/canvas_music_visualization/" target=_blank><FONT size=2>http://www2.nihilogic.dk/labs/canvas_music_visualization/</FONT></A></DIV>
<DIV dir=ltr><FONT size=2></FONT>&nbsp;</DIV>
<DIV dir=ltr><FONT size=2>Sam Dutton</FONT></DIV>
<DIV dir=ltr><FONT size=2></FONT>&nbsp;</DIV>
<DIV dir=ltr><FONT size=2>----------------------------------------------------------------------<BR><BR>Message: 1<BR>Date: Sun, 9 Aug 2009 11:16:01 +1000<BR>From: Silvia Pfeiffer &lt;silviapfeiffer1@gmail.com&gt;<BR>Subject: Re: [whatwg] Codecs for &lt;audio&gt; and &lt;video&gt;<BR>To: Chris McCormick &lt;chris@mccormick.cx&gt;<BR>Cc: whatwg@lists.whatwg.org<BR>Message-ID:<BR>&lt;2c0e02830908081816v74711d64ya72c8cc11550baa4@mail.gmail.com&gt;<BR>Content-Type: text/plain; charset=ISO-8859-1<BR><BR>On Sun, Aug 9, 2009 at 3:15 AM, Chris McCormick&lt;chris@mccormick.cx&gt; wrote:<BR>&gt; On Wed, Jul 08, 2009 at 09:24:42AM -0700, Charles Pritchard wrote:<BR>&gt;&gt; There are two use cases that I think are important: a codec<BR>&gt;&gt; implementation (let's use Vorbis),<BR>&gt;&gt; and an accessibility implementation, working with a &lt;canvas&gt; element.<BR>&gt;<BR>&gt; Here are a few more use-cases that many people would consider just as<BR>&gt; important:<BR>&gt;<BR>&gt; * Browser based music software and synthesis toys.<BR>&gt; * New types of 'algorithmic' music like that pioneered by Brian Eno.<BR>&gt; * Browser based games which want to use procedural audio instead of<BR>&gt; pre-rendered sound effects.<BR>&gt;<BR>&gt; I'd like to reiterate the previously expressed sentiment that only implementing<BR>&gt; pre-rendered audio playback is like having a browser that only supports static<BR>&gt; images loaded from the server instead of animations and &lt;canvas&gt; tags.<BR>&gt;<BR>&gt; What is really needed is a DSP vector processor which runs outside of ECMA<BR>&gt; script, but with a good API so that the ECMAscripts can talk to it directly.<BR>&gt; Examples of reference software, mostly open source, which do this type of thing<BR>&gt; follow:<BR>&gt;<BR>&gt; * Csound<BR>&gt; * Supercollider<BR>&gt; * Pure Data<BR>&gt; * Nyquist<BR>&gt; * Chuck<BR>&gt; * Steinberg VSTs<BR>&gt;<BR>&gt; I am going to use the terms "signal vector", "audio buffer", and "array"<BR>&gt; interchangeably below.<BR>&gt;<BR>&gt; Four major types of synthesis would be useful, but they are pretty much<BR>&gt; isomorphic, so any one of them could be implemented as a base-line:<BR>&gt;<BR>&gt; * Wavetable (implement vector write/read/lookup operators)<BR>&gt; * FM &amp; AM (implement vector + and * operators)<BR>&gt; * Subtractive (implement unit delay from which you can build filters)<BR>&gt; * Frequency domain (implemnt FFT and back again)<BR>&gt;<BR>&gt; Of these, I feel that wavetable synthesis should be the first type of synthesis<BR>&gt; to be implemented, since most of the code for manipulating audio buffers is<BR>&gt; already going to be in the browsers and exposing those buffers shouldn't be<BR>&gt; hugely difficult. Basically what this would take is ensuring some things about<BR>&gt; the audio tag:<BR>&gt;<BR>&gt; * Supports playback of arbitrarily small buffers.<BR>&gt; * Seamlessly loops those small buffers.<BR>&gt; * Allows read/write access to those buffers from ECMAscript.<BR>&gt;<BR>&gt; Given the above, the other types of synthesis are possible, albeit slowly. For<BR>&gt; example, FM &amp; AM synthesis are possible by adding adding/multiplying vectors of<BR>&gt; sine data together into a currently looping audio buffer. Subtractive synthesis<BR>&gt; is possible by adding delayed versions of the data in the buffer to itself.<BR>&gt; Frequency domain synthesis is possible by analysing the data in the buffer with<BR>&gt; FFT (and reverse FFT) and writing back new data. I see this API as working as<BR>&gt; previously posted, by Charles Prichard, but with the following extra<BR>&gt; possibility:<BR>&gt;<BR>&gt; &lt;audio id='mybuffer'&gt;<BR>&gt; buffer = document.getElementById("mybuffer");<BR>&gt; // here myfunc is a function which will change<BR>&gt; // the audio buffer each time the buffer loops<BR>&gt; buffer.loopCallback = myfunc;<BR>&gt; buffer.loop = True;<BR>&gt; buffer.play();<BR>&gt;<BR>&gt; Of course, the ECMA script is probably going to be too slow in the short term,<BR>&gt; so moving forward it would be great if there was a library/API which can do the<BR>&gt; following vector operations in the background at a speed faster than doing them<BR>&gt; directly, element by element inside ECMAscript (a bit like Python's Numeric<BR>&gt; module). All inputs and outputs are signal vectors/audio tag buffers:<BR>&gt;<BR>&gt; * + - add two signal vectors (2 input, 1 output)<BR>&gt; * * - multiply two signal vectors (2 input, 1 output)<BR>&gt; * z - delay a signal vector with customisable sample length (2 input, 1 output)<BR>&gt; * read - do a table lookup (1 input, 1 output)<BR>&gt; * write - do a table write (2 input, 1 output)<BR>&gt; * copy - memcpy a signal vector (1 input, 1 output)<BR>&gt; * fft do a fast fourier transform - (1 input, 2 output)<BR>&gt; * rfft do a reverse fast fourier transform - (2 inputs, 1 output)<BR>&gt;<BR>&gt; It would be so great if it was possible to unify the above into an API that<BR>&gt; looked and worked something like this:<BR>&gt;<BR>&gt; &lt;audio id='mybuffer'&gt;<BR>&gt;<BR>&gt; outbuffer = document.getElementById("mybuffer");<BR>&gt;<BR>&gt; b = new AudioBuffer(64)<BR>&gt; for (x=0; x&lt;64; x++)<BR>&gt; ? ? ? ?b[x] = Math.sin(x / 64 * Math.PI)a;<BR>&gt;<BR>&gt; // inside the loopCallback do a vector multiplication of the data in our buffer<BR>&gt; // with a sine wave we created earlier.<BR>&gt; outbuffer.multiply(b);<BR>&gt;<BR><BR>Why don't you just implement an example in javascript to show off what<BR>you're talking about and make a use case for having it implemented<BR>inside the browsers?<BR><BR>Cheers,<BR>Silvia,<BR><BR></FONT></DIV></DIV><br/><font face="Times New Roman" size="3"><a href="http://www.bbc.co.uk">http://www.bbc.co.uk</a><br/>This e-mail (and any attachments) is confidential and may contain personal views which are not the views of the BBC unless specifically stated.<br/>If you have received it in error, please delete it from your system.<br/>Do not use, copy or disclose the information in any way nor act in reliance on it and notify the sender immediately.<br/>Please note that the BBC monitors e-mails sent or received.<br/>Further communication will signify your consent to this.</font></BODY></HTML>