RSS Twitter Facebook

2016/11/12 (2016年11月 のアーカイブ)

2016年、Web Audio API はどう変わったのか?


2016年、もう11月も半ばですね。Web Audio API も2015年末の Web Audio API WD からこの1年でそれなりに変更が入っています。 完全に追い切れているわけではないけど、ざっくり。
  • AudioWorker が AudioWorklet という名前に変わって再設計される

    これにより、
    • AudioWorker => AudioWorklet
    • AudioWorkerGlobalScope => AudioWorkletGlobalScope
    • AudioWorkerNode => AudioWorkletNode
    • AudioWorkerNodeProcessor => AudioWorkletProcessor
    にそれぞれ変わりました。

    JavaScriptでの直接的な音声処理の手段としては、元々はScriptProcessor (JavaScriptNode) が用意されていたのですが、メインスレッド内で重い処理はさせられないので、スレッドを分けるべきという話から WebWorker をベースとして AudioWorker が策定されていました。

    しかしそもそも、WebWorker はそれなりにまとまった分量の処理向けで細かい処理スレッドを大量に作るには向いていないという事がわかり、新たにAudioWorkletという形で作り直しが始まっています。

    今回は独自のスレッドを持つのではなく、WebAudioのレンダリングスレッドにフックする形のようです。(直接の関係はありませんが表示系でも同じような動きがあり、CSSをworkletで拡張するという試みが Houdini タスクフォースで進められています)

    The AudioWorklet interface


  • ConstantSourceNodeの追加

    これは単にoffsetパラメータで指定される定数値を出力するノードです。単純な内容ですがこれで色んな処理がJavaScriptからの細かい制御ではなくノードの接続だけでできるようになります。

    これについては、こちらにも記事にしてあります。
    [WebAudio API] ConstantSourceNodeって何ですか?

  • The ConstantSourceNode Interface


  • SpatialPannerNodeがPannerNodeという名前に戻る

    元々あったPannerNodeは3D処理を行うものでしたが、昨年時点ではステレオ処理のStereoPannerと3D処理のSpatialPannerになり、ただのPannerNodeはdeprecateとなっていました。そして現在の仕様ではステレオ処理用がStereoPannerNodeで3D処理がPannerNodeです。

    昔のPannerNodeと違い、各パラメータがAudioParam化されています。

    またこれに伴い、AudioContextにある3D処理用のリスナー、SpatialListenerもAudioListenerに名前が戻っています。

    更に、昔のPannerNodeにあったドップラー効果関連の機能は削除されています。これは実装の途中で複雑なノード接続を行った時にPannerでドップラー効果をちゃんと実現できる手段がない、ある意味仕様バグと発覚したためです。

  • The PannerNode Interface


  • ノードを作成する方法としてコンストラクタの呼び出しをサポート

    これまでは AudioContext の createXXX()メソッドを使用してノードを作成していましたが、new で作成できるようになりました。

    • これまで : var node = audioctx.createGain();
    • 新しい方法 : var node = new GainNode(audioctx);

    おまけ? として作成時にパラメータの初期値が指定できます。 e.g. var osc=new OscillatorNode(actx,{frequency:1000}); これは、新しい種類のノードが作られる度にAudioContextにcreateXXXがどんどん増えるのを嫌がったためのようです。とりあえず、今回追加された ConstantSourceNode は createConstantSource() が準備されるようですが。

    The AudioNode Interface


  • オートメーション関数に cancelAndHoldAtTime()を追加

    この関数は cancelScheduledValues() と同様に指定時刻以降のオートメーションをキャンセルしますが、単にイベントの時刻単位で削除されるのではなく、指定時刻の瞬間まではオートメーション通りに動作して指定時刻の瞬間の値をそれ以降ホールドします。つまり、setTargetAtTime() のような指定時刻以降カーブがずっと続くオートメーションを実行中に cancelAndHoldAtTime() を呼ぶと、その時刻でカーブの進行を止めます。

    実は今までのオートメーション機能だけではシンセのADSR等を作ろうとすると、指定の時刻における値がわからなくてあまりいい感じのものが作れなかったのですが、これでようやく実用的になりました。なお、内部的な実装としては、カーブの途中で cancelAndHoldAtTime() が呼ばれると暗黙的に setValueAtTime イベントを追加するなど、なかなか面倒くさい処理をやる事になっているようです。

    cancelAndHoldAtTime


  • AudioParam の nominal range は値を強制的にクランプするようになった

    AudioParam には名目上の上限/下限として min / max というパラメータがあり、今までこれは本当に名目上の値で実動作には何も影響しなかったのですが、内部処理で計算結果がこの範囲外になる場合は範囲内に強制的にクランプするようになりました。

    これに伴って各パラメータの min / max の値に見直しが入っています。

    Computation of Value

他にも細々と色々変わっている所はあると思いますが、大きな所はこんなものでしょうか。何にせよ一番の大物は AudioWorklet だと思うのでこのあたりがちゃんとブラウザに実装されないとなかなかやりにくい感じではありますね。

それにしても CSS の Houdini なんかもちゃんとは見てないのだけど、凄いですねえ。WebGL でも思ったのだけど、Web もいつの間にかこんな所に来ちゃってるのだな感がすごい。

Posted by g200kg : 2016/11/12 10:54:20