ShaderToyはSoundタブがあって、そこでGLSLで音声処理を書くことができる。vec2 mainSound(float time)
の引数が時間、返り値はステレオサンプルである。mainSound()
で音声処理を書いてvec2
でステレオサンプルを返せば、音が鳴る。例えば下の動画は、音声サンプルは使わず、GLSLによるリアルタイム処理で音声を出力している。
ShaderToy側でどのような処理をしているのか興味があるのでちらっと覗いてみた。肝のコードはhttps://www.shadertoy.com/js/effect.js?v=46である。
これを読むと、3秒分のステレオ・サンプルバッファをテクスチャとして作成して、フラグメント・シェーダーに引き渡しているようである。 フラグメント・シェーダーはテクスチャにレンダリングする。それをCPU側で読み取って、WebAudioに渡すということをしているようである。いわゆるGPGPUである。
GLSLでオーディオ・コードが書けるのは奇妙な感じがするけど、ソースコードを見たら「なるほどなー」と思った。