RSS Twitter Facebook

2016/01/20 (2016年01月 のアーカイブ)

Web Audio API WD08-Dec-2015 日本語訳完了

Web Audio API Working Draft 08-Dec-2015 翻訳完了しました。


http://g200kg.github.io/web-audio-api-ja/

Working Draft としては WD10-Oct-2013 から2年振りの更新ですが、どう変わったのか軽く見てみます。


ScriptProcessor の廃止予定と AudioWorker の追加


JavaScript で直接音データを操作する ScriptProcessor ノードが廃止予定となり、代わりに AudioWorker が定められました。変更として多分これが一番大きいもので、仕様書上も AudioWorker 関係がかなりの部分を占めています。
そして困った事にこの AudioWorker を実装したブラウザはまだ存在しません。@mohayonaoさんが polyfill を作ったりしていますので、試してみたい方はこのあたりを見てください。
AudioWorker を試してみる

AudioWorker は JavaScript でマルチスレッドを実現する WebWorker の応用で今まではメインスレッド1本でオーディオ処理までやっていたのをスレッドを分けられるようになります。それから自分専用のカスタムノードとして AudioParam パラメータを追加して別ノードから接続する機能があったりファクトリ経由なので複数のノードを作ったりが簡単にできるようになります。ただしワーカー用スクリプトを準備したりと今までと比べるとちょっと扱いは面倒です。
今のところまだ ScriptProcessor がすぐに使えなくなる訳ではないですが、今から何か作るならどうするかと言われるとなかなか微妙ですね。

実は ScriptProcessor は問題があったんだよ-みたいな言い訳じみた文章が仕様書にひそかに入っています。



「実装は一般的に AudioContext の currentTime と AudioProcessingEvent の playbackTime の差を最小化する事を目指します。 ScriptProcessorNode が廃止予定となった事でこの考慮はその内問題とならなくなるでしょう...」


Context の suspend / resume / close


AudioContext を一時停止したり再開したりできるようになりました。使わなければ使わないで困る事もないですが、これは基本的にモバイル系機器等でハードウェアを一時休止してパワーダウンしたりできるようにする事が目的のようです。実装も既に入っているようですが、ちゃんと機能しているのか私も確認していません。


Promise 化


オーディオデータをデコードする decodeAudioData とオフラインのレンダリングをする startRendering は Promise を返すようになりました。

関数名はそのままですので、新しい API がサポートされているのかどうかちょっと気を付けないといけません。まあこれは最近の HTML5 的に時間がかかる処理のコールバックを止めて Promise にしようみたいな流れですが、ばっさり切るわけには行かなかったようで、仕様書にも「歴史的な理由からコールバック"も"サポートします」みたいな文言が入ってしまってたりします。


StereoPanner の追加


今までも Panner は存在していたのですが、いわゆる 3D ゲーム系に適した API になっていて音楽系アプリで良く使われるステレオのパンを振る機能がないという状態だったのですが、これで解消されました。他のノードからの接続でパンを制御する事もやっと普通にできるようになったのでオートパンが一発で作れるようになりました。


SpatialPanner の追加 (そして今までの Panner が廃止予定)


今までの Panner に相当する 3D 系のパンナーが SpatialPanner になって古い Panner は廃止予定(仕様書上まだこのあたりが混乱してます)です。今までのパンナーはパラメータが AudioParam でなくちょっと異質だったのですが、今度はちゃんと AudioParam 経由になっています。


IIRFilter の追加


BiquadFilter だけじゃ満足できない人用に汎用 IIRFilter が追加されました。伝達関数の分子分母の係数を自由に指定できますが、どちらかと言えば BiquadFilter でできなかった奇数次フィルター用で、パフォーマンス的に BiquadFilter で済むなら BiquadFilter を使ってくださいというスタンスです。


ノードの disconnect が割と柔軟になった


実際にアプリを作るとノードを繋ぐのは良いとして切断するのがまとめて切断しかできずに困ったりしていたのですが、コネクションを1つずつ自由に繋いだり切ったりできるようになりました。意外と便利(というか今までが不自由)


後、こまごまとメソッドが追加されたり、挙動が変わったり....


 AudioBuffer の copyFromChannel / copyToChannel --- バッファの部分的な読み出し/書き込み
 AnalyserNode の getFloatTimeDomainData --- Floatでの時間領域データ取得
BiquadFilter パラメータが a-rate に
 ・
 ・
 ・
色々あるのですが、後ドキュメントとして今まで実装から想像するしかない曖昧だった所がかなり加筆されています。
◆ FFT の窓関数のかけ方とか
◆ フィルター係数の算出方法とか
◆ オシレータの位相の決め方とか
これ真面目に全部読めば、なかなかためになる文書だと思いますよ (以前からコンポリューションリバーブのディレイを抑える実装方法とかも入ってたしね。今凄く見つかりにくい奥の方に入ってるけど)。

Posted by g200kg : 2016/01/20 04:55:35