ウェブオーディオAPI 1.1

W3C 初回公開作業草案

この文書の詳細
このバージョン:
https://www.w3.org/TR/2024/WD-webaudio-1.1-20241105/
最新公開バージョン:
https://www.w3.org/TR/webaudio-1.1/
編集者草案:
https://webaudio.github.io/web-audio-api/
履歴:
https://www.w3.org/standards/history/webaudio-1.1/
フィードバック:
public-audio@w3.org 件名 “[webaudio] … メッセージトピック …” (アーカイブ)
GitHub
テストスイート:
https://github.com/web-platform-tests/wpt/tree/master/webaudio
編集者:
(Mozilla (https://www.mozilla.org/))
(Google (https://www.google.com/))
前編集者:
Raymond Toy (2018年10月まで)
Chris Wilson (2016年1月まで)
Chris Rogers (2013年8月まで)

概要

この仕様書は、ウェブアプリケーションでオーディオを処理および合成するための高水準Web APIについて記述しています。 主なパラダイムはオーディオルーティンググラフであり、 複数のAudioNode オブジェクトを相互に接続して、全体のオーディオレンダリングを定義します。 実際の処理は主に基盤となる実装 (通常は最適化されたアセンブリ/C/C++コード)で行われますが、 直接的なスクリプトによる処理や合成もサポートされています。

はじめにセクションでは、この仕様書の動機について説明しています。

このAPIは、ウェブプラットフォーム上の他のAPIや要素と組み合わせて使用することを想定しています。特に、 XMLHttpRequest [XHR]responseTyperesponse属性の利用)、 ゲームやインタラクティブなアプリケーションでは、 canvas 2D [2dcontext]およびWebGL [WEBGL] 3DグラフィックスAPIと併用されることが予想されます。

この文書のステータス

このセクションでは、公開時点での文書のステータスについて説明します。 現在のW3C出版物やこの技術報告書の最新改訂版は W3C技術報告書インデックス(https://www.w3.org/TR/)で確認できます。

この文書はWeb Audioワーキンググループによって、 勧告トラックを用いて 初回公開作業草案として発行されました。

この文書はW3C勧告となることを意図しています。

この文書に関してコメントをしたい場合は、仕様リポジトリにissueを提出するか、 public-audio@w3.org購読アーカイブ)まで送信してください。

この文書は初回公開作業草案です。

初回公開作業草案として公開されたことは、W3Cおよびそのメンバーによる支持を意味しません。この文書は草案であり、今後更新・置換・廃止される可能性があります。 作業中の文書以外として引用するのは不適切です。

この文書はW3C特許ポリシーに基づき運営されているグループによって作成されました。W3Cは、グループ成果物に関連してなされた 特許開示の公開リストを維持しています。そのページには特許を開示するための手順も記載されています。 特許に関する実際の知識を持つ個人は、その特許が必須クレームを含むと思われる場合、 W3C特許ポリシー第6節に従って情報を開示する必要があります。

この文書は2023年11月3日W3Cプロセス文書に準拠しています。

はじめに

これまでウェブ上のオーディオはかなり原始的であり、非常に最近までFlashやQuickTimeなどのプラグインを利用する必要がありました。HTML5で audio 要素が導入されたことは非常に重要で、基本的なストリーミングオーディオ再生が可能になりました。しかし、より複雑なオーディオアプリケーションを扱うには十分なパワーがありません。高度なウェブベースのゲームやインタラクティブアプリケーションには、別のソリューションが必要です。本仕様の目標は、現代のゲームオーディオエンジンにある機能や、現代のデスクトップオーディオ制作アプリケーションで行われるミキシング、処理、フィルタリングのタスクの一部を含めることです。

APIは多様なユースケース[webaudio-usecases]を念頭に設計されています。理想的には、最適化されたC++エンジンをスクリプトで制御し、ブラウザで実行可能なあらゆるユースケースをサポートできるべきです。ただし、現代のデスクトップオーディオソフトウェアは非常に高度な機能を持ち、一部は本システムで構築するのが困難または不可能な場合もあります。AppleのLogic Audioはその一例で、外部MIDIコントローラ、任意のプラグインオーディオエフェクトやシンセサイザー、高度に最適化されたダイレクト・トゥ・ディスクのオーディオファイル読取/書込、緊密に統合されたタイムストレッチなどに対応しています。それでも、提案されているシステムはかなり多様な複雑なゲームやインタラクティブアプリケーション(音楽関連も含む)を十分にサポート可能です。そしてWebGLの高度なグラフィック機能と非常に良い補完関係になります。APIは後からさらに高度な機能を追加できるよう設計されています。

機能

APIがサポートする主な機能は以下の通りです:

モジュラー型ルーティング

モジュラー型ルーティングでは、異なるAudioNode オブジェクト間で任意の接続が可能です。各ノードは入力出力を持つことができます。 ソースノードは入力を持たず、出力は1つだけです。 デスティネーションノードは入力が1つで出力はありません。他のノード(フィルター等)はソースとデスティネーションの間に配置できます。開発者は、2つのオブジェクトを接続するときに低レベルのストリームフォーマット詳細を心配する必要はなく、適切に処理されます。 例えば、モノラルのオーディオストリームをステレオ入力に接続すれば、適切に左右チャンネルにミックスされます。

最も単純な場合、1つのソースを直接出力へルーティングできます。 すべてのルーティングは、AudioContext 内で、単一のAudioDestinationNode によって行われます:

modular routing
モジュラー型ルーティングのシンプルな例。

この単純なルーティングを図示すると、単一のサウンドを再生する簡単な例は以下の通りです:

const context = new AudioContext();

function playSound() {
    const source = context.createBufferSource();
    source.buffer = dogBarkingBuffer;
    source.connect(context.destination);
    source.start(0);
}

より複雑な例として、3つのソースとコンボリューションリバーブのセンド、最終出力段にダイナミクスコンプレッサーを使ったルーティング例は以下です:

modular routing2
モジュラー型ルーティングのより複雑な例。
let context;let compressor;let reverb;let source1, source2, source3;let lowpassFilter;let waveShaper;let panner;let dry1, dry2, dry3;let wet1, wet2, wet3;let mainDry;let mainWet;function setupRoutingGraph () {    context = new AudioContext();    // Create the effects nodes.    lowpassFilter = context.createBiquadFilter();    waveShaper = context.createWaveShaper();    panner = context.createPanner();    compressor = context.createDynamicsCompressor();    reverb = context.createConvolver();    // Create main wet and dry.    mainDry = context.createGain();    mainWet = context.createGain();    // Connect final compressor to final destination.    compressor.connect(context.destination);    // Connect main dry and wet to compressor.    mainDry.connect(compressor);    mainWet.connect(compressor);    // Connect reverb to main wet.    reverb.connect(mainWet);    // Create a few sources.    source1 = context.createBufferSource();    source2 = context.createBufferSource();    source3 = context.createOscillator();    source1.buffer = manTalkingBuffer;    source2.buffer = footstepsBuffer;    source3.frequency.value = 440;    // Connect source1    dry1 = context.createGain();    wet1 = context.createGain();    source1.connect(lowpassFilter);    lowpassFilter.connect(dry1);    lowpassFilter.connect(wet1);    dry1.connect(mainDry);    wet1.connect(reverb);    // Connect source2    dry2 = context.createGain();    wet2 = context.createGain();    source2.connect(waveShaper);    waveShaper.connect(dry2);    waveShaper.connect(wet2);    dry2.connect(mainDry);    wet2.connect(reverb);    // Connect source3    dry3 = context.createGain();    wet3 = context.createGain();    source3.connect(panner);    panner.connect(dry3);    panner.connect(wet3);    dry3.connect(mainDry);    wet3.connect(reverb);    // Start the sources now.    source1.start(0);    source2.start(0);    source3.start(0);}

モジュラー型ルーティングでは、AudioNodeの出力を、 別のAudioParam パラメータにルーティングして、異なるAudioNodeの挙動を制御することもできます。この場合、 ノードの出力は入力信号ではなく変調信号として機能します。

modular routing3
モジュラー型ルーティングで、一方のオシレーターがもう一方の周波数を変調している例。
function setupRoutingGraph() {    const context = new AudioContext();    // Create the low frequency oscillator that supplies the modulation signal    const lfo = context.createOscillator();    lfo.frequency.value = 1.0;    // Create the high frequency oscillator to be modulated    const hfo = context.createOscillator();    hfo.frequency.value = 440.0;    // Create a gain node whose gain determines the amplitude of the modulation signal    const modulationGain = context.createGain();    modulationGain.gain.value = 50;    // Configure the graph and start the oscillators    lfo.connect(modulationGain);    modulationGain.connect(hfo.detune);    hfo.connect(context.destination);    hfo.start(0);    lfo.start(0);}

API概要

定義されるインターフェースは以下の通りです:

また、Web Audio APIから廃止予定であり現在は代替実装の経験を待っている機能もいくつか存在します:

1. オーディオAPI

1.1. BaseAudioContext インターフェース

このインターフェースは、AudioNode オブジェクト群とその接続を表します。任意の信号ルーティングをAudioDestinationNode へ行うことができます。 ノードはコンテキストから生成され、相互接続されます。

BaseAudioContext は直接インスタンス化されず、 代わりに具象インターフェースであるAudioContext (リアルタイムレンダリング用)およびOfflineAudioContext (オフラインレンダリング用)によって拡張されます。

BaseAudioContext は内部スロット[[pending promises]]を持ち、これは初期状態では空の順序付きpromiseリストです。

BaseAudioContext は一意の メディア要素イベントタスクソースを持ちます。 さらに、BaseAudioContext は複数のプライベートスロット[[rendering thread state]][[control thread state]] を持ち、これらはAudioContextState の値を取り、どちらも初期値は"suspended" です。また、プライベートスロット [[render quantum size]]は符号なし整数です。

enum AudioContextState {
    "suspended",
    "running",
    "closed"
};
AudioContextState 列挙型の説明
列挙値 説明
"suspended" このコンテキストは現在サスペンド状態です(コンテキスト時間は進行せず、オーディオハードウェアは電源切断・解放されている可能性があります)。
"running" オーディオが処理されています。
"closed" このコンテキストは解放され、オーディオ処理に使用できません。すべてのシステムオーディオリソースが解放されました。
enum AudioContextRenderSizeCategory {
    "default",
    "hardware"
};
列挙型の説明
"default" AudioContextのレンダリング量子サイズはデフォルト値128フレームです。
"hardware" ユーザーエージェントが現在の構成に最適なレンダリング量子サイズを選択します。

注: これはホスト情報を公開し、フィンガープリントに利用される可能性があります。

callback DecodeErrorCallback = undefined (DOMException error);

callback DecodeSuccessCallback = undefined (AudioBuffer decodedData);

[Exposed=Window]
interface BaseAudioContext : EventTarget {
    readonly attribute AudioDestinationNode destination;
    readonly attribute float sampleRate;
    readonly attribute double currentTime;
    readonly attribute AudioListener listener;
    readonly attribute AudioContextState state;
    readonly attribute unsigned long renderQuantumSize;
    [SameObject, SecureContext]
    readonly attribute AudioWorklet audioWorklet;
    attribute EventHandler onstatechange;

    AnalyserNode createAnalyser ();
    BiquadFilterNode createBiquadFilter ();
    AudioBuffer createBuffer (unsigned long numberOfChannels,
                                unsigned long length,
                                float sampleRate);
    AudioBufferSourceNode createBufferSource ();
    ChannelMergerNode createChannelMerger (optional unsigned long numberOfInputs = 6);
    ChannelSplitterNode createChannelSplitter (
        optional unsigned long numberOfOutputs = 6);
    ConstantSourceNode createConstantSource ();
    ConvolverNode createConvolver ();
    DelayNode createDelay (optional double maxDelayTime = 1.0);
    DynamicsCompressorNode createDynamicsCompressor ();
    GainNode createGain ();
    IIRFilterNode createIIRFilter (sequence<double> feedforward,
                                    sequence<double> feedback);
    OscillatorNode createOscillator ();
    PannerNode createPanner ();
    PeriodicWave createPeriodicWave (sequence<float> real,
                                        sequence<float> imag,
                                        optional PeriodicWaveConstraints constraints = {});
    ScriptProcessorNode createScriptProcessor(
        optional unsigned long bufferSize = 0,
        optional unsigned long numberOfInputChannels = 2,
        optional unsigned long numberOfOutputChannels = 2);
    StereoPannerNode createStereoPanner ();
    WaveShaperNode createWaveShaper ();

    Promise<AudioBuffer> decodeAudioData (
        ArrayBuffer audioData,
        optional DecodeSuccessCallback? successCallback,
        optional DecodeErrorCallback? errorCallback);
};

1.1.1. 属性

audioWorklet 型: AudioWorklet、 読み取り専用

Workletオブジェクトへのアクセスを許可し、AudioWorkletProcessor クラス定義を含むスクリプトを[HTML]およびAudioWorkletで定義されたアルゴリズムによりインポートできます。

currentTime 型: double、読み取り専用

これはコンテキストのレンダリンググラフで直近に処理されたオーディオブロックの最後のサンプルフレームに続くサンプルフレームの秒数です。レンダリンググラフがまだオーディオブロックを処理していない場合、currentTime の値は0です。

currentTime の時間座標系では、値0がグラフで最初に処理される最初のサンプルフレームに対応します。この座標系での経過時間は、BaseAudioContext により生成されたオーディオストリームの経過時間に対応しますが、他のシステムクロックと同期しているとは限りません。(OfflineAudioContext では、ストリームはデバイスで再生されないため、リアルタイムに近いものすらありません。)

Web Audio APIのすべてのスケジュールされた時刻はcurrentTime の値を基準とします。

BaseAudioContext が"running"状態のとき、 この属性の値は単調増加し、レンダリングスレッドにより均等な増分で更新され、レンダリング量子に対応します。したがって、runningなコンテキストではcurrentTimeはオーディオブロック処理に合わせて着実に増加し、常に次に処理されるオーディオブロックの開始時刻を表します。また、現在の状態でスケジュールされた変更が最も早く有効になる可能性のある時刻でもあります。

currentTimeは返される前にコントロールスレッド上でアトミックに読み取られる必要があります。

destination 型: AudioDestinationNode、読み取り専用

1つの入力を持ち、すべてのオーディオの最終出力先を表すAudioDestinationNodeです。通常は実際のオーディオハードウェアを表します。すべてのAudioNode (アクティブにオーディオをレンダリングしているもの)は直接または間接的にdestination に接続されます。

listener 型: AudioListener、 読み取り専用

3D空間化に使用されるAudioListenerです。

onstatechange 型: EventHandler

AudioContextの状態が変化したとき(対応するpromiseが解決されたとき)、BaseAudioContext にディスパッチされるイベント用のイベントハンドラを設定するためのプロパティです。イベント型はstatechangeです。Event インターフェースを使うイベントがハンドラにディスパッチされ、AudioContextの状態を直接参照できます。新しく作成されたAudioContextは常にsuspended状態で開始し、状態が変化するたびにstatechangeイベントが発火されます。このイベントはcomplete イベントよりも前に発火されます。

sampleRate 型: float、読み取り専用

BaseAudioContext が処理するオーディオのサンプルレート(毎秒サンプルフレーム数)です。コンテキスト内のすべてのAudioNode はこのレートで動作すると仮定されます。この仮定のもと、サンプルレート変換や「バリスピード」処理はリアルタイム処理ではサポートされません。 ナイキスト周波数はこのサンプルレート値の半分です。

state 型: AudioContextState、読み取り専用

BaseAudioContext の現在の状態を説明します。 この属性の取得は[[control thread state]] スロットの内容を返します。

renderQuantumSize 型: unsigned long、読み取り専用

この属性の取得は[[render quantum size]]スロットの値を返します。

1.1.2. メソッド

createAnalyser()

ファクトリメソッドAnalyserNode を生成します。

パラメータなし。
返却型: AnalyserNode
createBiquadFilter()

ファクトリメソッドBiquadFilterNode を生成し、代表的な二次フィルターのいずれかとして構成可能です。

パラメータなし。
返却型: BiquadFilterNode
createBuffer(numberOfChannels, length, sampleRate)

指定されたサイズのAudioBufferを生成します。バッファ内のオーディオデータはゼロ初期化(無音)されます。引数が負値、ゼロ、または規定範囲外の場合は、NotSupportedError 例外を必ず投げなければなりません。

BaseAudioContext.createBuffer()メソッドの引数。
パラメータ Nullable Optional 説明
numberOfChannels unsigned long バッファのチャンネル数を決定します。実装は少なくとも32チャンネルをサポートしなければなりません。
length unsigned long バッファのサンプルフレーム数。最低でも1でなければなりません。
sampleRate float バッファ内のリニアPCMオーディオデータのサンプルレート(毎秒サンプルフレーム数)。実装は少なくとも8000~96000の範囲をサポートしなければなりません。
返却型: AudioBuffer
createBufferSource()

ファクトリメソッドAudioBufferSourceNode を生成します。

パラメータなし。
返却型: AudioBufferSourceNode
createChannelMerger(numberOfInputs)

ファクトリメソッドChannelMergerNode を生成します。IndexSizeError は、numberOfInputs が1未満、またはサポートされるチャンネル数を超える場合に必ず投げなければなりません。

BaseAudioContext.createChannelMerger(numberOfInputs)メソッドの引数。
パラメータ Nullable Optional 説明
numberOfInputs unsigned long 入力数。最大32までサポート必須。省略時は6が使用されます。
返却型: ChannelMergerNode
createChannelSplitter(numberOfOutputs)

ファクトリメソッドChannelSplitterNode を生成します。IndexSizeError は、numberOfOutputs が1未満、またはサポートされるチャンネル数を超える場合に必ず投げなければなりません。

BaseAudioContext.createChannelSplitter(numberOfOutputs)メソッドの引数。
パラメータ Nullable Optional 説明
numberOfOutputs unsigned long 出力数。最大32までサポート必須。省略時は6が使用されます。
返却型: ChannelSplitterNode
createConstantSource()

ファクトリメソッドConstantSourceNode を生成します。

パラメータなし。
返却型: ConstantSourceNode
createConvolver()

ファクトリメソッドConvolverNode を生成します。

パラメータなし。
返却型: ConvolverNode
createDelay(maxDelayTime)

ファクトリメソッドDelayNode を生成します。初期デフォルトのディレイ時間は0秒です。

BaseAudioContext.createDelay(maxDelayTime)メソッドの引数。
パラメータ Nullable Optional 説明
maxDelayTime double ディレイラインで許容される最大ディレイ時間(秒)。指定した場合、この値はゼロより大きく3分未満でなければならず、違反時はNotSupportedError 例外を必ず投げなければなりません。省略時は1が使用されます。
返却型: DelayNode
createDynamicsCompressor()

ファクトリメソッドDynamicsCompressorNode を生成します。

パラメータなし。
返却型: DynamicsCompressorNode
createGain()

ファクトリメソッドGainNode を生成します。

パラメータなし。
返却型: GainNode
createIIRFilter(feedforward, feedback)
BaseAudioContext.createIIRFilter()メソッドの引数。
パラメータ Nullable Optional 説明
feedforward sequence<double> IIRフィルターの伝達関数のフィードフォワード(分子)係数の配列。最大長は20。すべての値がゼロの場合、InvalidStateError 必須で例外を投げますNotSupportedError 必須で、配列長が0または20超の場合に例外を投げます
feedback sequence<double> IIRフィルターの伝達関数のフィードバック(分母)係数の配列。最大長は20。配列の最初の要素が0の場合、InvalidStateError 必須で例外を投げますNotSupportedError 必須で、配列長が0または20超の場合に例外を投げます
返却型: IIRFilterNode
createOscillator()

ファクトリメソッドOscillatorNode を生成します。

パラメータなし。
返却型: OscillatorNode
createPanner()

ファクトリメソッドPannerNode を生成します。

パラメータなし。
返却型: PannerNode
createPeriodicWave(real, imag, constraints)

ファクトリメソッドPeriodicWave を生成します。

このメソッドを呼び出す際、以下の手順で実行します:
  1. realimag の長さが一致しない場合、IndexSizeError を必ず投げます。

  2. oPeriodicWaveOptions 型の新しいオブジェクトとします。

  3. このファクトリメソッドに渡された realimag パラメータを、それぞれ同名の属性としてoにセットします。

  4. odisableNormalization 属性に、ファクトリメソッドに渡された disableNormalization 属性の値をセットします。

  5. 新しいPeriodicWave pを構築し、第一引数に本ファクトリメソッドが呼ばれたBaseAudioContext を、第二引数にoを渡します。

  6. pを返します。

BaseAudioContext.createPeriodicWave()メソッドの引数。
パラメータ Nullable Optional 説明
real sequence<float> コサインパラメータの配列。詳細はreal コンストラクタ引数の説明を参照。
imag sequence<float> サインパラメータの配列。詳細はimag コンストラクタ引数の説明を参照。
constraints PeriodicWaveConstraints 指定しない場合、波形は正規化されます。指定した場合、constraintsで与えられる値に従い正規化されます。
返却型: PeriodicWave
createScriptProcessor(bufferSize, numberOfInputChannels, numberOfOutputChannels)

ファクトリメソッドScriptProcessorNode を生成します。このメソッドは非推奨であり、AudioWorkletNode への置き換えが予定されています。スクリプトによる直接音声処理用のScriptProcessorNode を生成します。IndexSizeError は、bufferSizenumberOfInputChannelsnumberOfOutputChannels が有効範囲外の場合、必ず投げなければなりません。

numberOfInputChannelsnumberOfOutputChannels の両方が0の場合は無効です。この場合はIndexSizeError を必ず投げなければなりません。

BaseAudioContext.createScriptProcessor(bufferSize, numberOfInputChannels, numberOfOutputChannels)メソッドの引数。
パラメータ Nullable Optional 説明
bufferSize unsigned long bufferSize パラメータはバッファサイズ(サンプルフレーム単位)を決定します。指定しない場合や値が0の場合、実装側が最適なバッファサイズ(ノードの生存期間中はパワーオブ2で一定)を選択します。明示的に指定する場合は、256, 512, 1024, 2048, 4096, 8192, 16384いずれかでなければなりません。この値はaudioprocess イベントの発行頻度や、毎回処理するサンプルフレーム数を決定します。bufferSize が小さいほどレイテンシが低くなります。値が大きいほど音切れやグリッチ回避に必要です。バッファサイズは指定せず実装に任せるのが推奨です。パワーオブ2以外の場合は、IndexSizeError を必ず投げなければなりません。
numberOfInputChannels unsigned long ノード入力のチャンネル数。デフォルト値は2。最大32までサポート必須。NotSupportedError をサポート外の場合は必ず投げなければなりません。
numberOfOutputChannels unsigned long ノード出力のチャンネル数。デフォルト値は2。最大32までサポート必須。NotSupportedError をサポート外の場合は必ず投げなければなりません。
返却型: ScriptProcessorNode
createStereoPanner()

ファクトリメソッドStereoPannerNode を生成します。

パラメータなし。
返却型: StereoPannerNode
createWaveShaper()

ファクトリメソッドWaveShaperNode (非線形歪み効果)を生成します。

パラメータなし。
返却型: WaveShaperNode
decodeAudioData(audioData, successCallback, errorCallback)

非同期的に、ArrayBufferに格納されたオーディオファイルデータをデコードします。たとえばXMLHttpRequestresponse属性でresponseType"arraybuffer"に設定した後にロードしたArrayBufferなどが利用できます。オーディオファイルデータは、audio要素が対応する任意のフォーマットで構いません。decodeAudioData()に渡すバッファのcontent-typeは、[mimesniff]に記載されたスニッフィング手順で判定されます。

主にpromiseのreturn値で扱いますが、コールバックパラメータはレガシー対応です。

破損ファイルについては作者への警告を推奨します(throwは後方互換性のため不可)。

注: 圧縮音声データのバイトストリームが破損していてもデコード可能な場合、実装は(例えば開発者ツールで)作者に警告することが推奨されます。
decodeAudioDataが呼ばれた際、以下の手順をコントロールスレッドで実行する必要があります:
  1. this関連グローバルオブジェクト関連付けられたDocument完全有効でない場合、"InvalidStateError" DOMExceptionでrejectされたpromiseを返します。

  2. promiseを新規生成。

  3. audioData切り離されている場合:

    1. promise[[pending promises]] に追加。

    2. audioData ArrayBufferdetach。エラー時はstep 3へ。

    3. デコード処理を他スレッドにキューイング。

  4. それ以外の場合は以下のエラー処理:

    1. errorDataCloneErrorとする。

    2. promiseerrorでrejectし、[[pending promises]]から除去。

    3. メディア要素タスクをキューイングし、errorCallbackerrorで呼び出す。

  5. promiseを返す。

デコード処理を他スレッドにキューイングする場合、以下の手順をコントロールスレッド・レンダリングスレッド以外のデコードスレッドで実行する必要があります。

注: 複数のデコードスレッド が並列でdecodeAudioData処理可能。

  1. can decodeをtrueで初期化。

  2. audioData のMIMEタイプ判定。オーディオ・ビデオタイプパターン照合アルゴリズムがundefined を返した場合、can decodeをfalseに。

  3. can decodeがtrueなら、audioDataリニアPCMにデコード。失敗時はcan decodeをfalseに。 マルチトラックの場合は最初のトラックだけをデコード。

    注: より詳細なデコード制御が必要な場合は[WEBCODECS]を利用可能。

  4. can decodeがfalseの場合、 メディア要素タスクをキューイングし、

    1. errorDOMException(名前はEncodingError)に。

      1. promiseerrorでrejectし、[[pending promises]]から除去。

    2. errorCallback が存在する場合は、それをerrorで呼び出す。

  5. それ以外の場合:

    1. リザルト(デコード済みリニアPCM音声データ)をBaseAudioContext のサンプルレートにリサンプル(異なる場合)。

    2. メディア要素タスクをキューイングし、

      1. リザルト(場合によりリサンプル済み)を含むAudioBufferbufferとする。

      2. promisebufferでresolve。

      3. successCallback が存在する場合は、それをbufferで呼び出す。

BaseAudioContext.decodeAudioData()メソッドの引数。
パラメータ Nullable Optional 説明
audioData ArrayBuffer 圧縮音声データを含むArrayBuffer。
successCallback DecodeSuccessCallback? デコード終了時に呼ばれるコールバック関数。引数はデコード済みPCM音声データのAudioBuffer。
errorCallback DecodeErrorCallback? デコードエラー時に呼ばれるコールバック関数。
返却型: Promise<AudioBuffer>

1.1.3. コールバック DecodeSuccessCallback() のパラメータ

decodedData, 型 AudioBuffer

デコード済み音声データを含むAudioBufferです。

1.1.4. コールバック DecodeErrorCallback() のパラメータ

error, 型 DOMException

デコード中に発生したエラーです。

1.1.5. ライフタイム

一度作成されたAudioContext は、再生する音がなくなるか、ページが消えるまで音声の再生を続けます。

1.1.6. 内省やシリアル化プリミティブの欠如

Web Audio APIは発火して忘れる方式で音声ソースのスケジューリングを行います。つまり、ソースノードAudioContext のライフタイム中に各ノート用に生成され、グラフから明示的に削除されることはありません。これはシリアル化APIと互換性がなく、安定したノード集合がないためシリアル化できません。

さらに、内省APIがあると、コンテンツスクリプトがガベージコレクションの様子を観察できてしまいます。

1.1.7. BaseAudioContext のサブクラスに関連するシステムリソース

サブクラスAudioContext およびOfflineAudioContext は高コストなオブジェクトと考えるべきです。これらのオブジェクトの作成は、ハイプライオリティなスレッドの生成や低レイテンシのシステムオーディオストリームの利用を伴い、エネルギー消費に影響します。通常、ドキュメント内で複数のAudioContext を作成する必要はありません。

BaseAudioContext サブクラスの構築や再開は、そのコンテキスト用のシステムリソースの取得を伴います。AudioContext の場合、システムオーディオストリームの生成も必要です。これらの操作は、コンテキストが関連するオーディオグラフから出力の生成を開始するときに完了します。

さらに、ユーザーエージェントはAudioContext の最大数を独自に定義でき、それを超えるAudioContext の作成を試みると失敗し、NotSupportedErrorを投げます

suspendclose により、著者がスレッド、プロセス、オーディオストリームなどのシステムリソース解放を行えます。BaseAudioContext のサスペンドは、実装が一部リソースを解放でき、resume で後から再開可能です。AudioContext のクローズは全リソースの解放を許可し、以後再利用や再開はできません。

注: 例えば、これはオーディオコールバックが定期的に発火するのを待ったり、ハードウェアが処理準備完了するのを待つことを含みます。

1.2. AudioContext インターフェース

このインターフェースは、AudioDestinationNode がリアルタイム出力デバイスにルーティングされ、ユーザーへ信号を出力するオーディオグラフを表します。ほとんどのユースケースでは、1文書につき1つのAudioContext のみ使用されます。

enum AudioContextLatencyCategory {
        "balanced",
        "interactive",
        "playback"
};
AudioContextLatencyCategory 列挙型の説明
列挙値 説明
"balanced" オーディオ出力のレイテンシと消費電力のバランスを取る。
"interactive" グリッチを起こさず可能な限り低レイテンシでオーディオ出力を行う。これがデフォルト。
"playback" オーディオ出力のレイテンシよりも途切れのない持続的な再生を優先する。消費電力が最も低い。
enum AudioSinkType {
    "none"
};
AudioSinkType 列挙型の説明
列挙値 説明
"none" オーディオグラフはオーディオ出力デバイスで再生せずに処理されます。
[Exposed=Window]
interface AudioContext : BaseAudioContext {
    constructor (optional AudioContextOptions contextOptions = {});
    readonly attribute double baseLatency;
    readonly attribute double outputLatency;
    [SecureContext] readonly attribute (DOMString or AudioSinkInfo) sinkId;
    [SecureContext] readonly attribute AudioRenderCapacity renderCapacity;
    attribute EventHandler onsinkchange;
    attribute EventHandler onerror;
    AudioTimestamp getOutputTimestamp ();
    Promise<undefined> resume ();
    Promise<undefined> suspend ();
    Promise<undefined> close ();
    [SecureContext] Promise<undefined> setSinkId ((DOMString or AudioSinkOptions) sinkId);
    MediaElementAudioSourceNode createMediaElementSource (HTMLMediaElement mediaElement);
    MediaStreamAudioSourceNode createMediaStreamSource (MediaStream mediaStream);
    MediaStreamTrackAudioSourceNode createMediaStreamTrackSource (
        MediaStreamTrack mediaStreamTrack);
    MediaStreamAudioDestinationNode createMediaStreamDestination ();
};

AudioContext開始可能とは、ユーザーエージェントがコンテキスト状態を"suspended" から "running"へ遷移することを許可する場合を指します。 ユーザーエージェントはこの初回遷移を不許可にし、AudioContext関連グローバルオブジェクトスティッキーアクティベーションを持つ場合のみ許可することがあります。

AudioContext には以下の内部スロットがあります:

[[suspended by user]]

コンテキストがユーザーコードによってサスペンドされているかを示す真偽値フラグです。 初期値はfalseです。

[[sink ID]]

現在のオーディオ出力デバイスの識別子または情報を表すDOMString またはAudioSinkInfo です。初期値は""(デフォルトのオーディオ出力デバイス)です。

[[pending resume promises]]

resume() で生成された未処理Promise を格納する順序付きリストです。初期状態では空です。

1.2.1. コンストラクター

AudioContext(contextOptions)

現在の設定オブジェクト関連グローバルオブジェクト関連付けられたDocument完全有効でない場合は、 "InvalidStateError" を投げて処理を中断します。

AudioContext を作成する際、以下の手順を実行します:
  1. contextを新しいAudioContext オブジェクトとして生成します。

  2. context[[control thread state]]suspendedに設定します。

  3. context[[rendering thread state]]suspendedに設定します。

  4. messageChannelを新しいMessageChannelとして生成します。

  5. controlSidePortmessageChannelport1 属性値に設定します。

  6. renderingSidePortmessageChannelport2 属性値に設定します。

  7. serializedRenderingSidePortStructuredSerializeWithTransfer(renderingSidePort, « renderingSidePort »)の結果とします。

  8. audioWorkletportcontrolSidePortに設定します。

  9. コントロールメッセージのキューイング を行い、AudioContextGlobalScopeにMessagePortをセットします。 引数はserializedRenderingSidePortです。

  10. contextOptionsが指定されている場合、以下のサブ手順を実行します:

    1. sinkId が指定されている場合、sinkIdcontextOptions.sinkId の値として、以下のサブ手順を実行します:

      1. sinkId[[sink ID]] の両方がDOMString型で、 かつ値が等しい場合はサブ手順を中断します。

      2. sinkIdAudioSinkOptions型で、 [[sink ID]]AudioSinkInfo型で、 かつtype の値が等しい場合はサブ手順を中断します。

      3. validationResultsink識別子の検証の返り値とします。

      4. validationResultDOMException型の場合は、 validationResultで例外を投げてサブ手順を中断します。

      5. sinkIdDOMString型の場合、 [[sink ID]]sinkIdに設定し、サブ手順を中断します。

      6. sinkIdAudioSinkOptions型の場合、 [[sink ID]]type の値を使って新規作成したAudioSinkInfoインスタンスに設定します。

    2. contextOptions.latencyHint が指定されている場合は、latencyHint に記載された通り、contextの内部レイテンシを設定します。

    3. contextOptions.sampleRate が指定されている場合は、contextsampleRate をこの値に設定します。指定されていない場合は以下のサブ手順を実行します:

      1. sinkIdが空文字列、またはAudioSinkOptions型の場合は、 デフォルト出力デバイスのサンプルレートを使用し、サブ手順を中断します。

      2. sinkIdDOMString型の場合は、 sinkIdで識別される出力デバイスのサンプルレートを使用し、サブ手順を中断します。

      contextOptions.sampleRate が出力デバイスのサンプルレートと異なる場合、ユーザーエージェントは必ず音声出力を出力デバイスのサンプルレートにリサンプルする必要があります。

      注: リサンプリングが必要な場合、contextのレイテンシに大きく影響する場合があります。

  11. context開始可能の場合、処理開始のために 制御メッセージ を送信します。

  12. contextを返します。

コントロールメッセージによる処理開始とは以下の手順です:
  1. document現在の設定オブジェクト関連グローバルオブジェクト関連付けられたDocumentとする。

  2. [[sink ID]] に基づき、以下のオーディオ出力デバイス用にシステムリソースを取得する:

    • 空文字列ならデフォルトのオーディオ出力デバイス。

    • sinkIdで識別されるオーディオ出力デバイス。

    1. リソース取得に失敗した場合は以下の手順:

      1. document"speaker-selection"という機能の利用を許可されていなければ、サブ手順を中断。

      2. メディア要素タスクをキューイングして、error イベントをAudioContext に発火し、以下の手順を中断。

  3. this[[rendering thread state]]runningに設定。

  4. メディア要素タスクをキューイングして、以下を実行:

    1. state 属性をAudioContext で"running"に設定。

    2. statechangeイベントを発火。対象はAudioContext

注: AudioContext を引数なしで構築しリソース取得に失敗した場合、ユーザーエージェントはオーディオ出力デバイスをエミュレートする機構で音声グラフをサイレントレンダリングする場合があります。

コントロールメッセージMessagePortAudioWorkletGlobalScopeにセットする場合、以下の手順を レンダリングスレッドserializedRenderingSidePortを使って実行します(current Realmに転送済)。
  1. deserializedPortStructuredDeserialize(serializedRenderingSidePort, 現在のRealm)の結果とします。

  2. portdeserializedPortに設定します。

AudioContext.constructor(contextOptions) メソッドの引数。
パラメータ Nullable Optional 説明
contextOptions AudioContextOptions AudioContext の構築方法を制御するユーザー指定オプション。

1.2.2. 属性

baseLatency 型: double、読み取り専用

これはAudioContextAudioDestinationNode からオーディオサブシステムへ音声を渡す際に発生する処理レイテンシ(秒単位)を表します。他の処理による追加レイテンシ(AudioDestinationNode 出力~オーディオハードウェア間)や、オーディオグラフ自体によるレイテンシは含みません。

例えば、オーディオコンテキストが44.1kHzでデフォルトのレンダー量子サイズで動作し、AudioDestinationNode が内部でダブルバッファリングを実装し各レンダー量子毎に処理・出力できる場合、処理レイテンシは \((2\cdot128)/44100 = 5.805 \mathrm{ ms}\) 程度となります。

outputLatency 型: double、読み取り専用

オーディオ出力レイテンシの推定値(秒単位)。つまり、UAがホストシステムにバッファ再生を要求してから、バッファ内の最初のサンプルが実際にオーディオ出力デバイスで処理されるまでの間隔です。スピーカーやヘッドフォンなど、音響信号を生成するデバイスではこの時点はサンプルの音が出力されるタイミングです。

outputLatency 属性値はプラットフォームや接続されているオーディオ出力デバイスのハードウェアに依存します。outputLatency は、コンテキスト動作中や出力デバイスの変更時にも変化する場合があります。正確な同期が必要な場合はこの値を頻繁に取得するのが有効です。

renderCapacity 型: AudioRenderCapacity、読み取り専用

AudioContext に関連付けられたAudioRenderCapacity インスタンスを返します。

sinkId 型: (DOMString or AudioSinkInfo)、読み取り専用

[[sink ID]] 内部スロットの値を返します。この属性は更新時にキャッシュされ、キャッシュ後は同じオブジェクトを返します。

onsinkchange 型: EventHandler

setSinkId()イベントハンドラです。イベント型はsinkchangeで、出力デバイスの変更完了時に発火されます。

注: AudioContext の構築時の初回デバイス選択には発火されません。初期出力デバイスの準備確認にはstatechange イベントが利用できます。

onerror 型: EventHandler

EventAudioContext からディスパッチされたときのイベントハンドラです。 イベント型はerrorで、 以下の場合にUAがイベントを発火できます:

  • 選択したオーディオデバイスの初期化・有効化時に失敗した場合。

  • 関連付けられたオーディオ出力デバイスがAudioContext 動作中に切断された場合。

  • OSからオーディオデバイスの異常が報告された場合。

1.2.3. メソッド

close()

AudioContextを閉じて、使用中のシステムリソースを解放します。これによって すべてのAudioContext作成オブジェクトが自動的に解放されるわけではありませんが、 AudioContextcurrentTimeの進行を停止し、 音声データの処理を停止します。

close が呼ばれたとき、次の手順を実行します:
  1. this関連グローバルオブジェクト関連付けられた Document完全有効でない場合、"InvalidStateError" のDOMExceptionrejectされた promiseを返します。

  2. promise を新しい Promise とします。

  3. AudioContext上の[[control thread state]] フラグが closed の場合、InvalidStateErrorで promise を reject し、これらの手順を中断して promise を返します。

  4. AudioContext上の[[control thread state]] フラグを closed に設定します。

  5. コントロールメッセージをキューイングして AudioContextを閉じます。

  6. promise を返します。

コントロールメッセージを実行して AudioContextを閉じるとは、 レンダリングスレッドで次の手順を実行することを意味します:
  1. システムリソースの解放を試みます。

  2. [[rendering thread state]]suspended に設定します。

    これによりレンダリングは停止します。
  3. このコントロールメッセージがドキュメントのアンロードに対する反応として実行されている場合、 このアルゴリズムを中止します。

    この場合、コントロールスレッドへ通知する必要はありません。
  4. メディア要素タスクをキューイングして次の手順を実行します:

    1. promise を resolve します。

    2. AudioContextstate 属性がまだ "closed" でない場合:

      1. AudioContextstate 属性を "closed" に設定します。

      2. メディア要素タスクをキューイングして、イベントを発火 名称 statechangeAudioContext に対して行います。

AudioContextが閉じられると、 当該MediaStreamHTMLMediaElementAudioContextに接続されていた場合、その出力は無視されます。つまり、これらはスピーカーなどの出力デバイスに もはや出力を発生させません。挙動に柔軟性が必要な場合は、 HTMLMediaElement.captureStream() の使用を検討してください。

注: AudioContext が閉じられた場合、実装はサスペンド時よりも積極的にリソースを解放することを選択できます。

パラメータなし。
返却型: Promise<undefined>
createMediaElementSource(mediaElement)

MediaElementAudioSourceNodeを、 指定されたHTMLMediaElementから作成します。 このメソッド呼び出しの結果、当該HTMLMediaElementからの 音声再生は、AudioContextの処理グラフへと再ルーティングされます。

AudioContext.createMediaElementSource() メソッドの引数。
パラメータ Nullable Optional 説明
mediaElement HTMLMediaElement 再ルーティングされるメディア要素。
返却型: MediaElementAudioSourceNode
createMediaStreamDestination()

MediaStreamAudioDestinationNodeを作成します。

パラメータなし。
返却型: MediaStreamAudioDestinationNode
createMediaStreamSource(mediaStream)

MediaStreamAudioSourceNodeを作成します。

AudioContext.createMediaStreamSource() メソッドの引数。
パラメータ Nullable Optional 説明
mediaStream MediaStream ソースとして機能するメディアストリーム。
返却型: MediaStreamAudioSourceNode
createMediaStreamTrackSource(mediaStreamTrack)

MediaStreamTrackAudioSourceNodeを作成します。

AudioContext.createMediaStreamTrackSource() メソッドの引数。
パラメータ Nullable Optional 説明
mediaStreamTrack MediaStreamTrack ソースとして機能するMediaStreamTrackその kind 属性の値は "audio" と等しくなければならず、そうでない場合は InvalidStateError 例外を必ず投げます。
返却型: MediaStreamTrackAudioSourceNode
getOutputTimestamp()

新しい AudioTimestamp インスタンスを返します。 これはコンテキストに関する2つの関連するオーディオストリーム位置を含みます。contextTime メンバーは、オーディオ出力デバイスによって現在レンダリングされているサンプルフレームの時刻(すなわち出力オーディオストリームの位置)を、 コンテキストのcurrentTimeと同じ単位および原点で保持します。 performanceTime メンバーは、保存された contextTime に対応するサンプルフレームがオーディオ出力デバイスによってレンダリングされた時刻を、 performance.now()[hr-time-3] 参照)と同じ単位および原点で推定した値を保持します。

コンテキストのレンダリンググラフがまだオーディオブロックを処理していない場合、getOutputTimestamp 呼び出しは、両方のメンバーがゼロを含む AudioTimestamp インスタンスを返します。

コンテキストのレンダリンググラフがオーディオブロックの処理を開始した後は、currentTime 属性の値は常に、contextTime の値(getOutputTimestamp の呼び出しで取得)を上回ります。

getOutputTimestamp から返される値を利用して、やや先のコンテキスト時間に対するパフォーマンスタイムの推定値を得られます:
function outputPerformanceTime(contextTime) {
    const timestamp = context.getOutputTimestamp();
    const elapsedTime = contextTime - timestamp.contextTime;
    return timestamp.performanceTime + elapsedTime * 1000;
}

上の例では、推定の精度は引数の値が現在の出力オーディオストリーム位置にどれだけ近いかに依存します。与えた contextTimetimestamp.contextTime に近いほど、得られる推定の精度は高くなります。

注: コンテキストの currentTime と、contextTimegetOutputTimestamp 呼び出しで取得)の差は、 信頼できる出力レイテンシの推定とは見なせません。これは currentTime が不均一な時間間隔で増分されうるためであり、代わりに outputLatency 属性を使用すべきです。

パラメータなし。
返却型: AudioTimestamp
resume()

サスペンドされている場合に、AudioContextcurrentTime の進行を再開します。

resume が呼ばれたとき、次の手順を実行します:
  1. this関連グローバルオブジェクト関連付けられた Document完全有効でない場合、"InvalidStateError" のDOMExceptionrejectされた promiseを返します。

  2. promise を新しい Promise とします。

  3. AudioContext上の[[control thread state]]closed の場合、InvalidStateErrorで promise を reject し、これらの手順を中断して promise を返します。

  4. [[suspended by user]]false に設定します。

  5. contextが開始可能でない場合、promise[[pending promises]]および[[pending resume promises]]に追加し、これらの手順を中止してpromiseを返します。

  6. AudioContext上の[[control thread state]]running に設定します。

  7. コントロールメッセージをキューイングして AudioContextの再開を行います。

  8. promise を返します。

コントロールメッセージを実行して AudioContextを再開するとは、 レンダリングスレッドで次の手順を実行することを意味します:
  1. システムリソースの取得を試みます。

  2. AudioContext上の [[rendering thread state]]running に設定します。

  3. オーディオグラフのレンダリングを開始します。

  4. 失敗した場合、 メディア要素タスクをキューイングして次の手順を実行します:

    1. [[pending resume promises]] のすべての promise を順に reject し、その後 [[pending resume promises]] をクリアします。

    2. 加えて、それらの promise を [[pending promises]] から削除します。

  5. メディア要素タスクをキューイングして次の手順を実行します:

    1. [[pending resume promises]] のすべての promise を順に resolve します。

    2. [[pending resume promises]] をクリアし、さらにそれらの promise を [[pending promises]] から削除します。

    3. promise を resolve します。

    4. AudioContextstate 属性がまだ "running" でない場合:

      1. AudioContextstate 属性を "running" に設定します。

      2. メディア要素タスクをキューイングして、 イベントを発火 名称 statechangeAudioContext に対して行います。

パラメータなし。
返却型: Promise<undefined>
suspend()

AudioContextcurrentTime の進行をサスペンドし、すでに処理済みの現在のコンテキスト処理ブロックが出力先へ再生されることを許可した後、システムがオーディオハードウェアに対する占有を解放できるようにします。 これはアプリケーションがしばらくの間AudioContextを必要としないことが分かっている場合に、 当該AudioContextに関連するシステムリソースの一時的な解放を行うのに有用です。promise はフレームバッファが空(ハードウェアへ引き渡された)になったときに解決され、 すでにコンテキストが suspended の場合は即座に(他の効果なしで)解決されます。コンテキストが閉じられている場合は promise は reject されます。

suspend が呼ばれたとき、次の手順を実行します:
  1. this関連グローバルオブジェクト関連付けられた Document完全有効でない場合、"InvalidStateError" のDOMExceptionrejectされた promiseを返します。

  2. promise を新しい Promise とします。

  3. AudioContext上の[[control thread state]]closed の場合、InvalidStateErrorで promise を reject し、これらの手順を中断して promise を返します。

  4. promise[[pending promises]] に追加します。

  5. [[suspended by user]]true に設定します。

  6. AudioContext上の [[control thread state]]suspended に設定します。

  7. コントロールメッセージをキューイングして AudioContextをサスペンドします。

  8. promise を返します。

コントロールメッセージを実行して AudioContextをサスペンドするとは、 レンダリングスレッドで次の手順を実行することを意味します:
  1. システムリソースの解放を試みます。

  2. AudioContext上の [[rendering thread state]]suspended に設定します。

  3. メディア要素タスクをキューイングして次の手順を実行します:

    1. promise を resolve します。

    2. AudioContextstate 属性がまだ "suspended" でない場合:

      1. AudioContextstate 属性を "suspended" に設定します。

      2. メディア要素タスクをキューイングして、 イベントを発火 名称 statechangeAudioContext に対して行います。

AudioContextがサスペンドされている間、 MediaStreamの出力は無視されます。 つまり、メディアストリームのリアルタイム性によりデータは失われます。HTMLMediaElement も同様に、システムが再開されるまで出力は無視されます。AudioWorkletNodeScriptProcessorNode は、サスペンド中は処理ハンドラの呼び出しが行われなくなりますが、コンテキストの再開時に処理も再開します。AnalyserNode のウィンドウ関数の観点では、 データは連続したストリームとみなされます。つまり resume()/suspend()AnalyserNode のデータストリーム中に無音を発生させません。 特に、AudioContextがサスペンドされているときに AnalyserNode の関数を繰り返し呼び出すと、 同じデータを返さなければなりません。

パラメータなし。
返却型: Promise<undefined>
setSinkId((DOMString or AudioSinkOptions) sinkId)

出力デバイスの識別子を設定します。このメソッドが呼び出されたとき、ユーザーエージェントは次の手順を実行しなければなりません:

  1. sinkId をこのメソッドの第1引数とします。

  2. sinkId[[sink ID]] と等しい場合、promise を返し、即座に resolve してこれらの手順を中断します。

  3. validationResultsink 識別子の検証(引数 sinkId)の戻り値とします。

  4. validationResultnull でない場合、validationResult で reject された promise を返して、これらの手順を中断します。

  5. p を新しい promise とします。

  6. psinkId を伴うコントロールメッセージを送って、処理を開始します。

  7. p を返します。

setSinkId() 実行中に処理を開始するためにコントロールメッセージを送るとは、 次の手順を実行することを意味します:
  1. p をこのアルゴリズムに渡された promise とします。

  2. sinkId をこのアルゴリズムに渡された sink 識別子とします。

  3. sinkId[[sink ID]] の両方が DOMString 型で、 かつ互いに等しい場合、 メディア要素タスクをキューイングして p を resolve し、これらの手順を中断します。

  4. sinkIdAudioSinkOptions 型で、 [[sink ID]]AudioSinkInfo 型であり、 さらに sinkIdtypetype[[sink ID]] 内)が等しい場合、 メディア要素タスクをキューイングして p を resolve し、これらの手順を中断します。

  5. wasRunning を true とします。

  6. AudioContext上の [[rendering thread state]]"suspended" の場合、wasRunning を false に設定します。

  7. 現在のレンダー量子の処理後にレンダラーを一時停止します。

  8. システムリソースの解放を試みます。

  9. wasRunning が true の場合:

    1. AudioContext上の [[rendering thread state]]"suspended" に設定します。

    2. メディア要素タスクをキューイングして次の手順を実行します:

      1. AudioContextstate 属性がまだ "suspended" でない場合:

        1. AudioContextstate 属性を "suspended" に設定します。

        2. イベントを発火 名称 statechange を、関連する AudioContext に対して行います。

  10. [[sink ID]] に基づいて、レンダリングに使用する次のオーディオ出力デバイス用のシステムリソースを取得することを試みます:

    • 空文字列の場合はデフォルトのオーディオ出力デバイス。

    • [[sink ID]]で識別されるオーディオ出力デバイス。

    失敗した場合、"InvalidAccessError" で p を reject し、以降の手順を中断します。

  11. メディア要素タスクをキューイングして次の手順を実行します:

    1. sinkIdDOMString 型である場合、 [[sink ID]]sinkId に設定します。これらの手順を中断します。

    2. sinkIdAudioSinkOptions 型で、 [[sink ID]]DOMString 型である場合、 [[sink ID]] を、sinkIdtype の値で作成した新しい AudioSinkInfo インスタンスに設定します。

    3. sinkIdAudioSinkOptions 型で、 [[sink ID]]AudioSinkInfo 型である場合、 type[[sink ID]] 内)を sinkIdtype の値に設定します。

    4. p を resolve します。

    5. イベントを発火 名称 sinkchange を、関連する AudioContext に対して行います。

  12. wasRunning が true の場合:

    1. AudioContext上の [[rendering thread state]]"running" に設定します。

    2. メディア要素タスクをキューイングして次の手順を実行します:

      1. AudioContextstate 属性がまだ "running" でない場合:

        1. AudioContextstate 属性を "running" に設定します。

        2. イベントを発火 名称 statechange を、関連する AudioContext に対して行います。

1.2.4. sinkIdの検証

このアルゴリズムは、sinkIdを変更するために提供された情報を検証するために使用されます:

  1. documentを、現在の設定オブジェクトの関連付けられたDocumentとします。

  2. sinkIdArgをこのアルゴリズムに渡された値とします。

  3. document"speaker-selection"という機能の利用を許可されていない場合は、 名前が"NotAllowedError" の新しいDOMExceptionを返します。

  4. sinkIdArgDOMString 型であり、空文字列でない、またはenumerateDevices() の結果として識別されるオーディオ出力デバイスのいずれにも一致しない場合は、 名前が"NotFoundError" の新しいDOMExceptionを返します。

  5. nullを返します。

1.2.5. AudioContextOptions

AudioContextOptions 辞書は、AudioContextのユーザー指定オプションを指定するために使用されます。

dictionary AudioContextOptions {
    (AudioContextLatencyCategory or double) latencyHint = "interactive";
    float sampleRate;
    (DOMString or AudioSinkOptions) sinkId;
    (AudioContextRenderSizeCategory or unsigned long) renderSizeHint = "default";
};
1.2.5.1. 辞書 AudioContextOptions メンバー
latencyHint 型: (AudioContextLatencyCategory or double)、デフォルトは "interactive"

再生の種類を識別し、オーディオ出力レイテンシと消費電力のトレードオフに影響します。

latencyHintの推奨値はAudioContextLatencyCategory の値ですが、細かい制御が必要な場合は秒数(double型)も指定可能です。ブラウザはこの数値を適切に解釈します。実際に使用されるレイテンシはbaseLatency 属性で示されます。

sampleRate 型: float

作成されるAudioContextsampleRate をこの値に設定します。サポートされる値はAudioBufferのサンプルレートと同じです。 指定したサンプルレートがサポートされていない場合はNotSupportedError 例外を必ず投げなければなりません。

sampleRate を指定しない場合、このAudioContext 用の出力デバイスの推奨サンプルレートが使用されます。

sinkId 型: (DOMString or AudioSinkOptions)

オーディオ出力デバイスの識別子または関連情報。詳細はsinkId参照。

renderSizeHint 型: (AudioContextRenderSizeCategory or unsigned long)、デフォルトは "default"

整数を指定した場合は特定のレンダー量子サイズを要求できます。何も指定しない場合や"default"の場合はデフォルト(128フレーム)を使用します。"hardware"の場合はユーザーエージェントが最適なレンダー量子サイズを選択します。

これはヒントであり、必ずしも反映されるとは限りません。

1.2.6. AudioSinkOptions

AudioSinkOptions 辞書は、sinkId用のオプション指定に使用されます。

dictionary AudioSinkOptions {
    required AudioSinkType type;
};
1.2.6.1. 辞書 AudioSinkOptions メンバー
type 型: AudioSinkType

デバイス種別を指定するためのAudioSinkType の値。

1.2.7. AudioSinkInfo

AudioSinkInfo インターフェースは、sinkId経由で現在のオーディオ出力デバイス情報を取得するために使用されます。

[Exposed=Window]
interface AudioSinkInfo {
    readonly attribute AudioSinkType type;
};
1.2.7.1. 属性
type 型: AudioSinkType、読み取り専用

デバイス種別を表すAudioSinkTypeの値。

1.2.8. AudioTimestamp

dictionary AudioTimestamp {
    double contextTime;
    DOMHighResTimeStamp performanceTime;
};
1.2.8.1. 辞書 AudioTimestamp メンバー
contextTime 型: double

BaseAudioContextのcurrentTime の時間座標系上の時点を表します。

performanceTime 型: DOMHighResTimeStamp

Performanceインターフェース実装の時間座標系上の時点を表します([hr-time-3]参照)。

1.2.9. AudioRenderCapacity

[Exposed=Window]
interface AudioRenderCapacity : EventTarget {
    undefined start(optional AudioRenderCapacityOptions options = {});
        undefined stop();
        attribute EventHandler onupdate;
};

このインターフェースはAudioContext のレンダリング性能指標を提供します。指標計算のため、レンダラーは負荷値システムレベルオーディオコールバックごとに収集します。

1.2.9.1. 属性
onupdate 型: EventHandler

このイベントハンドラのイベント型はupdateです。 ハンドラにディスパッチされるイベントはAudioRenderCapacityEventインターフェースを使用します。

1.2.9.2. メソッド
start(options)

指標収集・分析を開始します。指定した更新間隔でAudioRenderCapacityEvent を使い、AudioRenderCapacityに対してupdateイベントを繰り返し発火します。 更新間隔はAudioRenderCapacityOptionsで指定します。

stop()

指標収集・分析を停止します。また、updateイベントのディスパッチも停止します。

1.2.10. AudioRenderCapacityOptions

AudioRenderCapacityOptions 辞書は、AudioRenderCapacity用のユーザーオプション指定に利用できます。

dictionary AudioRenderCapacityOptions {
        double updateInterval = 1;
};
1.2.10.1. 辞書 AudioRenderCapacityOptions メンバー
updateInterval 型: double、デフォルトは1

AudioRenderCapacityEventのディスパッチ間隔(秒単位)。 負荷値システムレベルオーディオコールバックごとに計算され、指定された間隔期間中に複数の負荷値が収集されます。例えば、レンダラーが48kHzのサンプルレートで動作し、システムレベルオーディオコールバックのバッファサイズが192フレームの場合、1秒間隔で250個の負荷値が収集されます。

指定値がシステムレベルオーディオコールバックの期間より小さい場合、NotSupportedError が投げられます。

1.2.11. AudioRenderCapacityEvent

[Exposed=Window]
interface AudioRenderCapacityEvent : Event {
    constructor (DOMString type, optional AudioRenderCapacityEventInit eventInitDict = {});
        readonly attribute double timestamp;
        readonly attribute double averageLoad;
        readonly attribute double peakLoad;
        readonly attribute double underrunRatio;
};

dictionary AudioRenderCapacityEventInit : EventInit {
    double timestamp = 0;
    double averageLoad = 0;
    double peakLoad = 0;
    double underrunRatio = 0;
};
1.2.11.1. 属性
timestamp 型: double、読み取り専用

データ収集期間の開始時刻(関連AudioContextcurrentTime基準)。

averageLoad 型: double、読み取り専用

指定した更新間隔内で収集された負荷値の平均。精度は1/100単位まで。

peakLoad 型: double、読み取り専用

指定した更新間隔内で収集された負荷値の最大値。精度も1/100単位まで。

underrunRatio 型: double、読み取り専用

指定した更新間隔内において、バッファアンダーラン(負荷値が1.0を超えた場合)の回数とシステムレベルオーディオコールバック総数の比率。

\(u\) をバッファアンダーラン回数、\(N\) を指定した更新間隔内のシステムレベルオーディオコールバック総数とした場合、バッファアンダーラン比は以下の通り:

  • \(u\) = 0 の場合は 0.0。

  • それ以外の場合は \(u/N\) を計算し、最も近い100分位の天井値を取る。

1.3. OfflineAudioContext インターフェース

OfflineAudioContext は、BaseAudioContext の特殊な型であり、レンダリングやミックスダウンを(リアルタイムより)高速に行うためのものです。オーディオハードウェアへはレンダリングせず、可能な限り高速にレンダリングを行い、レンダリング結果をAudioBufferとしてpromiseで返します。

[Exposed=Window]
interface OfflineAudioContext : BaseAudioContext {
    constructor(OfflineAudioContextOptions contextOptions);
    constructor(unsigned long numberOfChannels, unsigned long length, float sampleRate);
    Promise<AudioBuffer> startRendering();
    Promise<undefined> resume();
    Promise<undefined> suspend(double suspendTime);
    readonly attribute unsigned long length;
    attribute EventHandler oncomplete;
};

1.3.1. コンストラクター

OfflineAudioContext(contextOptions)

現在の設定オブジェクト関連グローバルオブジェクト関連付けられたDocument完全有効でない場合は、 InvalidStateError を投げて処理を中断します。

cを新しいOfflineAudioContext オブジェクトとします。 cを以下のように初期化します:
  1. c上の[[control thread state]]"suspended" に設定します。

  2. c上の[[rendering thread state]]"suspended" に設定します。

  3. このOfflineAudioContext[[render quantum size]]renderSizeHint の値で決定します:

    1. 値が "default" または "hardware" の場合は、 [[render quantum size]] プライベートスロットを128に設定します。

    2. 整数値を渡した場合は、ユーザーエージェントがこの値を反映するか決定し、 [[render quantum size]] プライベートスロットに設定します。

  4. AudioDestinationNodecontextOptions.numberOfChannelschannelCountを設定して構築します。

  5. messageChannelを新しいMessageChannelとします。

  6. controlSidePortmessageChannelport1属性値にします。

  7. renderingSidePortmessageChannelport2属性値にします。

  8. serializedRenderingSidePortStructuredSerializeWithTransfer(renderingSidePort, « renderingSidePort »)の結果にします。

  9. このaudioWorkletport属性をcontrolSidePortに設定します。

  10. コントロールメッセージのキューイングを行い、 AudioContextGlobalScopeにMessagePortをセットします。 引数はserializedRenderingSidePort

OfflineAudioContext.constructor(contextOptions) メソッドの引数。
パラメータ Nullable Optional 説明
contextOptions このコンテキストを構築するために必要な初期パラメータ。
OfflineAudioContext(numberOfChannels, length, sampleRate)

OfflineAudioContext は AudioContext.createBuffer と同じ引数で構築可能です。いずれかの引数が負、ゼロ、あるいは規定範囲外の場合はNotSupportedError 例外を必ず投げなければなりません。

OfflineAudioContextは、以下の呼び出しと同じように構築されます:

new OfflineAudioContext({
        numberOfChannels: numberOfChannels,
        length: length,
        sampleRate: sampleRate
})

が呼ばれた場合と同等です。

OfflineAudioContext.constructor(numberOfChannels, length, sampleRate)メソッドの引数。
パラメータ Nullable Optional 説明
numberOfChannels unsigned long バッファのチャンネル数を決定します。対応チャンネル数はcreateBuffer()参照。
length unsigned long バッファのサイズ(サンプルフレーム数)。
sampleRate float バッファ内のリニアPCMオーディオデータのサンプルレート(秒間サンプルフレーム数)。有効な値はcreateBuffer()参照。

1.3.2. 属性

length 型: unsigned long、読み取り専用

バッファのサイズ(サンプルフレーム数)。これはコンストラクタのlengthパラメータと同じ値です。

oncomplete 型: EventHandler

このイベントハンドラのイベント型はcompleteです。ハンドラにディスパッチされるイベントはOfflineAudioCompletionEventインターフェースを使用します。これはOfflineAudioContext上で最後に発火されるイベントです。

1.3.3. メソッド

startRendering()

現在の接続およびスケジュール済みの変更に基づいて、オーディオのレンダリングを開始します。

レンダリングされたオーディオデータを取得する主な方法はプロミスの返り値ですが、インスタンスはレガシー理由によりcompleteというイベントも発火します。

[[rendering started]] は、この OfflineAudioContext の内部スロットである。 このスロットを false に初期化する。

startRendering が呼び出されたとき、以下の手順を コントロールスレッド で実行しなければならない:

  1. this関連グローバルオブジェクト関連付けられた Document完全にアクティブ でない場合、プロミスを拒否して返す。理由は "InvalidStateError" DOMException である。
  2. [[rendering started]] スロットが OfflineAudioContext 上で true の場合、プロミスを InvalidStateError で拒否して返し、これらの手順を中断する。
  3. [[rendering started]] スロットを OfflineAudioContext 上で true に設定する。
  4. promise を新しいプロミスとして作成する。
  5. AudioBuffer を新規作成し、チャンネル数・長さ・サンプルレートはこのインスタンスのコンストラクタで contextOptions パラメータに渡された numberOfChannelslengthsampleRate と同じ値で設定する。 このバッファを内部スロット [[rendered buffer]] に割り当てる。
  6. 前述の AudioBuffer コンストラクタ呼び出し中に例外が発生した場合、promise をその例外で拒否する。
  7. バッファが正常に構築された場合、オフラインレンダリングを開始する。
  8. promise[[pending promises]] に追加する。
  9. promise を返す。
オフラインレンダリングを開始 するには、以下の手順をこのために作成された レンダリングスレッド で実行しなければならない。
  1. 現在の接続とスケジュール済みの変更に基づいて、length サンプルフレーム分のオーディオを [[rendered buffer]] にレンダリングする。
  2. レンダー量子 において、suspend が必要か確認する。
  3. サスペンドされたコンテキストが再開された場合、バッファのレンダリングを続行する。
  4. レンダリング完了後、メディア要素タスクをキューに追加し、以下の手順を実行する:
    1. startRendering() で作成した promise[[rendered buffer]] で解決する。
    2. メディア要素タスクをキューに追加し、complete イベントを発火する。イベントは OfflineAudioContext 上で発火され、OfflineAudioCompletionEvent を使い、renderedBuffer プロパティを [[rendered buffer]] に設定する。
パラメータなし。
返り値型: Promise<AudioBuffer>
resume()

OfflineAudioContextcurrentTime がサスペンドされている場合、その進行を再開します。

resume が呼び出されたとき、以下の手順を実行する:
  1. this関連グローバルオブジェクト関連付けられた Document完全にアクティブ でない場合、プロミスを拒否して返す。理由は "InvalidStateError" DOMException である。

  2. promise を新しい Promise として作成する。

  3. 次のいずれかの条件が true の場合、これらの手順を中断し promiseInvalidStateError で拒否する:

  4. [[control thread state]] フラグを OfflineAudioContext 上で running に設定する。

  5. コントロールメッセージをキューに追加OfflineAudioContext を再開する。

  6. promise を返す。

コントロールメッセージを実行して OfflineAudioContext を再開するには、以下の手順を レンダリングスレッド で実行する:
  1. [[rendering thread state]]OfflineAudioContext 上で running に設定する。

  2. オーディオグラフのレンダリング を開始する。

  3. 失敗した場合は、メディア要素タスクをキューに追加し、promise を拒否して残りの手順を中断する。

  4. メディア要素タスクをキューに追加して以下の手順を実行する:

    1. promise を解決する。

    2. state 属性が OfflineAudioContext 上で まだ "running" でない場合:

      1. state 属性を OfflineAudioContext 上で "running" に設定する。

      2. メディア要素タスクをキューに追加し、statechange イベントを発火する。イベントは OfflineAudioContext 上で発火される。

パラメータなし。
返り値型: Promise<undefined>
suspend(suspendTime)

指定した時間にオーディオコンテキストの時間進行のサスペンドをスケジュールし、プロミスを返します。これは OfflineAudioContext のオーディオグラフを同期的に操作する際に一般的に便利です。

サスペンドの最大精度は レンダー量子 のサイズであり、指定したサスペンド時間は最も近い レンダー量子 境界に切り上げられます。そのため、同じ量子化フレームで複数のサスペンドをスケジュールすることはできません。また、正確なサスペンドのためにはコンテキストが実行中でない間にスケジューリングするべきです。

OfflineAudioContext.suspend() メソッドの引数
パラメータ Nullable Optional 説明
suspendTime double 指定した時間でレンダリングのサスペンドをスケジュールします。時間は量子化され、レンダー量子のサイズに切り上げられます。量子化されたフレーム番号が
  1. 負の値である場合
  2. 現在時刻以下である場合
  3. 合計レンダー期間以上である場合
  4. 同じ時間に他の suspend がスケジュールされている場合
プロミスは InvalidStateError で拒否されます。
返り値型: Promise<undefined>

1.3.4. OfflineAudioContextOptions

これは OfflineAudioContext の構築時に使用するオプションを指定します。

dictionary OfflineAudioContextOptions {
    unsigned long numberOfChannels = 1;
    required unsigned long length;
    required float sampleRate;
    (AudioContextRenderSizeCategory or unsigned long) renderSizeHint = "default";
};
1.3.4.1. 辞書 OfflineAudioContextOptions のメンバー
length, unsigned long

レンダリングされた AudioBuffer のサンプルフレーム数です。

numberOfChannels, unsigned long, デフォルト値は 1

この OfflineAudioContext のチャンネル数です。

sampleRate, float

この OfflineAudioContext のサンプルレートです。

renderSizeHint, (AudioContextRenderSizeCategory or unsigned long), デフォルト値は "default"

この OfflineAudioContextレンダー量子サイズのヒントです。

1.3.5. OfflineAudioCompletionEvent インターフェース

これは Event オブジェクトであり、レガシー理由により OfflineAudioContext にディスパッチされます。

[Exposed=Window]
interface OfflineAudioCompletionEvent : Event {
    constructor (DOMString type, OfflineAudioCompletionEventInit eventInitDict);
    readonly attribute AudioBuffer renderedBuffer;
};
1.3.5.1. 属性
renderedBuffer, AudioBuffer, 読み取り専用

レンダリングされたオーディオデータを含む AudioBuffer です。

1.3.5.2. OfflineAudioCompletionEventInit
dictionary OfflineAudioCompletionEventInit : EventInit {
    required AudioBuffer renderedBuffer;
};
1.3.5.2.1. 辞書 OfflineAudioCompletionEventInit のメンバー
renderedBuffer, AudioBuffer

イベントの renderedBuffer 属性に割り当てる値です。

1.4. AudioBuffer インターフェース

このインターフェースはメモリ上のオーディオアセットを表します。1つ以上のチャンネルを持つことができ、各チャンネルは32ビット浮動小数点のリニアPCM値で、名目上の範囲は\([-1,1]\)ですが、値がこの範囲に制限されているわけではありません。通常、PCMデータの長さはかなり短い(たいてい1分未満)ことが期待されます。 より長い音声(音楽のサウンドトラックなど)には、audio要素やMediaElementAudioSourceNodeを用いたストリーミングを使用してください。

AudioBufferは 1つ以上のAudioContextで利用でき、 OfflineAudioContextAudioContext間で共有できます。

AudioBufferには4つの内部スロットがあります:

[[number of channels]]

このAudioBufferのオーディオチャンネル数(unsigned long)。

[[length]]

このAudioBufferの各チャンネルの長さ(unsigned long)。

[[sample rate]]

このAudioBufferのサンプルレート(Hz、float)。

[[internal data]]

オーディオサンプルデータを保持するデータブロック

[Exposed=Window]
interface AudioBuffer {
    constructor (AudioBufferOptions options);
    readonly attribute float sampleRate;
    readonly attribute unsigned long length;
    readonly attribute double duration;
    readonly attribute unsigned long numberOfChannels;
    Float32Array getChannelData (unsigned long channel);
    undefined copyFromChannel (Float32Array destination,
                               unsigned long channelNumber,
                               optional unsigned long bufferOffset = 0);
    undefined copyToChannel (Float32Array source,
                             unsigned long channelNumber,
                             optional unsigned long bufferOffset = 0);
};

1.4.1. コンストラクタ

AudioBuffer(options)
  1. options の値が名目上の範囲外の場合は、NotSupportedError 例外を投げて以降の手順を中断します。

  2. b を新しい AudioBufferオブジェクトとして作成します。

  3. コンストラクタに渡されたAudioBufferOptionsnumberOfChannels, length, sampleRate の値を、それぞれ内部スロット[[number of channels]], [[length]], [[sample rate]]に割り当てます。

  4. このAudioBufferの内部スロット[[internal data]] CreateByteDataBlock([[length]] * [[number of channels]])の呼び出し結果に設定します。

    注:これは基礎となるストレージをゼロで初期化します。

  5. b を返します。

AudioBuffer.constructor() メソッドの引数。
パラメータ Nullable Optional 説明
options AudioBufferOptions このAudioBufferのプロパティを決定するAudioBufferOptions

1.4.2. 属性

duration, double, 読み取り専用

PCMオーディオデータの長さ(秒単位)。

これは[[sample rate]][[length]]の値を使い、 AudioBufferについて [[length]][[sample rate]]で割って算出します。

length, unsigned long, 読み取り専用

PCMオーディオデータの長さ(サンプルフレーム数)。これは[[length]]の値を返す必要があります。

numberOfChannels, unsigned long, 読み取り専用

離散的なオーディオチャンネル数。この値は[[number of channels]]の値を返す必要があります。

sampleRate, float, 読み取り専用

PCMオーディオデータのサンプルレート(1秒あたりのサンプル数)。この値は[[sample rate]]の値を返す必要があります。

1.4.3. メソッド

copyFromChannel(destination, channelNumber, bufferOffset)

copyFromChannel() メソッドは、指定されたチャンネルのAudioBufferから destination配列へサンプルをコピーします。

bufferAudioBuffer(フレーム数\(N_b\))とし、destination配列の要素数を\(N_f\)、bufferOffsetの値を\(k\)とします。 コピーされるフレーム数は \(\max(0, \min(N_b - k, N_f))\)です。これが\(N_f\)未満の場合、残りのdestinationの要素は 変更されません。

AudioBuffer.copyFromChannel() メソッドの引数。
パラメータ Nullable Optional 説明
destination Float32Array チャンネルデータがコピーされる配列。
channelNumber unsigned long コピー元のチャンネルのインデックス。channelNumberAudioBufferの チャンネル数以上の場合、IndexSizeError を必ず投げる必要があります
bufferOffset unsigned long オプションのオフセット。デフォルトは0です。AudioBufferのこのオフセットから destination へデータがコピーされます。
返り値型: undefined
copyToChannel(source, channelNumber, bufferOffset)

copyToChannel() メソッドはsource配列から 指定されたチャンネルのAudioBufferへサンプルをコピーします。

UnknownError は、sourceが バッファにコピーできない場合に投げられることがあります。

bufferAudioBuffer(フレーム数\(N_b\))、source配列の要素数を\(N_f\)、bufferOffsetの値を\(k\)とします。 コピーされるフレーム数は \(\max(0, \min(N_b - k, N_f))\)です。これが\(N_f\)未満の場合、残りのbufferの要素は変更されません。

AudioBuffer.copyToChannel() メソッドの引数。
パラメータ Nullable Optional 説明
source Float32Array チャンネルデータのコピー元となる配列。
channelNumber unsigned long データをコピーするチャンネルのインデックス。channelNumberAudioBufferの チャンネル数以上の場合、IndexSizeError を必ず投げる必要があります
bufferOffset unsigned long オプションのオフセット。デフォルトは0です。sourceのデータが AudioBufferのこのオフセットからコピーされます。
返り値型: undefined
getChannelData(channel)

acquire the contentで記載されたルールに従い、書き込みを許可するか、 またはコピーを取得して、[[internal data]]内のバイトを新しいFloat32Arrayで返します。

UnknownError は、[[internal data]]や新しいFloat32Arrayが 作成できない場合に投げられることがあります。

AudioBuffer.getChannelData() メソッドの引数。
パラメータ Nullable Optional 説明
channel unsigned long データ取得対象となるチャンネルを表すインデックス。0は最初のチャンネル。このインデックス値は[[number of channels]]未満でなければならず、 そうでなければIndexSizeError 例外を必ず投げる必要があります。
返り値型: Float32Array

注: copyToChannel()およびcopyFromChannel()は、 Float32Arrayで より大きな配列の一部を埋めるために利用できます。AudioBufferのチャンネルから データを読み出し、チャンク単位で処理する場合は、copyFromChannel()getChannelData()で 取得した配列を直接アクセスするより優先して使うべきです。不要なメモリ割り当てやコピーを回避できる場合があります。

内部操作acquire the contents of an AudioBufferは、 AudioBufferの 内容がAPI実装で必要な場合に呼び出されます。この操作は呼び出し元に不変なチャンネルデータを返します。

AudioBufferacquire the content操作が発生した場合、以下の手順を実行します:
  1. AudioBufferArrayBufferdetachedであれば、trueを返して手順を中断し、 呼び出し元に長さ0のチャンネルデータバッファを返す。

  2. このAudioBufferで 以前getChannelData() で返された配列のArrayBufferDetachする。

    注: AudioBuffercreateBuffer()または AudioBufferの コンストラクタでのみ作成されるため、これは例外を投げません。

  3. それら[[internal data]]の 基礎となるストレージを保持し、呼び出し元にその参照を返す。

  4. データのコピーを含むArrayBufferAudioBufferに アタッチし、次回getChannelData()呼び出し時に返す。

acquire the contents of an AudioBuffer操作は以下の場合に呼び出されます:

注: copyToChannel()AudioBufferの 内容がAudioNodeacquire the content of an AudioBufferで取得された場合、その内容を変更することはできません。 AudioNodeは 取得時点のデータを引き続き使用します。

1.4.4. AudioBufferOptions

これはAudioBufferの構築時に使用するオプションを指定します。 lengthsampleRateメンバーは 必須です。

dictionary AudioBufferOptions {
    unsigned long numberOfChannels = 1;
    required unsigned long length;
    required float sampleRate;
};
1.4.4.1. 辞書 AudioBufferOptions のメンバー

この辞書のメンバーに許可される値は制約されています。createBuffer() を参照してください。

length, unsigned long

バッファのサンプルフレーム数。制約についてはlength を参照してください。

numberOfChannels, unsigned long, デフォルト値は1

バッファのチャンネル数。制約についてはnumberOfChannels を参照してください。

sampleRate, float

バッファのサンプルレート(Hz)。制約についてはsampleRate を参照してください。

1.5. AudioNode インターフェース

AudioNodeAudioContext の構成要素です。このインターフェースは オーディオソース、オーディオ出力先、および中間処理モジュールを表します。これらのモジュールは相互に接続することで処理グラフを形成し、 オーディオハードウェアへのレンダリングを行います。各ノードは入力出力を持つことができます。ソースノードは入力を持たず出力は1つです。フィルターなどのほとんどの処理ノードは入力1つ、出力1つとなります。各AudioNodeの 音声処理や合成の詳細は異なりますが、一般的にAudioNodeは 入力(ある場合)を処理し、出力(ある場合)用の音声を生成します。

各出力は1つ以上のチャンネルを持ちます。正確なチャンネル数は個々のAudioNodeの詳細によります。

出力は1つ以上のAudioNodeの 入力に接続できるため、ファンアウトがサポートされています。入力は最初は接続がありませんが、1つ以上のAudioNodeの 出力から接続されることができ、ファンインもサポートされています。connect()メソッドで AudioNodeの 出力を別のAudioNodeの 入力に接続すると、その入力への接続が発生したと呼びます。

AudioNode入力は、任意の時点で特定のチャンネル数を持ちます。 このチャンネル数は、入力への接続状況に応じて変化します。入力に接続がない場合は、1チャンネル(無音)となります。

入力について、AudioNodeは その入力への全ての接続をミキシングします。 規定の要件や詳細については§ 4 チャンネルのアップミックス・ダウンミックスを参照してください。

入力の処理およびAudioNodeの 内部処理は、ノードに接続された出力があるかどうか、またそれらの出力が AudioContextAudioDestinationNodeに 到達するかどうかに関わらず、AudioContextの 時間を基準に継続的に行われます。

[Exposed=Window]
interface AudioNode : EventTarget {
    AudioNode connect (AudioNode destinationNode,
                       optional unsigned long output = 0,
                       optional unsigned long input = 0);
    undefined connect (AudioParam destinationParam, optional unsigned long output = 0);
    undefined disconnect ();
    undefined disconnect (unsigned long output);
    undefined disconnect (AudioNode destinationNode);
    undefined disconnect (AudioNode destinationNode, unsigned long output);
    undefined disconnect (AudioNode destinationNode,
                          unsigned long output,
                          unsigned long input);
    undefined disconnect (AudioParam destinationParam);
    undefined disconnect (AudioParam destinationParam, unsigned long output);
    readonly attribute BaseAudioContext context;
    readonly attribute unsigned long numberOfInputs;
    readonly attribute unsigned long numberOfOutputs;
    attribute unsigned long channelCount;
    attribute ChannelCountMode channelCountMode;
    attribute ChannelInterpretation channelInterpretation;
};

1.5.1. AudioNodeの生成

AudioNodeは 2つの方法で生成できます。1つはこのインターフェースのコンストラクタを利用する方法、もう1つはBaseAudioContext または AudioContext上の ファクトリメソッドを利用する方法です。

BaseAudioContextAudioNodeのコンストラクタの 第1引数として渡す場合、それは生成されるAudioNode関連付けられたBaseAudioContextとなります。 同様に、ファクトリメソッドを利用した場合も、関連付けられた BaseAudioContextは、そのファクトリメソッドを呼び出したBaseAudioContextです。

特定の型nの新しいAudioNodeBaseAudioContext c上のファクトリメソッドで生成するには、以下の手順を実行します。
  1. nodeを型nの新しいオブジェクトとして生成する。

  2. optionを、このファクトリメソッドに関連するインターフェースに関連付けられている オプション辞書型として用意する。

  3. ファクトリメソッドに渡された各パラメータについて、同じ名前の辞書メンバーに値をセットする。

  4. coptionを引数に、nのコンストラクタをnode上で呼び出す。

  5. nodeを返す。

AudioNodeの初期化は、このインターフェースを継承したオブジェクトoに対して、 コンストラクタに渡された引数contextdictを使って以下の手順を実行することを意味します。
  1. oBaseAudioContextcontextに設定する。

  2. このインターフェースの仕様に記載されたデフォルト値に従い、numberOfInputsnumberOfOutputschannelCountchannelCountModechannelInterpretation の値を設定する。

  3. dictの各メンバーについて、キーkと値vで以下の手順を実行する。手順実行時に例外が発生した場合は、 イテレーションを中断し、その例外をアルゴリズム(コンストラクタまたはファクトリメソッド)の呼び出し元へ伝播する。

    1. kがこのインターフェース上のAudioParam名である場合、 そのvalue属性にvをセットする。

    2. それ以外の場合、kがこのインターフェース上の属性名であれば、関連するオブジェクトの属性値をvにセットする。

ファクトリメソッドの関連インターフェースは、 そのメソッドが返すオブジェクトのインターフェースです。インターフェースの関連オプションオブジェクトは、 そのインターフェースのコンストラクタに渡すことができるオプションオブジェクトです。

AudioNodeEventTargetであり、 [DOM]に記載されています。 つまりAudioNodeにも、 他のEventTarget同様に イベントを配送できます。

enum ChannelCountMode {
    "max",
    "clamped-max",
    "explicit"
};

ChannelCountModeは、 ノードのchannelCountchannelInterpretation値と 組み合わせて ノードの入力をどのようにミックスするかを制御するcomputedNumberOfChannelsを決定します。computedNumberOfChannelsの決定方法は以下に示します。 ミックス方法の詳細は§ 4 チャンネルのアップミックス・ダウンミックスを参照してください。

ChannelCountMode 列挙型の説明
列挙値 説明
"max" computedNumberOfChannelsは 入力へのすべての接続のチャンネル数の最大値となります。このモードではchannelCountは無視されます。
"clamped-max" computedNumberOfChannelsは "max"と同様に決定され、その後指定されたchannelCountの最大値にクランプされます。
"explicit" computedNumberOfChannelschannelCountで指定された値となります。
enum ChannelInterpretation {
    "speakers",
    "discrete"
};
ChannelInterpretation 列挙型の説明
列挙値 説明
"speakers" アップミックス方程式ダウンミックス方程式を使用します。 チャンネル数が基本的なスピーカーレイアウトと一致しない場合は"discrete"にフォールバックします。
"discrete" チャンネルが尽きるまで埋めて残りはゼロでアップミックス。ダウンミックスは埋められるだけ埋めて残りは削除します。

1.5.2. AudioNodeのテイルタイム

AudioNodeには テイルタイムが存在する場合があります。 これはAudioNodeに サイレンスが入力されても、出力がサイレンスにならない場合があることを意味します。

AudioNodeは 入力の過去の値が将来の出力に影響を与えるような内部処理状態を持つ場合、非ゼロのテイルタイムを持ちます。 入力が非サイレンスからサイレンスに遷移した後も、計算されたテイルタイムの間非サイレンスな出力を生成し続ける場合があります。

1.5.3. AudioNodeのライフタイム

AudioNodeは、以下のいずれかの条件を満たす場合、レンダー量子中にアクティブ処理中となります。

注: これはテイルタイムを持つAudioNodeも考慮しています。

アクティブ処理中でないAudioNodeは、サイレンス(無音)の1チャンネルのみを出力します。

1.5.4. 属性

channelCount, unsigned long

channelCountは、 ノードへの入力をアップミックス・ダウンミックスする際に使用されるチャンネル数です。デフォルト値は2ですが、特定ノードでは値が異なる場合があります。この属性は入力のないノードには効果がありません。この値が0または実装の最大チャンネル数を超えて設定された場合、NotSupportedError例外を必ず投げる必要があります。

さらに、特定ノードにはチャンネル数の値に対する追加のchannelCount制約があります:

AudioDestinationNode

このノードがAudioContextOfflineAudioContextの出力先かで挙動が異なります。

AudioContext

チャンネル数は1からmaxChannelCountまででなければなりません。この範囲外に設定しようとするとIndexSizeError例外を必ず投げる必要があります。

OfflineAudioContext

チャンネル数は変更できません。値を変更しようとした場合はInvalidStateError例外を必ず投げる必要があります。

AudioWorkletNode

§ 1.32.4.3.2 AudioWorkletNodeOptionsによるチャンネル設定を参照してください。

ChannelMergerNode

チャンネル数は変更できません。値を変更しようとした場合はInvalidStateError例外を必ず投げる必要があります。

ChannelSplitterNode

チャンネル数は変更できません。値を変更しようとした場合はInvalidStateError例外を必ず投げる必要があります。

ConvolverNode

チャンネル数は2より大きくできません。2より大きい値に変更しようとした場合はNotSupportedError例外を必ず投げる必要があります。

DynamicsCompressorNode

チャンネル数は2より大きくできません。2より大きい値に変更しようとした場合はNotSupportedError例外を必ず投げる必要があります。

PannerNode

チャンネル数は2より大きくできません。2より大きい値に変更しようとした場合はNotSupportedError例外を必ず投げる必要があります。

ScriptProcessorNode

チャンネル数は変更できません。値を変更しようとした場合はNotSupportedError例外を必ず投げる必要があります。

StereoPannerNode

チャンネル数は2より大きくできません。2より大きい値に変更しようとした場合はNotSupportedError例外を必ず投げる必要があります。

この属性については§ 4 チャンネルのアップミックス・ダウンミックスも参照してください。

channelCountMode, ChannelCountMode

channelCountModeは、ノードへの入力をアップミックス・ダウンミックスする際にチャンネル数をどのように決定するかを指定します。デフォルト値は"max"です。この属性は入力のないノードには効果がありません。

さらに、特定ノードにはchannelCountMode値に対する追加のchannelCountMode制約があります:

AudioDestinationNode

このノードがOfflineAudioContextdestinationノードである場合、channelCountModeは変更できません。値を変更しようとした場合はInvalidStateError例外を必ず投げる必要があります。

ChannelMergerNode

channelCountModeは"explicit"から変更できません。値を変更しようとした場合はInvalidStateError例外を必ず投げる必要があります。

ChannelSplitterNode

channelCountModeは"explicit"から変更できません。値を変更しようとした場合はInvalidStateError例外を必ず投げる必要があります。

ConvolverNode

channelCountModeは"max"に設定できません。"max"に設定しようとした場合はNotSupportedError例外を必ず投げる必要があります。

DynamicsCompressorNode

channelCountModeは"max"に設定できません。"max"に設定しようとした場合はNotSupportedError例外を必ず投げる必要があります。

PannerNode

channelCountModeは"max"に設定できません。"max"に設定しようとした場合はNotSupportedError例外を必ず投げる必要があります。

ScriptProcessorNode

channelCountModeは"explicit"から変更できません。値を変更しようとした場合はNotSupportedError例外を必ず投げる必要があります。

StereoPannerNode

channelCountModeは"max"に設定できません。"max"に設定しようとした場合はNotSupportedError例外を必ず投げる必要があります。

この属性については§ 4 チャンネルのアップミックス・ダウンミックスも参照してください。

channelInterpretation, ChannelInterpretation

channelInterpretationは、ノードへの入力をアップミックス・ダウンミックスする際に各チャンネルをどのように扱うかを指定します。デフォルト値は"speakers"です。この属性は入力のないノードには効果がありません。

さらに、特定ノードにはchannelInterpretation値に対する追加のchannelInterpretation制約があります:

ChannelSplitterNode

channelInterpretationは"discrete"から変更できません。値を変更しようとした場合はInvalidStateError例外を必ず投げる必要があります。

この属性については§ 4 チャンネルのアップミックス・ダウンミックスも参照してください。

context, BaseAudioContext, 読み取り専用

このAudioNodeを所有するBaseAudioContextです。

numberOfInputs, unsigned long, 読み取り専用

このAudioNodeに入力される入力の数です。ソースノードの場合は0となります。多くのAudioNode型ではこの値は固定ですが、ChannelMergerNodeAudioWorkletNodeのように可変な場合もあります。

numberOfOutputs, unsigned long, 読み取り専用

このAudioNodeから出力される出力の数です。この値は一部のAudioNode型では固定ですが、ChannelSplitterNodeAudioWorkletNodeのように可変な場合もあります。

1.5.5. メソッド

connect(destinationNode, output, input)

特定ノードのある出力と、別の特定ノードのある入力との間には、1つの接続のみが可能です。同じ終端同士で複数回接続を試みても無視されます。

例:
nodeA.connect(nodeB);
nodeA.connect(nodeB);

は、次と同じ効果になります:

nodeA.connect(nodeB);

このメソッドはdestination AudioNodeオブジェクトを返します。

AudioNode.connect(destinationNode, output, input) メソッドの引数。
パラメータ Nullable Optional 説明
destinationNode destinationパラメータは接続先のAudioNodeです。もしdestinationパラメータが別のAudioContextで作成されたAudioNodeの場合は、InvalidAccessError例外を必ず投げる必要があります。つまり、AudioNodeAudioContext間で共有できません。複数のAudioNodeを同じAudioNodeに接続することも可能です(チャンネルのアップミックス・ダウンミックス参照)。
output unsigned long outputパラメータは、どのAudioNode出力から接続するかを示すインデックスです。このパラメータが範囲外の場合、IndexSizeError例外を必ず投げる必要があります。1つのAudioNode出力を複数の入力に接続することも可能(ファンアウト)。
input inputパラメータは接続先AudioNodeのどの入力かを示すインデックスです。このパラメータが範囲外の場合、IndexSizeError例外を必ず投げる必要があります。また、AudioNode同士を接続して、サイクル(一方がもう一方に接続し、さらに元のノードやそのAudioParamへ戻る接続)も作成できます。
返り値型: AudioNode
connect(destinationParam, output)

AudioNodeAudioParamに接続し、a-rate信号でパラメータ値を制御します。

1つのAudioNode出力を複数のAudioParamに接続することも可能(ファンアウト)。

複数のAudioNode出力を1つのAudioParamに接続することも可能(ファンイン)。

AudioParamは、接続されたAudioNode出力からレンダリングされたオーディオデータを受け取り、モノラルでない場合はダウンミックスしてモノラル化し、他の出力とミックスし、さらに本来のパラメータ値(オーディオ接続がないときのvalue値とタイムライン変更)とも最終的にミックスします。

モノラルへのダウンミックスは、AudioNodechannelCount = 1、channelCountMode = "explicit"、channelInterpretation = "speakers"と同等です。

特定ノードのある出力と、特定のAudioParamとの間には1つの接続のみが可能です。同じ終端同士で複数回接続を試みても無視されます。

例:
nodeA.connect(param);
nodeA.connect(param);

は、次と同じ効果になります:

nodeA.connect(param);
AudioNode.connect(destinationParam, output) メソッドの引数。
パラメータ Nullable Optional 説明
destinationParam AudioParam destinationパラメータは接続先のAudioParamです。このメソッドはdestination AudioParamオブジェクトを返しません。destinationParamが、 そのAudioNodeの作成元とは異なるBaseAudioContextに所属している場合は、InvalidAccessError例外を必ず投げる必要があります。
output unsigned long outputパラメータはどのAudioNode出力から接続するかを示すインデックスです。このパラメータが範囲外の場合、IndexSizeError例外を必ず投げる必要があります。
返り値型: undefined
disconnect()

AudioNodeからのすべての出力接続を切断します。

パラメータなし。
返り値型: undefined
disconnect(output)

指定したAudioNodeの出力ひとつから、接続されているAudioNodeまたはAudioParamすべてを切断します。

AudioNode.disconnect(output) メソッドの引数。
パラメータ Nullable Optional 説明
output unsigned long 切断するAudioNodeの出力のインデックス。指定した出力からのすべての出力接続を切断します。このパラメータが範囲外の場合、IndexSizeError例外を必ず投げる必要があります。
返り値型: undefined
disconnect(destinationNode)

指定したAudioNodeへのすべての出力接続を切断します。

AudioNode.disconnect(destinationNode) メソッドの引数。
パラメータ Nullable Optional 説明
destinationNode 切断対象のAudioNodeです。指定したdestinationNodeへのすべての出力接続を切断します。指定したdestinationNodeへの接続がない場合、InvalidAccessError例外を必ず投げる必要があります。
返り値型: undefined
disconnect(destinationNode, output)

指定したAudioNodeの特定の出力を、任意の入力からすべて切断します。

AudioNode.disconnect(destinationNode, output) メソッドの引数。
パラメータ Nullable Optional 説明
destinationNode 切断対象のAudioNodeです。指定した出力からdestinationNodeへの接続がない場合、InvalidAccessError例外を必ず投げる必要があります。
output unsigned long 切断するAudioNodeの出力のインデックス。このパラメータが範囲外の場合、IndexSizeError例外を必ず投げる必要があります。
返り値型: undefined
disconnect(destinationNode, output, input)

指定したAudioNodeの特定の出力から、指定した入力への接続のみを切断します。

AudioNode.disconnect(destinationNode, output, input) メソッドの引数。
パラメータ Nullable Optional 説明
destinationNode 切断対象のAudioNodeです。指定した出力から指定した入力へのdestinationNodeへの接続がない場合、InvalidAccessError例外を必ず投げる必要があります。
output unsigned long 切断するAudioNodeの出力のインデックス。このパラメータが範囲外の場合、IndexSizeError例外を必ず投げる必要があります。
input 切断するAudioNodeの入力のインデックス。このパラメータが範囲外の場合、IndexSizeError例外を必ず投げる必要があります。
返り値型: undefined
disconnect(destinationParam)

指定したAudioParamへのすべての出力接続を切断します。このAudioNodeのパラメータ値への寄与は、この操作が有効になった時点で0になります。パラメータの本来の値はこの操作で影響を受けません。

AudioNode.disconnect(destinationParam) メソッドの引数。
パラメータ Nullable Optional 説明
destinationParam AudioParam 切断対象のAudioParamです。指定したdestinationParamへの接続がない場合、InvalidAccessError例外を必ず投げる必要があります。
返り値型: undefined
disconnect(destinationParam, output)

指定したAudioNodeの特定の出力から、指定したAudioParamへの接続のみを切断します。このAudioNodeのパラメータ値への寄与は、この操作が有効になった時点で0になります。パラメータの本来の値はこの操作で影響を受けません。

AudioNode.disconnect(destinationParam, output) メソッドの引数。
パラメータ Nullable Optional 説明
destinationParam AudioParam 切断対象のAudioParamです。指定したdestinationParamへの接続がない場合、InvalidAccessError例外を必ず投げる必要があります。
output unsigned long 切断するAudioNodeの出力のインデックス。このパラメータが範囲外の場合、IndexSizeError例外を必ず投げる必要があります。
返り値型: undefined

1.5.6. AudioNodeOptions

これはすべてのAudioNodeの構築時に使用できるオプションを指定します。 すべてのメンバーは省略可能ですが、各ノードで使用される具体的な値はノードごとに異なります。

dictionary AudioNodeOptions {
    unsigned long channelCount;
    ChannelCountMode channelCountMode;
    ChannelInterpretation channelInterpretation;
};
1.5.6.1. 辞書 AudioNodeOptions のメンバー
channelCount, unsigned long

channelCount 属性に指定する希望するチャンネル数。

channelCountMode, ChannelCountMode

channelCountMode 属性に指定する希望するモード。

channelInterpretation, ChannelInterpretation

channelInterpretation 属性に指定する希望するモード。

1.6. AudioParam インターフェース

AudioParamAudioNodeの機能(たとえば音量)など個別の要素を制御します。 パラメータはvalue属性で即座に値を設定したり、値の変化を非常に正確なタイミング(AudioContextcurrentTime属性の座標系)でスケジュールできます。これにより、エンベロープ・ボリュームフェード・LFO・フィルタスウィープ・グレインウィンドウ等、任意のタイムラインベースのオートメーションカーブが設定可能です。 また、AudioNodeの出力からのオーディオ信号をAudioParamに接続し、本来のパラメータ値と合算することもできます。

一部の合成・処理AudioNodeは、AudioParam属性を持ち、その値はオーディオサンプル毎に考慮される必要があります。他のAudioParamではサンプル精度が重要ではなく、値の変化はより粗くサンプリングされてもかまいません。各AudioParamは、a-rateパラメータ(サンプルごとに値を考慮する必要あり)か、k-rateパラメータかを指定します。

実装はブロック処理を使用し、各AudioNodeは1つのレンダー量子を処理します。

レンダー量子ごとに、k-rateパラメータの値は最初のサンプルフレーム時点でサンプリングされ、その値がそのブロック全体で使用されます。a-rateパラメータはブロックの各サンプルフレームごとにサンプリングされます。 AudioParamによっては、automationRate属性で"a-rate"または"k-rate"に設定して制御できます。 個々のAudioParamの説明も参照してください。

AudioParamminValuemaxValue属性を持ち、 これらがパラメータの単純名目範囲となります。実際には、パラメータ値は\([\mathrm{minValue}, \mathrm{maxValue}]\)にクランプされます。詳細は§ 1.6.3 値の算出参照。

多くのAudioParamでは、minValuemaxValueは最大可能範囲に設定されることが想定されています。この場合、maxValue最大正単精度浮動小数点値(3.4028235e38)に設定します。(ただしJavaScriptではIEEE-754倍精度のみ対応のため、3.4028234663852886e38と記述する必要があります。)同様にminValue最小負単精度浮動小数点値(-3.4028235e38、JavaScriptでは-3.4028234663852886e38)に設定します。

AudioParamはゼロ個以上のオートメーションイベントのリストを保持します。各イベントは、そのイベントのオートメーションイベント時刻AudioContextcurrentTime座標系で)に関連して、 指定された時間範囲でパラメータ値の変化を指定します。イベントリストはオートメーションイベント時刻の昇順で管理されます。

特定のオートメーションイベントの挙動は、AudioContextの現在時刻や、イベントリスト内のこのイベントと隣接するイベントの時刻によって決まります。以下のオートメーションメソッドは、 メソッド固有の型のイベントをイベントリストに追加します:

これらのメソッドを呼び出す際の規則:

注: AudioParam属性は読み取り専用ですが、value属性のみ書き込み可能です。

AudioParamのオートメーションレートは、automationRate属性で以下の値のいずれかに設定できます。ただし、AudioParamによってはオートメーションレートの変更に制約があります。

enum AutomationRate {
    "a-rate",
    "k-rate"
};
AutomationRate 列挙型の説明
列挙値 説明
"a-rate" このAudioParama-rate処理用に設定されます。
"k-rate" このAudioParamk-rate処理用に設定されます。

AudioParamは内部スロット[[current value]]を持ち、 初期値はAudioParamdefaultValueです。

[Exposed=Window]
interface AudioParam {
    attribute float value;
    attribute AutomationRate automationRate;
    readonly attribute float defaultValue;
    readonly attribute float minValue;
    readonly attribute float maxValue;
    AudioParam setValueAtTime (float value, double startTime);
    AudioParam linearRampToValueAtTime (float value, double endTime);
    AudioParam exponentialRampToValueAtTime (float value, double endTime);
    AudioParam setTargetAtTime (float target, double startTime, float timeConstant);
    AudioParam setValueCurveAtTime (sequence<float> values,
                                    double startTime,
                                    double duration);
    AudioParam cancelScheduledValues (double cancelTime);
    AudioParam cancelAndHoldAtTime (double cancelTime);
};

1.6.1. 属性

automationRate, AutomationRate

AudioParamのオートメーションレート。 デフォルト値は各AudioParamごとに異なります。個別のAudioParamの説明を参照してください。

一部のノードには追加のオートメーションレート制約があります:

AudioBufferSourceNode

AudioParamplaybackRatedetuneは "k-rate"でなければなりません。 レートを"a-rate"に変更しようとした場合はInvalidStateErrorを必ず投げる必要があります。

DynamicsCompressorNode

AudioParamthresholdkneeratioattackrelease は"k-rate"でなければなりません。 レートを"a-rate"に変更しようとした場合はInvalidStateErrorを必ず投げる必要があります。

PannerNode

panningModelが "HRTF"の場合、 PannerNodeのいかなるAudioParamautomationRateの設定は無視されます。 同様にAudioListenerAudioParamautomationRateの設定も無視されます。 この場合、AudioParamautomationRateが "k-rate"に設定されたかのように振る舞います。

defaultValue, float, 読み取り専用

value属性の初期値。

maxValue, float, 読み取り専用

パラメータが取り得る名目上の最大値。minValueとあわせて、このパラメータの名目範囲を形成します。

minValue, float, 読み取り専用

パラメータが取り得る名目上の最小値。maxValueとあわせて、このパラメータの名目範囲を形成します。

value, float

パラメータの浮動小数点値。この属性はdefaultValueで初期化されます。

この属性を取得すると、[[current value]]スロットの内容を返します。値の算出アルゴリズムは§ 1.6.3 値の算出参照。

この属性に値を設定すると、要求された値が[[current value]]スロットに割り当てられ、 setValueAtTime()メソッドが現在のAudioContextcurrentTime[[current value]]で呼び出されます。 setValueAtTime()で例外が投げられる場合、この属性の設定でも同じ例外が投げられます。

1.6.2. メソッド

cancelAndHoldAtTime(cancelTime)

これはcancelScheduledValues()と似ており、 cancelTime以降の すべてのスケジュール済みパラメータ変更をキャンセルします。 ただし、加えて、cancelTime時点で 本来発生するはずだったオートメーション値が、その後他のオートメーションイベントが追加されるまで保持されます。

オートメーションが動作中に、cancelAndHoldAtTime()呼び出し後、 cancelTime到達前に オートメーションが追加され得る場合のタイムラインの挙動は複雑です。 cancelAndHoldAtTime()の 挙動は以下のアルゴリズムで規定されます。

\(t_c\) をcancelTimeの値とする。 次の手順を実行します:
  1. \(E_1\) を、時刻 \(t_1\)(\(t_1 \le t_c\) を満たす最大の数)のイベント(存在する場合)とする。

  2. \(E_2\) を、時刻 \(t_2\)(\(t_c \lt t_2\) を満たす最小の数)のイベント(存在する場合)とする。

  3. \(E_2\) が存在する場合:

    1. \(E_2\) がリニアまたは指数ランプの場合、

      1. \(E_2\) を、同じ種類のランプとして、終了時刻を \(t_c\)、終了値を元のランプの時刻 \(t_c\) における値として書き換える。linearRampToValueAtTimeでこの時刻にcancelAndHoldAtTimeを呼んだ時のグラフ例

      2. ステップ5へ。

    2. それ以外の場合はステップ4へ。

  4. \(E_1\) が存在する場合:

    1. \(E_1\) が setTarget イベントの場合、

      1. 暗黙的に、時刻 \(t_c\) に setValueAtTime イベント(値は setTarget の \(t_c\) における値)を挿入する。setTargetAtTimeでこの時刻にcancelAndHoldAtTimeを呼んだ時のグラフ例

      2. ステップ5へ。

    2. \(E_1\) が開始時刻 \(t_3\)、期間 \(d\) の setValueCurve の場合、

      1. \(t_c \gt t_3 + d\) ならステップ5へ。

      2. それ以外の場合、

        1. このイベントを、開始時刻 \(t_3\)、新しい期間 \(t_c-t_3\) の setValueCurve イベントで置き換える。ただし、これは厳密な置換ではなく、元のカーブと同じ出力を生成するように自動化しなければならない。異なる期間で計算すると値曲線のサンプリング方法が変わり、異なる結果となるため。setValueCurveでこの時刻にcancelAndHoldAtTimeを呼んだ時のグラフ例

        2. ステップ5へ。

  5. 時刻 \(t_c\) より後のすべてのイベントを削除する。

イベントが追加されなければ、cancelAndHoldAtTime()後のオートメーション値は、元のタイムラインが\(t_c\)時点で持つ値を以降保持します。

AudioParam.cancelAndHoldAtTime() メソッドの引数。
パラメータ Nullable Optional 説明
cancelTime double この時刻以降のスケジュール済みパラメータ変更をキャンセルする時刻。AudioContextcurrentTime座標系の時刻。RangeErrorcancelTimeが負の場合に必ず投げる必要があります。cancelTimecurrentTime未満の場合はcurrentTimeにクランプされます。
返り値型: AudioParam
cancelScheduledValues(cancelTime)

cancelTime以降の すべてのスケジュール済みパラメータ変更をキャンセルします。 キャンセルは、イベントリストから対象イベントを削除することです。 automation event timecancelTime未満の アクティブなオートメーションもキャンセルされ、元の値(オートメーション前の値)に即座に戻ります。 cancelAndHoldAtTime()で 保持された値も、保持時刻がcancelTime以降の場合は削除されます。

setValueCurveAtTime()の場合、 \(T_0\)と\(T_D\)をイベントのstartTimedurationとする。 cancelTimeが \([T_0, T_0 + T_D]\)区間内にあれば、そのイベントはタイムラインから削除されます。

AudioParam.cancelScheduledValues() メソッドの引数。
パラメータ Nullable Optional 説明
cancelTime double この時刻以降のスケジュール済みパラメータ変更をキャンセルする時刻。AudioContextcurrentTime座標系の時刻。RangeErrorcancelTimeが負の場合に必ず投げる必要があります。 cancelTimecurrentTime未満の場合はcurrentTimeにクランプされます。
返り値型: AudioParam
exponentialRampToValueAtTime(value, endTime)

パラメータ値を、前回スケジュールされたパラメータ値から指定された値まで指数関数的に連続して変化させるようにスケジュールします。フィルターの周波数や再生速度を表すパラメータは、人間の音の知覚方法のため、指数関数的に変化させるのが最適です。

時間区間 \(T_0 \leq t < T_1\)(ここで \(T_0\) は前回イベントの時刻、\(T_1\) はこのメソッドに渡された endTime パラメータの値)における値は、以下のように計算されます:

$$
    v(t) = V_0 \left(\frac{V_1}{V_0}\right)^\frac{t - T_0}{T_1 - T_0}
$$

ここで \(V_0\) は時刻 \(T_0\) における値、\(V_1\) はこのメソッドに渡された value パラメータの値です。もし \(V_0\) と \(V_1\) の符号が異なる場合や、\(V_0\) がゼロの場合は、\(T_0 \le t \lt T_1\) の間は \(v(t) = V_0\) となります。

このことは、0 への指数関数的ランプが不可能であることも意味します。適切なタイムコンスタントを選択した setTargetAtTime() を使うことで良い近似が可能です。

この ExponentialRampToValue イベントの後にイベントがなければ、\(t \geq T_1\) の間は \(v(t) = V_1\) となります。

このイベントの前にイベントがない場合、指数ランプは setValueAtTime(value, currentTime) を呼び出したかのように動作します。ここで value は属性の現在値、currentTimecurrentTime のコンテキストで exponentialRampToValueAtTime() が呼ばれた時点の値です。

直前のイベントが SetTarget イベントの場合、\(T_0\) および \(V_0\) は SetTarget オートメーションの現在時刻と値から選ばれます。すなわち、SetTarget イベントがまだ開始されていない場合、\(T_0\) はイベントの開始時刻、\(V_0\) は SetTarget イベント開始直前の値です。この場合、ExponentialRampToValue イベントは事実上 SetTarget イベントを置き換えます。SetTarget イベントがすでに開始されている場合、\(T_0\) は現時点のコンテキスト時刻、\(V_0\) は時刻 \(T_0\) での SetTarget オートメーション値です。どちらの場合も、オートメーションカーブは連続になります。

AudioParam.exponentialRampToValueAtTime() メソッドの引数。
パラメータ Nullable Optional 説明
value float 指定時刻に指数的に到達する値。RangeError はこの値が0の場合必ず投げる必要があります。
endTime double AudioContextcurrentTime座標系で 指定する指数ランプ終了時刻。RangeErrorendTimeが負または有限でない場合必ず投げる必要があります。 endTimecurrentTime未満の場合はcurrentTimeにクランプされます。
返り値型: AudioParam
linearRampToValueAtTime(value, endTime)

パラメータ値を前回スケジュール値から指定値へ、線形に連続変化するようスケジュールします。

時間区間 \(T_0 \leq t < T_1\)(ここで \(T_0\) は前回のイベントの時刻、\(T_1\) はこのメソッドに渡された endTime パラメータの値)における値は、以下のように計算されます:

$$
    v(t) = V_0 + (V_1 - V_0) \frac{t - T_0}{T_1 - T_0}
$$

\(V_0\):時刻\(T_0\)での値、\(V_1\):このメソッドの value

このイベント以降にイベントがなければ \(t \geq T_1\) で値は\(V_1\)となる。

直前にイベントがなければ、setValueAtTime(value, currentTime)を (value:現在値、currentTime:呼び出し時点のcontext currentTime)呼んだのと同様の挙動。

直前がSetTargetイベントなら、\(T_0\)、\(V_0\)はSetTargetオートメーションの現在時刻・値で決定。 そのイベント未開始なら開始時刻・開始直前値、開始済みなら現在時刻・現在値。どちらもオートメーションカーブは連続。

AudioParam.linearRampToValueAtTime() メソッドの引数。
パラメータ Nullable Optional 説明
value float 指定時刻に線形で到達する値。
endTime double AudioContextcurrentTime座標系で 指定するオートメーション終了時刻。RangeErrorendTimeが負または有限でない場合必ず投げる必要があります。 endTimecurrentTime未満の場合はcurrentTimeにクランプされます。
返り値型: AudioParam
setTargetAtTime(target, startTime, timeConstant)

指定時刻から指定時定数で目標値へ指数的に近づくようパラメータ値を変化させます。ADSRエンベロープのdecay/release部分などに有用です。値は即座に目標値になるのではなく、徐々に近づきます。

区間\(T_0 \leq t\)(\(T_0\):startTime)での値は次式で算出:

$$
    v(t) = V_1 + (V_0 - V_1)\, e^{-\left(\frac{t - T_0}{\tau}\right)}
$$

\(V_0\):時刻\(T_0\)での初期値([[current value]])、 \(V_1\):target、 \(\tau\):timeConstant

このイベントの後にLinearRampToValueExponentialRampToValueイベントがある場合は、各メソッドの説明参照。 それ以外では、次イベント時刻でSetTargetイベントは終了。

AudioParam.setTargetAtTime() メソッドの引数。
パラメータ Nullable Optional 説明
target float 指定時刻からパラメータ値が目標値へ変化し始める値。
startTime double 指数近似が始まる時刻。AudioContextcurrentTime座標系。RangeErrorstartが負または有限でない場合必ず投げる必要があります。 startTimecurrentTime未満の場合はcurrentTimeにクランプされます。
timeConstant float 一次フィルター(指数近似)への時定数値。大きいほど遷移は遅くなる。値は非負でなければならず、そうでなければRangeError 例外を必ず投げる必要があります。 0の場合は即座に最終値へジャンプ。 timeConstantは1次線形連続時間不変系が入力ステップ応答で値\(1-1/e\)(約63.2%)に到達するのに必要な時間。
返り値型: AudioParam
setValueAtTime(value, startTime)

指定時刻にパラメータ値を変更するようスケジュールします。

このSetValueイベント以降にイベントがなければ、\(t \geq T_0\) で \(v(t) = V\)(\(T_0\):startTime、\(V\):value)と 常に一定。

この SetValue イベントの後に時刻 \(T_1\) の次のイベントがあり、そのイベントが LinearRampToValueExponentialRampToValue 型でない場合、\(T_0 \leq t < T_1\) の間は:

$$
    v(t) = V
$$

この区間も値は一定となり、ステップ関数的動作を作れます。

次イベントがLinearRampToValueExponentialRampToValueなら、各メソッド説明参照。

AudioParam.setValueAtTime() メソッドの引数。
パラメータ Nullable Optional 説明
value float 指定時刻に変更する値。
startTime double パラメータが指定値に変化する時刻。BaseAudioContextcurrentTime座標系。RangeErrorstartTimeが負または有限でない場合必ず投げる必要があります。 startTimecurrentTime未満の場合はcurrentTimeにクランプされます。
返り値型: AudioParam
setValueCurveAtTime(values, startTime, duration)

指定した時刻から指定した時間まで、任意のパラメータ値の配列を設定します。値の数は、希望する時間に収まるようにスケールされます。

\(T_0\) を startTime、 \(T_D\) を duration、 \(V\) を values 配列、 そして \(N\) を values 配列の長さとします。すると、時間区間 \(T_0 \le t < T_0 + T_D\) の間は、次のようになります:

$$
    \begin{align*} k &= \left\lfloor \frac{N - 1}{T_D}(t-T_0) \right\rfloor \\
    \end{align*}
$$

値\(v(t)\)は\(V[k]\)と\(V[k+1]\)を線形補間して算出。

カーブ終了後(\(t \ge T_0 + T_D\))は、次のオートメーションイベントがあるまで値は最終値で固定。

内部的に、時刻\(T_0 + T_D\)で値\(V[N-1]\)でsetValueAtTime()が呼ばれ、 以降のオートメーションはこのカーブ終端値から始まります。

AudioParam.setValueCurveAtTime() メソッドの引数。
パラメータ Nullable Optional 説明
values sequence<float> パラメータ値カーブを表すfloat値の配列。指定時刻から指定持続時間だけ適用。呼び出し時に内部コピーが作られ、以降配列内容を変更してもAudioParamには影響しない。InvalidStateErrorは 配列長が2未満の場合必ず投げる必要があります。
startTime double 値カーブ適用開始時刻。AudioContextcurrentTime座標系。RangeErrorstartTimeが負または有限でない場合必ず投げる必要があります。 startTimecurrentTime未満の場合はcurrentTimeにクランプされます。
duration double startTime以降、valuesに基づき値が算出される秒数。RangeErrordurationが正でない場合、または有限でない場合必ず投げる必要があります。
返り値型: AudioParam

1.6.3. 値の計算

2種類のAudioParamがあり、単純パラメータ複合パラメータです。単純パラメータ(デフォルト)は、AudioNodeの最終的なオーディオ出力を計算するために単独で使われます。 複合パラメータは、他のAudioParamと組み合わせて値を計算し、その値が入力としてAudioNodeの出力を計算するために使われます。

computedValueは、最終的にオーディオDSPを制御する値であり、各レンダリング時間量子ごとにオーディオレンダリングスレッドによって計算されます。

AudioParamの値の計算は2つの部分から成り立ちます:

これらの値は次のように計算しなければなりません:

  1. paramIntrinsicValueは、各時刻で計算されます。これはvalue属性に直接設定された値、またはその時刻以前または同時の自動化イベントがあれば、それらのイベントから計算された値です。もし自動化イベントが特定の時間範囲から削除された場合、paramIntrinsicValueは前回の値のまま変更されず、value属性が直接設定されるか、その時間範囲に自動化イベントが追加されるまで維持されます。

  2. [[current value]]を、このレンダー量子の開始時点におけるparamIntrinsicValueの値に設定します。

  3. paramComputedValueは、paramIntrinsicValueの値と入力AudioParamバッファの値の合計です。合計がNaNの場合は、defaultValueで置き換えます。

  4. このAudioParam複合パラメータの場合、他のAudioParamとともに最終値を計算します。

  5. computedValueparamComputedValueに設定します。

computedValue名目範囲は、このパラメータが実際に持つことができる最小値と最大値です。単純パラメータの場合、computedValueはそのパラメータの単純名目範囲にクランプされます。複合パラメータは、構成する各AudioParam値から計算された後、最終値がそれぞれの名目範囲にクランプされます。

自動化メソッドが使われる場合でも、クランプ処理は適用されます。ただし、自動化の計算自体はクランプされていないかのように行われ、出力に適用する時点でのみ上記のようにクランプされます。

例えば、ノード\(N\)が名目範囲\([0, 1]\)のAudioParam\(p\)を持ち、次の自動化シーケンスを考えます。
N.p.setValueAtTime(0, 0);
N.p.linearRampToValueAtTime(4, 1);
N.p.linearRampToValueAtTime(0, 2);

曲線の初期の傾きは4ですが、最大値1に達すると出力は一定となります。最後に、時刻2付近では傾きが-4となります。下図では、破線がクリッピングなしの場合の挙動、実線が名目範囲へのクリッピングによるAudioParamの実際の挙動を示しています。

AudioParam automation clipping to nominal
AudioParam自動化が名目範囲でクリッピングされる例

1.6.4. AudioParam 自動化の例

AudioParam automation
パラメータ自動化の例
const curveLength = 44100;const curve = new Float32Array(curveLength);for (const i = 0; i < curveLength; ++i)    curve[i] = Math.sin(Math.PI * i / curveLength);const t0 = 0;const t1 = 0.1;const t2 = 0.2;const t3 = 0.3;const t4 = 0.325;const t5 = 0.5;const t6 = 0.6;const t7 = 0.7;const t8 = 1.0;const timeConstant = 0.1;param.setValueAtTime(0.2, t0);param.setValueAtTime(0.3, t1);param.setValueAtTime(0.4, t2);param.linearRampToValueAtTime(1, t3);param.linearRampToValueAtTime(0.8, t4);param.setTargetAtTime(.5, t4, timeConstant);// t5時点でsetTargetAtTimeがどこにあるか計算し、// 以下のexpが正しい位置から始まるようにジャンプ不連続を防ぐ。// 仕様より、v(t) = 0.5 + (0.8 - 0.5)*exp(-(t-t4)/timeConstant)// よってv(t5) = 0.5 + (0.8 - 0.5)*exp(-(t5-t4)/timeConstant)param.setValueAtTime(0.5 + (0.8 - 0.5)*Math.exp(-(t5 - t4)/timeConstant), t5);param.exponentialRampToValueAtTime(0.75, t6);param.exponentialRampToValueAtTime(0.05, t7);param.setValueCurveAtTime(curve, t7, t8 - t7);

1.7. AudioScheduledSourceNode インターフェース

このインターフェースは、AudioBufferSourceNodeConstantSourceNodeOscillatorNodeなどのソースノードの共通機能を表します。

ソースが(start()を呼び出して)開始される前は、ソースノードは必ず無音(0)を出力しなければなりません。ソースが(stop()を呼び出して)停止された後も、ソースは必ず無音(0)を出力しなければなりません。

AudioScheduledSourceNodeは直接インスタンス化できず、ソースノード用の具体的なインターフェースによって拡張されます。

AudioScheduledSourceNodeは、その関連するBaseAudioContextcurrentTimeがソースノードの開始時刻以上、停止時刻未満の場合に再生中と言います。

AudioScheduledSourceNodeは、内部的なブール型スロット[[source started]]を持ち、初期値はfalseです。

[Exposed=Window]
interface AudioScheduledSourceNode : AudioNode {
    attribute EventHandler onended;
    undefined start(optional double when = 0);
    undefined stop(optional double when = 0);
};

1.7.1. 属性

onended, EventHandler

endedイベントタイプのイベントハンドラを設定するためのプロパティです。このイベントはAudioScheduledSourceNode ノードタイプに送出されます。ソースノードが再生を停止した時(具体的なノードによって判断されます)、Event インターフェースを使用したイベントがイベントハンドラへ送出されます。

すべてのAudioScheduledSourceNodeで、ended イベントはstop() で決定された停止時刻に達した時に送出されます。AudioBufferSourceNodeの場合、duration に達した場合やbuffer 全体が再生された場合にもイベントが送出されます。

1.7.2. メソッド

start(when)

指定した時刻にサウンドを再生するようスケジュールします。

このメソッドが呼ばれた時、次の手順を実行します:
  1. このAudioScheduledSourceNode の内部スロット[[source started]] がtrueの場合、InvalidStateError 例外を投げなければなりません。

  2. 下記のパラメータ制約により投げる必要があるエラーがないか確認します。ステップ中に例外が投げられた場合は手順を中断します。

  3. このAudioScheduledSourceNode の内部スロット[[source started]]trueに設定します。

  4. 制御メッセージをキューイング してAudioScheduledSourceNode を開始します。パラメータ値をメッセージに含めます。

  5. 関連付けられたAudioContextレンダリングスレッドの実行開始のための制御メッセージを送信します。ただし、以下すべての条件が満たされた場合のみ:

    1. コンテキストの[[control thread state]] が"suspended"である。

    2. コンテキストが開始可能である。

    3. [[suspended by user]] フラグがfalseである。

    注意:この仕組みにより、start() によって現在開始可能な状態だが、以前は開始が阻止されていたAudioContext を開始できる場合があります。

AudioScheduledSourceNode.start(when) メソッドの引数。
パラメータ Nullable Optional 説明
when double when パラメータは、何秒後にサウンドを再生開始するかを示します。AudioContextcurrentTime 属性と同じ時間座標系です。AudioScheduledSourceNode の発する信号が開始時刻に依存する場合、whenの値は常にサンプルフレーム単位で丸めず正確に使われます。0またはcurrentTime より小さい値を指定した場合、即座に再生が開始されます。whenが負の場合はRangeError 例外を投げなければなりません。
戻り値の型: undefined
stop(when)

指定した時刻にサウンドの再生を停止するようスケジュールします。すでにstopが呼ばれた後に再度呼び出された場合、最後の呼び出しのみが適用されます。以前の呼び出しによる停止時刻は、バッファが停止済みでない限り適用されません。バッファがすでに停止済みの場合、以降のstop呼び出しは効果がありません。停止時刻が開始時刻より先に到達した場合、サウンドは再生されません。

このメソッドが呼ばれた時、次の手順を実行します:
  1. このAudioScheduledSourceNode の内部スロット[[source started]] がtrueでない場合、InvalidStateError 例外を投げなければなりません。

  2. 下記のパラメータ制約により投げる必要があるエラーがないか確認します。

  3. 制御メッセージをキューイング してAudioScheduledSourceNode を停止します。パラメータ値をメッセージに含めます。

ノードがAudioBufferSourceNode の場合、制御メッセージで停止処理を行うとは再生アルゴリズムhandleStop()関数を呼び出すことを意味します。
AudioScheduledSourceNode.stop(when) メソッドの引数。
パラメータ Nullable Optional 説明
when double when パラメータは、何秒後にソースを停止するかを示します。AudioContextcurrentTime 属性と同じ時間座標系です。0またはcurrentTime より小さい値を指定した場合、即座に停止します。whenが負の場合はRangeError 例外を投げなければなりません。
戻り値の型: undefined

1.8. AnalyserNode インターフェース

このインターフェースは、リアルタイムの周波数および時間領域解析情報を提供できるノードを表します。オーディオストリームは、入力から出力へ未処理のまま渡されます。

プロパティ 備考
numberOfInputs 1
numberOfOutputs 1 この出力は未接続でも構いません。
channelCount 2
channelCountMode "max"
channelInterpretation "speakers"
tail-time なし
[Exposed=Window]
interface AnalyserNode : AudioNode {
    constructor (BaseAudioContext context, optional AnalyserOptions options = {});
    undefined getFloatFrequencyData (Float32Array array);
    undefined getByteFrequencyData (Uint8Array array);
    undefined getFloatTimeDomainData (Float32Array array);
    undefined getByteTimeDomainData (Uint8Array array);
    attribute unsigned long fftSize;
    readonly attribute unsigned long frequencyBinCount;
    attribute double minDecibels;
    attribute double maxDecibels;
    attribute double smoothingTimeConstant;
};

1.8.1. コンストラクター

AnalyserNode(context, options)

このコンストラクターが BaseAudioContext c と オプションオブジェクト option で呼び出された場合、ユーザーエージェントは AudioNodeの初期化this に対して context および options を引数にして行わなければなりません。

AnalyserNode.constructor() メソッドの引数。
パラメータ Nullable Optional 説明
context BaseAudioContext この新しい AnalyserNode関連付けられる BaseAudioContext
options AnalyserOptions この AnalyserNode の初期パラメータ値(省略可能)。

1.8.2. 属性

fftSize, unsigned long

周波数領域解析に使われるFFTのサイズ(サンプルフレーム数)。この値は32から32768までの2のべき乗でなければならず、そうでない場合はIndexSizeError 例外を投げなければなりません。デフォルト値は2048です。 大きなFFTサイズは計算コストが高くなることがあります。

fftSize を別の値に変更した場合、 周波数データのスムージングに関連するすべての状態(getByteFrequencyData() および getFloatFrequencyData()) がリセットされます。つまり、previous block、\(\hat{X}_{-1}[k]\) は 時間方向のスムージングで全ての \(k\) に対して0に設定されます。

fftSize を増やすと、現在の時間領域データは過去のフレームも含むように拡張されます。これは AnalyserNode が直近32768サンプルフレームを保持し、現在の時間領域データはそのうち最新の fftSize 個となります。

frequencyBinCount, unsigned long(読み取り専用)

FFTサイズの半分の値。

maxDecibels, double

maxDecibels はFFT解析データを符号なしバイト値に変換するためのスケーリング範囲の最大パワー値です。デフォルト値は-30です。この属性値がminDecibels 以下に設定された場合、IndexSizeError 例外を投げなければなりません。

minDecibels, double

minDecibels はFFT解析データを符号なしバイト値に変換するためのスケーリング範囲の最小パワー値です。デフォルト値は-100です。この属性値がmaxDecibels 以上に設定された場合、IndexSizeError 例外を投げなければなりません。

smoothingTimeConstant, double

0から1の範囲の値で、0は直前の解析フレームとの時間平均化なしを表します。デフォルト値は0.8です。この属性値が0未満または1より大きい場合、IndexSizeError 例外を投げなければなりません。

1.8.3. メソッド

getByteFrequencyData(array)

現在の周波数データarrayに書き込みます。arrayバイト長frequencyBinCount未満の場合、余分な要素は削除されます。arrayバイト長frequencyBinCountより大きい場合、余分な要素は無視されます。周波数データの計算には直近のfftSizeフレームが使われます。

同じレンダー量子内でgetByteFrequencyData()またはgetFloatFrequencyData()が複数回呼ばれた場合、現在の周波数データは同じデータで再計算されず、前回計算したデータが返されます。

符号なしバイト配列に格納される値は次の方法で計算されます。\(Y[k]\)を現在の周波数データFFTウィンドウ処理と時間方向スムージング参照)とします。バイト値\(b[k]\)は、

$$
    b[k] = \left\lfloor
            \frac{255}{\mbox{dB}_{max} - \mbox{dB}_{min}}
            \left(Y[k] - \mbox{dB}_{min}\right)
        \right\rfloor
$$

ここで\(\mbox{dB}_{min}\)はminDecibels、\(\mbox{dB}_{max}\)は maxDecibelsです。 \(b[k]\)が0から255の範囲外の場合は、その範囲にクリップされます。

AnalyserNode.getByteFrequencyData() メソッドの引数。
パラメータ Nullable Optional 説明
array Uint8Array このパラメータには周波数領域解析データがコピーされます。
戻り値の型: undefined
getByteTimeDomainData(array)

現在の時間領域データ(波形データ)をarrayに書き込みます。arrayバイト長fftSize未満の場合、余分な要素は削除されます。arrayバイト長fftSizeより大きい場合、余分な要素は無視されます。バイトデータの計算には直近のfftSizeフレームが使われます。

符号なしバイト配列に格納される値は次の方法で計算されます。\(x[k]\)を時間領域データとすると、バイト値\(b[k]\)は

$$
    b[k] = \left\lfloor 128(1 + x[k]) \right\rfloor.
$$

\(b[k]\)が0から255の範囲外の場合は、その範囲にクリップされます。

AnalyserNode.getByteTimeDomainData() メソッドの引数。
パラメータ Nullable Optional 説明
array Uint8Array このパラメータには時間領域サンプルデータがコピーされます。
戻り値の型: undefined
getFloatFrequencyData(array)

現在の周波数データarrayに書き込みます。arrayの要素数がfrequencyBinCount未満の場合、余分な要素は削除されます。arrayの要素数がfrequencyBinCountより多い場合、余分な要素は無視されます。周波数データの計算には直近のfftSizeフレームが使われます。

同じレンダー量子内でgetFloatFrequencyData()またはgetByteFrequencyData()が複数回呼ばれた場合、現在の周波数データは同じデータで再計算されず、前回計算したデータが返されます。

周波数データはdB単位です。

AnalyserNode.getFloatFrequencyData() メソッドの引数。
パラメータ Nullable Optional 説明
array Float32Array このパラメータには周波数領域解析データがコピーされます。
戻り値の型: undefined
getFloatTimeDomainData(array)

現在の時間領域データ(波形データ)をarrayに書き込みます。arrayの要素数がfftSize未満の場合、余分な要素は削除されます。arrayの要素数がfftSizeより多い場合、余分な要素は無視されます。最も新しいfftSizeフレームが(ダウンミックス後)書き込まれます。

AnalyserNode.getFloatTimeDomainData() メソッドの引数。
パラメータ Nullable Optional 説明
array Float32Array このパラメータには時間領域サンプルデータがコピーされます。
戻り値の型: undefined

1.8.4. AnalyserOptions

これはAnalyserNodeを構築する際に使用されるオプションを指定します。 すべてのメンバーは省略可能で、指定されていない場合は通常のデフォルト値が使われてノードが構築されます。

dictionary AnalyserOptions : AudioNodeOptions {
    unsigned long fftSize = 2048;
    double maxDecibels = -30;
    double minDecibels = -100;
    double smoothingTimeConstant = 0.8;
};
1.8.4.1. 辞書 AnalyserOptions のメンバー
fftSize, unsigned long、デフォルト値2048

周波数領域解析のためのFFTの初期サイズを指定します。

maxDecibels, double、デフォルト値-30

FFT解析時の最大パワー(dB)の初期値を指定します。

minDecibels, double、デフォルト値-100

FFT解析時の最小パワー(dB)の初期値を指定します。

smoothingTimeConstant, double、デフォルト値0.8

FFT解析時の初期スムージング定数を指定します。

1.8.5. 時間領域ダウンミックス

現在の時間領域データが計算される際、入力信号はchannelCount が1、channelCountMode が"max"、channelInterpretation が"speakers"のように、ダウンミックスされてモノラルになります。 これはAnalyserNode自身の設定とは無関係です。ダウンミックス処理には直近のfftSizeフレームが使用されます。

1.8.6. FFTウィンドウ処理と時間方向スムージング

現在の周波数データを計算する際、以下の処理を行います:

  1. 現在の時間領域データを計算する。

  2. Blackmanウィンドウを時間領域入力データに適用する。

  3. フーリエ変換をウィンドウ処理済みの時間領域入力データに適用して、実数・虚数の周波数データを得る。

  4. 時間方向のスムージングを周波数領域データに適用する。

  5. dB変換を行う。

以下において、\(N\)はこのfftSize属性の値とします。

Blackmanウィンドウの適用は、入力時間領域データに対して以下の操作を行います。\(x[n]\)(\(n = 0, \ldots, N - 1\))を時間領域データとします。Blackmanウィンドウは以下で定義されます。
$$
\begin{align*}
    \alpha &= \mbox{0.16} \\ a_0 &= \frac{1-\alpha}{2} \\
    a_1 &= \frac{1}{2} \\
    a_2 &= \frac{\alpha}{2} \\
    w[n] &= a_0 - a_1 \cos\frac{2\pi n}{N} + a_2 \cos\frac{4\pi n}{N}, \mbox{ for } n = 0, \ldots, N - 1
\end{align*}
$$

ウィンドウ処理後の信号\(\hat{x}[n]\)は

$$
    \hat{x}[n] = x[n] w[n], \mbox{ for } n = 0, \ldots, N - 1
$$
フーリエ変換の適用は、下記の方法でフーリエ変換を計算することです。 \(X[k]\)を複素周波数領域データ、\(\hat{x}[n]\)を先ほど計算したウィンドウ処理済み時間領域データとします。
$$
    X[k] = \frac{1}{N} \sum_{n = 0}^{N - 1} \hat{x}[n]\, W^{-kn}_{N}
$$

ここで\(k = 0, \dots, N/2-1\)、\(W_N = e^{2\pi i/N}\)です。

時間方向のスムージングは、以下の操作によって周波数データを処理します:

スムージング後の値\(\hat{X}[k]\)は以下で計算されます:

$$
    \hat{X}[k] = \tau\, \hat{X}_{-1}[k] + (1 - \tau)\, \left|X[k]\right|
$$

(\(k = 0, \ldots, N - 1\)まで)。

dBへの変換は、時間方向スムージングで計算された\(\hat{X}[k]\)に対して次の操作を行います:
$$
    Y[k] = 20\log_{10}\hat{X}[k]
$$

\(k = 0, \ldots, N-1\)まで。

この配列\(Y[k]\)は、getFloatFrequencyData()の出力配列にコピーされます。 getByteFrequencyData()の場合、\(Y[k]\)は minDecibels から maxDecibels の範囲にクリップされ、その後、 minDecibels が値0に、 maxDecibels が値255に マッピングされるように符号なしバイトへスケーリングされます。

1.9. AudioBufferSourceNode インターフェース

このインターフェースは、AudioBuffer 内のメモリー上のオーディオアセットからのオーディオソースを表します。 スケジューリングの柔軟性や精度が高く求められるオーディオアセットの再生に便利です。ネットワークやディスク上のアセットをサンプル精度で再生する必要がある場合は、AudioWorkletNodeを使って再生を実装してください。

start() メソッドは再生開始タイミングのスケジュールに使用します。start() メソッドは複数回発行することはできません。再生は、バッファのオーディオデータがすべて再生し終わったとき(loop 属性が false の場合)、または stop() メソッドが呼ばれ指定時刻に達したときに自動的に停止します。詳細は start() および stop() の説明を参照してください。

プロパティ 備考
numberOfInputs 0
numberOfOutputs 1
channelCount 2
channelCountMode "max"
channelInterpretation "speakers"
tail-time なし

出力のチャンネル数は buffer 属性に指定された AudioBuffer のチャンネル数と同じになります。 ただし buffernull の場合は1チャンネルの無音となります。

さらに、バッファが複数チャンネルの場合、次のいずれかの条件が満たされた時点以降のレンダー量子の先頭で AudioBufferSourceNode の出力は1チャンネルの無音に切り替わらなければなりません:

AudioBufferSourceNode再生位置は、バッファの最初のサンプルフレームの時間座標に対する秒単位のオフセットを表す任意の値として定義されます。これらの値はノードの playbackRatedetune パラメータとは独立して扱われます。 一般に、再生位置はサブサンプル精度であり、必ずしもサンプルフレームの正確な位置を指す必要はありません。0からバッファの duration までの有効な値を持ちます。

playbackRatedetune 属性は 複合パラメータを構成します。両者は組み合わせて computedPlaybackRate 値を決定します:

computedPlaybackRate(t) = playbackRate(t) * pow(2, detune(t) / 1200)

この 複合パラメータ名目範囲は \((-\infty, \infty)\) です。

AudioBufferSourceNode は内部ブール型スロット [[buffer set]] を持ち、初期値は false です。

[Exposed=Window]
interface AudioBufferSourceNode : AudioScheduledSourceNode {
    constructor (BaseAudioContext context,
                 optional AudioBufferSourceOptions options = {});
    attribute AudioBuffer? buffer;
    readonly attribute AudioParam playbackRate;
    readonly attribute AudioParam detune;
    attribute boolean loop;
    attribute double loopStart;
    attribute double loopEnd;
    undefined start (optional double when = 0,
                     optional double offset,
                     optional double duration);
};

1.9.1. コンストラクター

AudioBufferSourceNode(context, options)

このコンストラクターが BaseAudioContext c と オプションオブジェクト option で呼び出された場合、ユーザーエージェントは AudioNodeの初期化this に対して context および options を引数にして行わなければなりません。

AudioBufferSourceNode.constructor() メソッドの引数。
パラメータ Nullable Optional 説明
context BaseAudioContext この新しい AudioBufferSourceNode関連付けられる BaseAudioContext
options AudioBufferSourceOptions この AudioBufferSourceNode の初期パラメータ値(省略可能)。

1.9.2. 属性

buffer, AudioBuffer、 nullable

再生するオーディオアセットを表します。

buffer 属性を設定するには、以下の手順を実行します:
  1. new bufferAudioBuffer または null の値として、buffer に代入します。

  2. new buffernull でなく、かつ [[buffer set]] が true なら、InvalidStateError を投げて手順を中止します。

  3. new buffernull でない場合、[[buffer set]] を true に設定します。

  4. new bufferbuffer 属性に代入します。

  5. このノードで start() が以前に呼ばれている場合、buffer に対して 内容の取得操作を行います。

detune, AudioParam(読み取り専用)

オーディオストリームの再生速度を変調するための追加パラメータ(単位:セント)。このパラメータは playbackRate と組み合わせた 複合パラメータ であり、computedPlaybackRate を形成します。

パラメータ 備考
defaultValue 0
minValue 最小単精度float値 約 -3.4028235e38
maxValue 最大単精度float値 約 3.4028235e38
automationRate "k-rate" 自動化レート制約あり
loop, boolean

loopStart および loopEnd で指定された領域のオーディオデータをループ再生するかどうかを示します。デフォルト値は false です。

loopEnd, double

再生位置のオプション値で、loop 属性が true の場合、ループ終了位置を指定します。この値はループの内容に含まれません。デフォルト値は0で、バッファの0からdurationまでのどの値でも設定できます。loopEnd が0以下、またはバッファのdurationより大きい場合、ループはバッファの終端で終了します。

loopStart, double

再生位置のオプション値で、loop 属性が true の場合、ループ開始位置を指定します。デフォルト値は0で、バッファの0からdurationまでのどの値でも設定できます。loopStart が0未満の場合は0から開始、バッファのdurationより大きい場合はバッファの終端から開始します。

playbackRate, AudioParam(読み取り専用)

オーディオストリームの再生速度。このパラメータは detune と組み合わせた 複合パラメータで、computedPlaybackRate を形成します。

パラメータ 備考
defaultValue 1
minValue 最小単精度float値 約 -3.4028235e38
maxValue 最大単精度float値 約 3.4028235e38
automationRate "k-rate" 自動化レート制約あり

1.9.3. メソッド

start(when, offset, duration)

指定した時刻にサウンドを再生するようスケジュールします。

このメソッドが呼ばれたとき、以下の手順を実行します:
  1. このAudioBufferSourceNode の内部スロット[[source started]]trueなら、InvalidStateError 例外を投げなければなりません。

  2. 下記パラメータ制約によって投げる必要があるエラーがないか確認します。ステップ中に例外が発生した場合は手順を中断します。

  3. このAudioBufferSourceNode の内部スロット[[source started]]trueに設定します。

  4. 制御メッセージをキューイング してAudioBufferSourceNode を開始します。パラメータ値をメッセージに含めます。

  5. buffer 属性が設定されていれば、内容の取得操作を行います。

  6. 関連付けられたAudioContextレンダリングスレッドの実行開始のための制御メッセージを送信します。ただし、以下すべての条件が満たされた場合のみ:

    1. コンテキストの[[control thread state]]suspendedである。

    2. コンテキストが開始可能である。

    3. [[suspended by user]] フラグがfalseである。

    注意:この仕組みにより、start() によって現在開始可能な状態だが、以前は開始が阻止されていたAudioContext を開始できる場合があります。

制御メッセージAudioBufferSourceNodeを開始するとは、下記再生アルゴリズムhandleStart()関数を呼び出すことを意味します。
AudioBufferSourceNode.start(when, offset, duration)メソッドの引数。
パラメータ Nullable Optional 説明
when double whenパラメータは、何秒後にサウンドを再生開始するかを示します。AudioContextcurrentTime 属性と同じ時間座標系です。0またはcurrentTimeより小さい値の場合、即座に再生が開始されます。whenが負の場合はRangeError 例外を投げなければなりません。
offset double offsetパラメータは、再生開始位置(再生位置)を指定します。0の場合はバッファの先頭から再生します。offsetが負の場合はRangeError 例外を投げなければなりません。 offsetloopEnd より大きく、playbackRate が正または0、かつloop がtrueなら、loopEnd から再生します。offsetloopStart より大きく、playbackRate が負、かつloop がtrueなら、loopStart から再生します。offsetstartTime到達時に[0, duration]にクランプされます。ここでdurationは、AudioBufferduration属性の値です。
duration double duration パラメータは、再生するサウンドの長さ(バッファ内容として出力する合計秒数、ループも含む)を秒単位で指定します。playbackRate の影響とは独立しています。例えば、5秒のdurationplaybackRateが0.5の場合は、バッファ内容5秒分を半速で再生し、実際の出力は10秒分となります。durationが負の場合はRangeError 例外を投げなければなりません。
戻り値の型: undefined

1.9.4. AudioBufferSourceOptions

これはAudioBufferSourceNodeを構築する際に使用するオプションを指定します。 すべてのメンバーは省略可能で、指定されていない場合は通常のデフォルト値でノードが構築されます。

dictionary AudioBufferSourceOptions {
    AudioBuffer? buffer;
    float detune = 0;
    boolean loop = false;
    double loopEnd = 0;
    double loopStart = 0;
    float playbackRate = 1;
};
1.9.4.1. 辞書 AudioBufferSourceOptions のメンバー
buffer, AudioBuffer、 nullable

再生するオーディオアセット。これは bufferbuffer 属性に代入するのと同等です。 AudioBufferSourceNode の場合。

detune, float、デフォルト値0

detune AudioParam の初期値。

loop, boolean、デフォルト値false

loop 属性の初期値。

loopEnd, double、デフォルト値0

loopEnd 属性の初期値。

loopStart, double、デフォルト値0

loopStart 属性の初期値。

playbackRate, float、デフォルト値1

playbackRate AudioParam の初期値。

1.9.5. ループ再生

このセクションは規範的ではありません。規範的要件については 再生アルゴリズム を参照してください。

loop 属性を true に設定すると、バッファの loopStartloopEnd で定義される範囲が一度でも再生された後は、無限にループ再生されます。loop が true の間は、次のいずれかが発生するまでループ再生が続きます:

ループ本体は loopStart から loopEnd の直前までの領域とみなされます。ループ領域の再生方向はノードの playbackRate の符号に従います。正の playbackRate の場合は loopStart から loopEnd、 負の playbackRate の場合は loopEnd から loopStart へのループとなります。

ループ再生は start()offset 引数の解釈には影響しません。再生は常に指定された offset から開始し、ループ本体に到達した時点でループ再生が始まります。

有効なループ開始・終了位置は、下記アルゴリズムの通り、0からバッファ duration の範囲内でなければなりません。さらに、loopEndloopStart 以上である必要があります。 これらを満たさない場合は、バッファ全体がループ対象となります。

ループ端点はサブサンプル精度です。端点がサンプルフレームの正確な位置でない場合や playbackRate が 1 でない場合、ループ区間の再生は端点を正しくつなぐように補間されます。

ループ関連プロパティはバッファ再生中に変更でき、通常は次のレンダー量子で反映されます。正確な動作は後続の規範的な再生アルゴリズムで定義されています。

loopStartloopEnd のデフォルト値はどちらも 0 です。loopEnd が 0 の場合はバッファの長さと同等なので、デフォルトでバッファ全体がループされます。

ループ端点の値はバッファのサンプルレートに基づく時間オフセットとして表されるため、これらの値はノードの playbackRate パラメータの影響を受けません。再生中に playbackRate が動的に変化しても独立です。

1.9.6. AudioBuffer 内容の再生

この規範的なセクションでは、バッファ内容の再生について、再生が以下の複数要因の組み合わせで影響される事実を考慮した上で規定します:

AudioBufferSourceNode から出力を生成する内部アルゴリズムは以下の原則に従います:

アルゴリズムの説明は以下の通りです:

let buffer; // このノードが使用する AudioBufferlet context; // このノードが使用する AudioContext// 以下の変数はノードの属性値と AudioParam の値を保持// process() の各呼び出し前に k-rate 単位で更新されるlet loop;let detune;let loopStart;let loopEnd;let playbackRate;// ノードの再生パラメータ用変数let start = 0, offset = 0, duration = Infinity; // start() で設定let stop = Infinity; // stop() で設定// ノード再生状態の管理用変数let bufferTime = 0, started = false, enteredLoop = false;let bufferTimeElapsed = 0;let dt = 1 / context.sampleRate;// start メソッド呼び出し処理function handleStart(when, pos, dur) {    if (arguments.length >= 1) {        start = when;    }    offset = pos;    if (arguments.length >= 3) {        duration = dur;    }}// stop メソッド呼び出し処理function handleStop(when) {    if (arguments.length >= 1) {        stop = when;    } else {        stop = context.currentTime;    }}// マルチチャンネル信号値の補間。サンプルフレームごとに配列で返す// サンプルフレームが正確な位置ならそのフレーム、そうでなければ UA の独自アルゴリズムで近傍補間function playbackSignal(position) {    /*        この関数は buffer の再生信号関数で、再生位置から出力信号値(各チャンネル毎)を取得する        |position| がバッファの正確なサンプルフレームならそのフレームを返す        そうでなければ UA 独自の補間アルゴリズムで周辺フレームを計算        |position| が |loopEnd| 以上で、バッファに続きサンプルフレームがなければ、        |loopStart| からのフレーム列で補間する     */     ...}// 1レンダー量子分のオーディオ生成。output配列にサンプルフレームを格納function process(numberOfFrames) {    let currentTime = context.currentTime; // 次のフレームのコンテキスト時刻    const output = []; // サンプルフレーム格納    // 再生速度に影響する2つの k-rate パラメータを合成    const computedPlaybackRate = playbackRate * Math.pow(2, detune / 1200);    // 有効なループ端点決定    let actualLoopStart, actualLoopEnd;    if (loop && buffer != null) {        if (loopStart >= 0 && loopEnd > 0 && loopStart < loopEnd) {            actualLoopStart = loopStart;            actualLoopEnd = Math.min(loopEnd, buffer.duration);        } else {            actualLoopStart = 0;            actualLoopEnd = buffer.duration;        }    } else {        // loopフラグがfalseならループ状態記録解除        enteredLoop = false;    }    // nullバッファの場合    if (buffer == null) {        stop = currentTime; // 全時間出力0    }    // 量子内サンプルフレームのレンダリング    for (let index = 0; index < numberOfFrames; index++) {        // currentTime, bufferTimeElapsed が再生可能範囲か判定        if (currentTime < start || currentTime >= stop || bufferTimeElapsed >= duration) {            output.push(0); // 無音            currentTime += dt;            continue;        }        if (!started) {            // バッファ再生開始記録と初期再生位置取得            if (loop && computedPlaybackRate >= 0 && offset >= actualLoopEnd) {                offset = actualLoopEnd;            }            if (computedPlaybackRate < 0 && loop && offset < actualLoopStart) {                offset = actualLoopStart;            }            bufferTime = offset;            started = true;        }        // ループ関連処理        if (loop) {            // ループ領域初回到達判定            if (!enteredLoop) {                if (offset < actualLoopEnd && bufferTime >= actualLoopStart) {                    enteredLoop = true;                }                if (offset >= actualLoopEnd && bufferTime < actualLoopEnd) {                    enteredLoop = true;                }            }            // 必要に応じてループ区間へラップ            if (enteredLoop) {                while (bufferTime >= actualLoopEnd) {                    bufferTime -= actualLoopEnd - actualLoopStart;                }                while (bufferTime < actualLoopStart) {                    bufferTime += actualLoopEnd - actualLoopStart;                }            }        }        if (bufferTime >= 0 && bufferTime < buffer.duration) {            output.push(playbackSignal(bufferTime));        } else {            output.push(0); // バッファ終端以降は無音        }        bufferTime += dt * computedPlaybackRate;        bufferTimeElapsed += dt * computedPlaybackRate;        currentTime += dt;    } // 量子ループ終了    if (currentTime >= stop) {        // ノードの再生状態終了。process()の呼び出しは以降なし。出力チャンネル数を1に変更するスケジュール。    }    return output;}

以下の非規範的な図は、さまざまな主要シナリオにおけるアルゴリズムの挙動を示します。バッファの動的リサンプリングは考慮していませんが、ループ位置の時刻が変更されない限り、再生結果には大きな違いはありません。すべての図で以下の表記規則を用います:

次の図は、バッファの基本再生を示します。ループはバッファの最後のサンプルフレームで終了します:

AudioBufferSourceNode basic playback
AudioBufferSourceNode 基本再生

次の図は playbackRate の補間を示し、バッファ内容を半速で再生した場合、出力の各サンプルフレームが補間されます。特に、ループ出力の最後のサンプルフレームはループ開始点を用いて補間されます:

AudioBufferSourceNode playbackRate interpolation
AudioBufferSourceNode playbackRate の補間

次の図はサンプルレート補間を示します。バッファのサンプルレートがコンテキストの半分(50%)となり、computed playback rate が 0.5 となる例です。結果の出力は前の例と同じですが理由が異なります。

AudioBufferSourceNode sample rate interpolation
AudioBufferSourceNode サンプルレート補間

次の図はサブサンプルオフセット再生の例で、バッファ内のオフセットがちょうど半サンプルフレームから始まり、すべての出力フレームが補間されます:

AudioBufferSourceNode subsample offset playback
AudioBufferSourceNode サブサンプルオフセット再生

次の図はサブサンプルループ再生の例で、ループ端点の分数フレームオフセットがバッファ内の補間点となる様子を示します。

AudioBufferSourceNode subsample loop playback
AudioBufferSourceNode サブサンプルループ再生

1.10. AudioDestinationNode インターフェース

これは最終的なオーディオ出力を表す AudioNode であり、ユーザーが実際に聞くことになるノードです。しばしばスピーカーに接続されたオーディオ出力デバイスと見なすことができます。聞こえるようレンダリングされたすべてのオーディオは、このノードにルーティングされ、AudioContext のルーティンググラフ上では「終端」ノードです。各 AudioContext につき AudioDestinationNode は1つだけで、destination 属性から取得できます。

AudioDestinationNode の出力は、入力を合計することで生成されます。これにより、例えば MediaStreamAudioDestinationNodeMediaRecorder[mediastream-recording] 参照)などに AudioContext の出力をキャプチャできます。

AudioDestinationNode は、AudioContext または OfflineAudioContext のいずれかの出力先となり、チャンネルプロパティはコンテキストによって異なります。

AudioContext の場合、デフォルトは以下の通りです:

プロパティ 備考
numberOfInputs 1
numberOfOutputs 1
channelCount 2
channelCountMode "explicit"
channelInterpretation "speakers"
tail-time なし

channelCountmaxChannelCount 以下の任意の値に設定できます。 IndexSizeError 例外は有効範囲外なら必ず投げなければなりません。 例えばオーディオハードウェアが8チャンネル出力対応なら、channelCount を8に設定し、8チャンネル出力できます。

OfflineAudioContext の場合、デフォルトは以下の通りです:

プロパティ 備考
numberOfInputs 1
numberOfOutputs 1
channelCount numberOfChannels
channelCountMode "explicit"
channelInterpretation "speakers"
tail-time なし

ここで numberOfChannelsOfflineAudioContext のコンストラクタで指定されたチャンネル数です。 この値は変更できません。NotSupportedError 例外は channelCount を変更した場合に必ず投げなければなりません。

[Exposed=Window]
interface AudioDestinationNode : AudioNode {
    readonly attribute unsigned long maxChannelCount;
};

1.10.1. 属性

maxChannelCount, unsigned long(読み取り専用)

channelCount 属性に設定できる最大チャンネル数です。オーディオハードウェア終端(通常ケース)を表す AudioDestinationNode は、ハードウェアがマルチチャンネルの場合2チャンネル以上の出力も可能です。maxChannelCount はこのハードウェアがサポート可能な最大チャンネル数となります。

1.11. AudioListener インターフェース

このインターフェースは、オーディオシーンを聴いている人の位置と向きを表します。すべての PannerNode オブジェクトは、BaseAudioContextlistener を基準に空間化します。空間化についての詳細は § 6 空間化/パンニング を参照してください。

positionXpositionYpositionZ パラメータは、リスナーの位置を3次元デカルト座標空間で表します。PannerNode オブジェクトは、個々のオーディオソースとの相対位置をこの座標で空間化します。

forwardXforwardYforwardZ パラメータは、3次元空間の方向ベクトルを表します。forwardベクトルとupベクトルの両方が、リスナーの向きを決定するのに使われます。簡単に言えば、forwardベクトルは人の鼻が向いている方向を、upベクトルは頭頂が向いている方向を示します。これら2つのベクトルは線形独立であることが期待されます。これらの値の規範的な解釈については、§ 6 空間化/パンニングを参照してください。

[Exposed=Window]
interface AudioListener {
    readonly attribute AudioParam positionX;
    readonly attribute AudioParam positionY;
    readonly attribute AudioParam positionZ;
    readonly attribute AudioParam forwardX;
    readonly attribute AudioParam forwardY;
    readonly attribute AudioParam forwardZ;
    readonly attribute AudioParam upX;
    readonly attribute AudioParam upY;
    readonly attribute AudioParam upZ;
    undefined setPosition (float x, float y, float z);
    undefined setOrientation (float x, float y, float z, float xUp, float yUp, float zUp);
};

1.11.1. 属性

forwardX, AudioParam(読み取り専用)

リスナーが3次元デカルト座標空間で向いている方向のx成分を設定します。

パラメータ 備考
defaultValue 0
minValue 最小単精度float値 約 -3.4028235e38
maxValue 最大単精度float値 約 3.4028235e38
automationRate "a-rate"
forwardY, AudioParam(読み取り専用)

リスナーが3次元デカルト座標空間で向いている方向のy成分を設定します。

パラメータ 備考
defaultValue 0
minValue 最小単精度float値 約 -3.4028235e38
maxValue 最大単精度float値 約 3.4028235e38
automationRate "a-rate"
forwardZ, AudioParam(読み取り専用)

リスナーが3次元デカルト座標空間で向いている方向のz成分を設定します。

パラメータ 備考
defaultValue -1
minValue 最小単精度float値 約 -3.4028235e38
maxValue 最大単精度float値 約 3.4028235e38
automationRate "a-rate"
positionX, AudioParam(読み取り専用)

リスナーの3次元デカルト座標空間でのx位置を設定します。

パラメータ 備考
defaultValue 0
minValue 最小単精度float値 約 -3.4028235e38
maxValue 最大単精度float値 約 3.4028235e38
automationRate "a-rate"
positionY, AudioParam(読み取り専用)

リスナーの3次元デカルト座標空間でのy位置を設定します。

パラメータ 備考
defaultValue 0
minValue 最小単精度float値 約 -3.4028235e38
maxValue 最大単精度float値 約 3.4028235e38
automationRate "a-rate"
positionZ, AudioParam(読み取り専用)

リスナーの3次元デカルト座標空間でのz位置を設定します。

パラメータ 備考
defaultValue 0
minValue 最小単精度float値 約 -3.4028235e38
maxValue 最大単精度float値 約 3.4028235e38
automationRate "a-rate"
upX, AudioParam(読み取り専用)

リスナーが3次元デカルト座標空間で向いている上方向のx成分を設定します。

パラメータ 備考
defaultValue 0
minValue 最小単精度float値 約 -3.4028235e38
maxValue 最大単精度float値 約 3.4028235e38
automationRate "a-rate"
upY, AudioParam(読み取り専用)

リスナーが3次元デカルト座標空間で向いている上方向のy成分を設定します。

パラメータ 備考
defaultValue 1
minValue 最小単精度float値 約 -3.4028235e38
maxValue 最大単精度float値 約 3.4028235e38
automationRate "a-rate"
upZ, AudioParam(読み取り専用)

リスナーが3次元デカルト座標空間で向いている上方向のz成分を設定します。

パラメータ 備考
defaultValue 0
minValue 最小単精度float値 約 -3.4028235e38
maxValue 最大単精度float値 約 3.4028235e38
automationRate "a-rate"

1.11.2. メソッド

setOrientation(x, y, z, xUp, yUp, zUp)

このメソッドは非推奨です。これは forwardX.value, forwardY.value, forwardZ.value, upX.value, upY.value, upZ.value にそれぞれ x, y, z, xUp, yUp, zUp の値を直接代入するのと同じです。

したがって、もし forwardXforwardYforwardZupXupYupZAudioParamsetValueCurveAtTime() でオートメーションカーブが設定されている場合、このメソッド呼び出し時に NotSupportedError を投げなければなりません。

setOrientation() は、リスナーが3次元デカルト座標空間で向いている方向を指定します。forwardベクトルとupベクトルの両方が指定されます。簡単に言えば、forwardベクトルは人の鼻が向いている方向を、upベクトルは頭頂が向いている方向を表します。これら2つのベクトルは線形独立であることが期待されます。これらの値の規範的な解釈については § 6 空間化/パンニング を参照してください。

xyz パラメータは3次元空間の forward方向ベクトルを表し、デフォルト値は (0,0,-1) です。

xUpyUpzUp パラメータは3次元空間の up方向ベクトルを表し、デフォルト値は (0,1,0) です。

AudioListener.setOrientation() メソッドの引数。
パラメータ Nullable Optional 説明
x float AudioListener の forward x 方向
y float AudioListener の forward y 方向
z float AudioListener の forward z 方向
xUp float AudioListener の up x 方向
yUp float AudioListener の up y 方向
zUp float AudioListener の up z 方向
戻り値の型: undefined
setPosition(x, y, z)

このメソッドは非推奨です。これは positionX.value, positionY.value, positionZ.value にそれぞれ x, y, z の値を直接代入するのと同じです。

したがって、もしこの AudioListenerpositionXpositionYpositionZAudioParamsetValueCurveAtTime() でオートメーションカーブが設定されている場合、このメソッド呼び出し時に NotSupportedError を投げなければなりません。

setPosition() は、リスナーの位置を3次元デカルト座標空間で設定します。PannerNode オブジェクトは、各音源との相対位置をこの座標で空間化します。

xyz パラメータは3次元空間の座標値を表します。

デフォルト値は (0,0,0) です。

AudioListener.setPosition() メソッドの引数。
パラメータ Nullable Optional 説明
x float AudioListener の位置の x 座標
y float AudioListener の位置の y 座標
z float AudioListener の位置の z 座標

1.11.3. 処理

AudioListener のパラメータは AudioNode と接続でき、 同じグラフ内の PannerNode の出力にも影響を与えるため、 ノード順序アルゴリズムは処理順序を計算するとき AudioListener を考慮する必要があります。 このため、グラフ内のすべての PannerNodeAudioListener を入力にもつことになります。

1.12. AudioProcessingEvent インターフェース - 非推奨

これは Event オブジェクトであり、ScriptProcessorNode ノードにディスパッチされます。ScriptProcessorNode が削除される際に一緒に削除され、代替の AudioWorkletNode では異なる方法が使われます。

イベントハンドラは、inputBuffer属性から入力(存在する場合)のオーディオデータを取得して処理します。 処理結果のオーディオデータ(入力がなければ合成データ)は outputBuffer に格納されます。

[Exposed=Window]
interface AudioProcessingEvent : Event {
    constructor (DOMString type, AudioProcessingEventInit eventInitDict);
    readonly attribute double playbackTime;
    readonly attribute AudioBuffer inputBuffer;
    readonly attribute AudioBuffer outputBuffer;
};

1.12.1. 属性

inputBuffer, AudioBuffer(読み取り専用)

入力オーディオデータを含む AudioBuffer。createScriptProcessor() メソッドの numberOfInputChannels パラメータに等しいチャンネル数を持ちます。この AudioBuffer は audioprocess イベントハンドラ関数のスコープ内のみ有効です。 このスコープ外では値は無意味です。

outputBuffer, AudioBuffer(読み取り専用)

出力オーディオデータを書き込む AudioBuffer。createScriptProcessor() メソッドの numberOfOutputChannels パラメータに等しいチャンネル数を持ちます。audioprocess イベントハンドラ関数のスコープ内で Script コードはこの AudioBuffer のチャンネルデータを表す Float32Array 配列を変更することが期待されます。スコープ外での変更は音声出力に影響しません。

playbackTime, double(読み取り専用)

オーディオが再生される時刻。AudioContextcurrentTime と同じ時間座標系です。

1.12.2. AudioProcessingEventInit

dictionary AudioProcessingEventInit : EventInit {
    required double playbackTime;
    required AudioBuffer inputBuffer;
    required AudioBuffer outputBuffer;
};
1.12.2.1. 辞書 AudioProcessingEventInit のメンバー
inputBuffer, AudioBuffer

イベントの inputBuffer 属性に代入する値。

outputBuffer, AudioBuffer

イベントの outputBuffer 属性に代入する値。

playbackTime, double

イベントの playbackTime 属性に代入する値。

1.13. BiquadFilterNode インターフェース

BiquadFilterNode は、非常によく使われる低次数フィルタを実装するAudioNodeプロセッサです。

低次数フィルタは、基本的なトーンコントロール(ベース・ミッド・トレブル)、グラフィックイコライザー、さらに高度なフィルタなどの構成要素です。複数のBiquadFilterNodeフィルタを組み合わせて、より複雑なフィルタを構成できます。フィルタパラメータ(例:frequency)はフィルタスイープなどのために時間とともに変更できます。各BiquadFilterNodeは、以下のIDLで示される一般的なフィルタ型のいずれかに設定できます。デフォルトのフィルタ型は"lowpass"です。

frequencydetune複合パラメータを構成し、いずれもa-rateです。両者を組み合わせて、computedFrequency値を決定します:

computedFrequency(t) = frequency(t) * pow(2, detune(t) / 1200)

この複合パラメータ名目範囲は[0, ナイキスト周波数]です。

プロパティ 備考
numberOfInputs 1
numberOfOutputs 1
channelCount 2
channelCountMode "max"
channelInterpretation "speakers"
tail-time あり 入力がゼロでも非サイレントなオーディオ出力を継続します。IIRフィルタなので理論上は無限に出力しますが、実際には出力が十分ゼロに近づいた後、有限時間で打ち切ることができます。具体的な時間はフィルタ係数によります。

出力のチャンネル数は常に入力のチャンネル数と一致します。

enum BiquadFilterType {
    "lowpass",
    "highpass",
    "bandpass",
    "lowshelf",
    "highshelf",
    "peaking",
    "notch",
    "allpass"
};
BiquadFilterType 列挙体の説明
列挙値 説明
"lowpass" ローパスフィルタは、カットオフ周波数以下の周波数を通過させ、カットオフ以上の周波数を減衰させます。12dB/octの標準2次共振ローパスフィルタを実装します。
frequency

カットオフ周波数

Q

カットオフ周波数でのピークの鋭さを制御します。値が大きいとより鋭くなります。

gain

このフィルタ型では使用しません

"highpass" ハイパスフィルタはローパスフィルタの逆で、カットオフ周波数以上の周波数を通過させ、以下を減衰させます。12dB/octの標準2次共振ハイパスフィルタを実装します。
frequency

この周波数より下を減衰させるカットオフ周波数

Q

カットオフ周波数でのピークの鋭さを制御します。値が大きいとより鋭くなります。

gain

このフィルタ型では使用しません

"bandpass" バンドパスフィルタは周波数帯域を通過させ、それ以外の周波数を減衰させます。2次バンドパスフィルタを実装します。
frequency

周波数帯の中心

Q

帯域幅を制御します。Q値が大きいと帯域幅が狭くなります。

gain

このフィルタ型では使用しません

"lowshelf" ローシェルフフィルタは全周波数を通過させますが、低周波数にブースト(または減衰)を加えます。2次ローシェルフフィルタを実装します。
frequency

ブースト(または減衰)が適用される周波数の上限

Q

このフィルタ型では使用しません。

gain

適用するdB単位のブースト。値が負なら減衰。

"highshelf" ハイシェルフフィルタはローシェルフの逆で、全周波数を通過させつつ高周波数にブーストを加えます。2次ハイシェルフフィルタを実装します。
frequency

ブースト(または減衰)が適用される周波数の下限

Q

このフィルタ型では使用しません。

gain

適用するdB単位のブースト。値が負なら減衰。

"peaking" ピーキングフィルタは全周波数を通過させますが、特定範囲にブースト(または減衰)を加えます。
frequency

ブーストを加える中心周波数

Q

ブーストされる周波数帯の幅を制御します。値が大きいほど幅が狭くなります。

gain

適用するdB単位のブースト。値が負なら減衰。

"notch" ノッチフィルタ(バンドストップまたはバンドリジェクション)はバンドパスフィルタの逆で、指定した周波数帯以外を通過させます。
frequency

ノッチを適用する中心周波数

Q

減衰される周波数帯の幅。値が大きいほど幅が狭くなります。

gain

このフィルタ型では使用しません。

"allpass" オールパスフィルタは、すべての周波数を通過させつつ周波数間の位相関係を変化させます。2次オールパスフィルタを実装します。
frequency

位相遷移の中心となる周波数。最大のグループディレイの周波数ともいえる。

Q

中心周波数での位相遷移の鋭さ。値が大きいほど鋭く、グループディレイも大きくなります。

gain

このフィルタ型では使用しません。

BiquadFilterNodeのすべての属性はa-rateAudioParamです。

[Exposed=Window]
interface BiquadFilterNode : AudioNode {
    constructor (BaseAudioContext context, optional BiquadFilterOptions options = {});
    attribute BiquadFilterType type;
    readonly attribute AudioParam frequency;
    readonly attribute AudioParam detune;
    readonly attribute AudioParam Q;
    readonly attribute AudioParam gain;
    undefined getFrequencyResponse (Float32Array frequencyHz,
                                    Float32Array magResponse,
                                    Float32Array phaseResponse);
};

1.13.1. コンストラクター

BiquadFilterNode(context, options)

このコンストラクターが BaseAudioContext c と オプションオブジェクト option で呼び出された場合、ユーザーエージェントは AudioNodeの初期化this に対して context および options を引数にして行わなければなりません。

BiquadFilterNode.constructor() メソッドの引数。
パラメータ Nullable Optional 説明
context BaseAudioContext この新しい BiquadFilterNode関連付けられる BaseAudioContext
options BiquadFilterOptions この BiquadFilterNode の初期パラメータ値(省略可能)。

1.13.2. 属性

Q, AudioParam(読み取り専用)

フィルタの Q値

lowpass および highpass フィルタの場合は、Q値はdB単位で解釈されます。これらのフィルタの名目範囲は \([-Q_{lim}, Q_{lim}]\) で、\(Q_{lim}\) は \(10^{Q/20}\) がオーバーフローしない最大値です。これは約 \(770.63678\) です。

bandpassnotchallpasspeaking フィルタの場合は線形値です。値はフィルタの帯域幅に関係し、正の値であるべきです。名目範囲は \([0, 3.4028235e38]\) です(上限は 最大単精度float値)。

lowshelf および highshelf フィルタでは使用しません。

パラメータ 備考
defaultValue 1
minValue 最小単精度float値 約 -3.4028235e38、ただしフィルタごとに実際の上限は上記参照
maxValue 最大単精度float値 約 3.4028235e38、ただしフィルタごとに実際の上限は上記参照
automationRate "a-rate"
detune, AudioParam(読み取り専用)

frequency用のデチューン値(単位: セント)。複合パラメータであり、frequency と組み合わせて computedFrequency を形成します。

パラメータ 備考
defaultValue 0
minValue \(\approx -153600\)
maxValue \(\approx 153600\) この値はおよそ \(1200\ \log_2 \mathrm{FLT\_MAX}\) で、FLT_MAXは最大のfloat値です。
automationRate "a-rate"
frequency, AudioParam(読み取り専用)

この BiquadFilterNode が動作する周波数(Hz)。複合パラメータであり、detune と組み合わせて computedFrequency を形成します。

gain, AudioParam(読み取り専用)

フィルタのゲイン。値はdB単位です。ゲインは、lowshelfhighshelfpeaking フィルタでのみ使用されます。

パラメータ 備考
defaultValue 0
minValue 最小単精度float値 約 -3.4028235e38
maxValue \(\approx 1541\) この値はおよそ \(40\ \log_{10} \mathrm{FLT\_MAX}\) で、FLT_MAXは最大のfloat値です。
automationRate "a-rate"
type, BiquadFilterType

この BiquadFilterNode のフィルタ型。 デフォルト値は "lowpass" です。 他のパラメータの意味は type 属性値によって異なります。

1.13.3. メソッド

getFrequencyResponse(frequencyHz, magResponse, phaseResponse)

各フィルタパラメータの[[current value]] を用いて、指定した周波数の周波数応答を同期的に計算します。3つのパラメータはすべて同じ長さのFloat32Arrayでなければならず、そうでない場合はInvalidAccessErrorを投げなければなりません。

返される周波数応答は、現在の処理ブロックのAudioParamをサンプリングして計算されなければなりません。

BiquadFilterNode.getFrequencyResponse() メソッドの引数。
パラメータ Nullable Optional 説明
frequencyHz Float32Array このパラメータは応答値を計算する周波数(Hz)の配列を指定します。
magResponse Float32Array このパラメータは線形の振幅応答値を受け取る出力配列です。frequencyHzの値が[0, sampleRate/2]の範囲外の場合、対応するmagResponseの値はNaNとなります。ここでsampleRatesampleRate プロパティ値です。
phaseResponse Float32Array このパラメータはラジアン単位の位相応答値を受け取る出力配列です。frequencyHzの値が[0; sampleRate/2]範囲外の場合、対応するphaseResponseの値はNaNとなります。ここでsampleRatesampleRate プロパティ値です。
戻り値の型: undefined

1.13.4. BiquadFilterOptions

これはBiquadFilterNodeを構築する際に使用するオプションを指定します。 すべてのメンバーは省略可能で、指定されていない場合は通常のデフォルト値でノードが構築されます。

dictionary BiquadFilterOptions : AudioNodeOptions {
    BiquadFilterType type = "lowpass";
    float Q = 1;
    float detune = 0;
    float frequency = 350;
    float gain = 0;
};
1.13.4.1. 辞書 BiquadFilterOptions のメンバー
Q, float(デフォルト値 1

Q の初期値として指定したい値。

detune, float(デフォルト値 0

detune の初期値として指定したい値。

frequency, float(デフォルト値 350

frequency の初期値として指定したい値。

gain, float(デフォルト値 0

gain の初期値として指定したい値。

type, BiquadFilterType(デフォルト値 "lowpass"

フィルタの初期型として指定したい値。

1.13.5. フィルタ特性

BiquadFilterNode で利用可能なフィルタ型には複数の実装方法があり、それぞれ特性が大きく異なります。このセクションの式は、適合実装が実装しなければならないフィルタを規定します。これは各型の特性を決定し、Audio EQ Cookbookの式を参考にしています。

BiquadFilterNode は次の伝達関数でオーディオを処理します:

$$
 H(z) = \frac{\frac{b_0}{a_0} + \frac{b_1}{a_0}z^{-1} + \frac{b_2}{a_0}z^{-2}}
                                          {1+\frac{a_1}{a_0}z^{-1}+\frac{a_2}{a_0}z^{-2}}
$$

これは、時系列の式で表すと次の通りです:

$$
a_0 y(n) + a_1 y(n-1) + a_2 y(n-2) =
    b_0 x(n) + b_1 x(n-1) + b_2 x(n-2)
$$

初期フィルタ状態は0です。

注意: 固定フィルタは安定ですが、AudioParam のオートメーションを利用すると不安定なバイカッドフィルタを生成することも可能です。開発者はこれを管理する責任があります。

注意: UAはフィルタ状態でNaN値が発生した場合、警告を表示することがあります。これは通常、不安定なフィルタの兆候です。

上記伝達関数の係数(\(b_0, b_1, b_2, a_0, a_1, a_2\))はフィルタ型ごとに異なり、各型の係数計算には以下の中間変数が必要です。これはBiquadFilterNodeAudioParamcomputedValueに基づきます。

各フィルタ型ごとに、6つの係数(\(b_0, b_1, b_2, a_0, a_1, a_2\))は以下の通り:

"lowpass"
$$
    \begin{align*}
        b_0 &= \frac{1 - \cos\omega_0}{2} \\
        b_1 &= 1 - \cos\omega_0 \\
        b_2 &= \frac{1 - \cos\omega_0}{2} \\
        a_0 &= 1 + \alpha_{Q_{dB}} \\
        a_1 &= -2 \cos\omega_0 \\
        a_2 &= 1 - \alpha_{Q_{dB}}
    \end{align*}
$$
"highpass"
$$
    \begin{align*}
        b_0 &= \frac{1 + \cos\omega_0}{2} \\
        b_1 &= -(1 + \cos\omega_0) \\
        b_2 &= \frac{1 + \cos\omega_0}{2} \\
        a_0 &= 1 + \alpha_{Q_{dB}} \\
        a_1 &= -2 \cos\omega_0 \\
        a_2 &= 1 - \alpha_{Q_{dB}}
    \end{align*}
$$
"bandpass"
$$
    \begin{align*}
        b_0 &= \alpha_Q \\
        b_1 &= 0 \\
        b_2 &= -\alpha_Q \\
        a_0 &= 1 + \alpha_Q \\
        a_1 &= -2 \cos\omega_0 \\
        a_2 &= 1 - \alpha_Q
    \end{align*}
$$
"notch"
$$
    \begin{align*}
        b_0 &= 1 \\
        b_1 &= -2\cos\omega_0 \\
        b_2 &= 1 \\
        a_0 &= 1 + \alpha_Q \\
        a_1 &= -2 \cos\omega_0 \\
        a_2 &= 1 - \alpha_Q
    \end{align*}
$$
"allpass"
$$
    \begin{align*}
        b_0 &= 1 - \alpha_Q \\
        b_1 &= -2\cos\omega_0 \\
        b_2 &= 1 + \alpha_Q \\
        a_0 &= 1 + \alpha_Q \\
        a_1 &= -2 \cos\omega_0 \\
        a_2 &= 1 - \alpha_Q
    \end{align*}
$$
"peaking"
$$
    \begin{align*}
        b_0 &= 1 + \alpha_Q\, A \\
        b_1 &= -2\cos\omega_0 \\
        b_2 &= 1 - \alpha_Q\,A \\
        a_0 &= 1 + \frac{\alpha_Q}{A} \\
        a_1 &= -2 \cos\omega_0 \\
        a_2 &= 1 - \frac{\alpha_Q}{A}
    \end{align*}
$$
"lowshelf"
$$
    \begin{align*}
        b_0 &= A \left[ (A+1) - (A-1) \cos\omega_0 + 2 \alpha_S \sqrt{A})\right] \\
        b_1 &= 2 A \left[ (A-1) - (A+1) \cos\omega_0 )\right] \\
        b_2 &= A \left[ (A+1) - (A-1) \cos\omega_0 - 2 \alpha_S \sqrt{A}) \right] \\
        a_0 &= (A+1) + (A-1) \cos\omega_0 + 2 \alpha_S \sqrt{A} \\
        a_1 &= -2 \left[ (A-1) + (A+1) \cos\omega_0\right] \\
        a_2 &= (A+1) + (A-1) \cos\omega_0 - 2 \alpha_S \sqrt{A})
    \end{align*}
$$
"highshelf"
$$
    \begin{align*}
        b_0 &= A\left[ (A+1) + (A-1)\cos\omega_0 + 2\alpha_S\sqrt{A} )\right] \\
        b_1 &= -2A\left[ (A-1) + (A+1)\cos\omega_0 )\right] \\
        b_2 &= A\left[ (A+1) + (A-1)\cos\omega_0 - 2\alpha_S\sqrt{A} )\right] \\
        a_0 &= (A+1) - (A-1)\cos\omega_0 + 2\alpha_S\sqrt{A} \\
        a_1 &= 2\left[ (A-1) - (A+1)\cos\omega_0\right] \\
        a_2 &= (A+1) - (A-1)\cos\omega_0 - 2\alpha_S\sqrt{A}
    \end{align*}
$$

1.14. ChannelMergerNode インターフェース

ChannelMergerNode はより高度な用途向けであり、ChannelSplitterNodeと組み合わせて使われることが多いです。

プロパティ 備考
numberOfInputs 備考参照 デフォルトは6ですが、ChannelMergerOptionsnumberOfInputs または createChannelMerger で指定された値によって決まる。
numberOfOutputs 1
channelCount 1 channelCount 制約あり
channelCountMode "explicit" channelCountMode 制約あり
channelInterpretation "speakers"
tail-time なし

このインターフェースは複数のオーディオストリームからチャンネルを1つのオーディオストリームに合成するAudioNodeを表します。入力数は可変(デフォルト6)ですが、すべてが接続されている必要はありません。出力は1つで、いずれかの入力が能動処理中の場合、出力ストリームのチャンネル数は入力数と等しくなります。どの入力も能動処理中でない場合、出力は1チャンネルの無音になります。

複数の入力を1つのストリームに合成するには、各入力は指定されたミックスルールで1チャンネル(モノラル)にダウンミックスされます。未接続の入力も出力では1つの無音チャンネルとしてカウントされます。入力ストリームを変更しても出力チャンネルの順序には影響ありません

例えば、デフォルトの ChannelMergerNode に2つのステレオ入力が接続されている場合、1番目と2番目の入力はそれぞれモノラルにダウンミックスされた後、合成されます。出力は6チャンネルストリームとなり、最初の2チャンネルがそれぞれ最初の2つの(ダウンミックスされた)入力で埋められ、残りのチャンネルは無音になります。

またChannelMergerNode は、5.1サラウンドなどのマルチチャンネルスピーカー配列用に複数のオーディオストリームを特定の順序で配置するのにも使えます。マージャはチャンネルの識別(左・右など)は解釈せず、入力された順番通りに単純にチャンネルを合成します。

channel merger
ChannelMerger の図
[Exposed=Window]
interface ChannelMergerNode : AudioNode {
    constructor (BaseAudioContext context, optional ChannelMergerOptions options = {});
};

1.14.1. コンストラクター

ChannelMergerNode(context, options)

このコンストラクターが BaseAudioContext c と オプションオブジェクト option で呼び出された場合、ユーザーエージェントは AudioNodeの初期化this に対して context および options を引数にして行わなければなりません。

ChannelMergerNode.constructor() メソッドの引数。
パラメータ Nullable Optional 説明
context BaseAudioContext この新しい ChannelMergerNode関連付けられる BaseAudioContext
options ChannelMergerOptions この ChannelMergerNode の初期パラメータ値(省略可能)。

1.14.2. ChannelMergerOptions

dictionary ChannelMergerOptions : AudioNodeOptions {
    unsigned long numberOfInputs = 6;
};
1.14.2.1. 辞書 ChannelMergerOptions のメンバー
numberOfInputs, unsigned long(デフォルト値 6

ChannelMergerNode の入力数。値の制約については createChannelMerger() も参照。

1.15. ChannelSplitterNode インターフェース

ChannelSplitterNode はより高度な用途向けであり、ChannelMergerNodeと組み合わせて使われることが多いです。

プロパティ 備考
numberOfInputs 1
numberOfOutputs 備考参照 デフォルトは6ですが、ChannelSplitterOptions.numberOfOutputscreateChannelSplitternumberOfOutputs および ChannelSplitterOptions の辞書 constructorで指定された値によって決まる。
channelCount numberOfOutputs channelCount 制約あり
channelCountMode "explicit" channelCountMode 制約あり
channelInterpretation "discrete" channelInterpretation 制約あり
tail-time なし

このインターフェースは、ルーティンググラフ内でオーディオストリームの個々のチャンネルにアクセスするAudioNodeを表します。入力は1つで、入力オーディオストリームのチャンネル数に等しい「アクティブ」出力を持ちます。例えば、ステレオ入力がChannelSplitterNodeに接続されていれば、アクティブ出力数は2(左チャンネルと右チャンネル)。出力は常に合計N個(numberOfOutputsパラメータで決定)あり、デフォルト値は指定されなければ6です。アクティブでない出力は無音となり、通常は何も接続されません。

channel splitter
ChannelSplitter の図

この例では、スプリッターはチャンネルの識別(左・右など)は解釈せず、入力された順番通りに単純にチャンネルを分割します。

ChannelSplitterNode の用途例として、各チャンネルの個別ゲイン制御が必要な「マトリックスミキシング」があります。

[Exposed=Window]
interface ChannelSplitterNode : AudioNode {
    constructor (BaseAudioContext context, optional ChannelSplitterOptions options = {});
};

1.15.1. コンストラクター

ChannelSplitterNode(context, options)

このコンストラクターが BaseAudioContext c と オプションオブジェクト option で呼び出された場合、ユーザーエージェントは AudioNodeの初期化this に対して context および options を引数にして行わなければなりません。

ChannelSplitterNode.constructor() メソッドの引数。
パラメータ Nullable Optional 説明
context BaseAudioContext この新しい ChannelSplitterNode関連付けられる BaseAudioContext
options ChannelSplitterOptions この ChannelSplitterNode の初期パラメータ値(省略可能)。

1.15.2. ChannelSplitterOptions

dictionary ChannelSplitterOptions : AudioNodeOptions {
    unsigned long numberOfOutputs = 6;
};
1.15.2.1. 辞書 ChannelSplitterOptions のメンバー
numberOfOutputs, unsigned long(デフォルト値 6

ChannelSplitterNode の出力数。値の制約については createChannelSplitter() も参照。

1.16. ConstantSourceNode インターフェース

このインターフェースは出力が名目上一定値となる定数オーディオソースを表します。一般的な定数ソースノードとして便利で、AudioParamのように構築可能なものとして offset を自動化したり、他のノードを接続して使うこともできます。

このノードの出力は1チャンネル(モノラル)です。

プロパティ 備考
numberOfInputs 0
numberOfOutputs 1
channelCount 2
channelCountMode "max"
channelInterpretation "speakers"
tail-time なし
[Exposed=Window]
interface ConstantSourceNode : AudioScheduledSourceNode {
    constructor (BaseAudioContext context, optional ConstantSourceOptions options = {});
    readonly attribute AudioParam offset;
};

1.16.1. コンストラクター

ConstantSourceNode(context, options)

このコンストラクターが BaseAudioContext c と オプションオブジェクト option で呼び出された場合、ユーザーエージェントは AudioNodeの初期化this に対して context および options を引数にして行わなければなりません。

ConstantSourceNode.constructor() メソッドの引数。
パラメータ Nullable Optional 説明
context BaseAudioContext この新しい ConstantSourceNode関連付けられる BaseAudioContext
options ConstantSourceOptions この ConstantSourceNode の初期パラメータ値(省略可能)。

1.16.2. 属性

offset, AudioParam(読み取り専用)

ソースの定数値。

パラメータ 備考
defaultValue 1
minValue 最小単精度float値 約 -3.4028235e38
maxValue 最大単精度float値 約 3.4028235e38
automationRate "a-rate"

1.16.3. ConstantSourceOptions

これは ConstantSourceNode を構築する際に使用するオプションを指定します。 すべてのメンバーは省略可能で、指定されなければ通常のデフォルト値が使われます。

dictionary ConstantSourceOptions {
    float offset = 1;
};
1.16.3.1. 辞書 ConstantSourceOptions のメンバー
offset, float(デフォルト値 1

このノードの offset AudioParam の初期値。

1.17. ConvolverNode インターフェース

このインターフェースは、インパルス応答を与えて線形畳み込み効果を適用する処理ノードを表します。

プロパティ 備考
numberOfInputs 1
numberOfOutputs 1
channelCount 2 channelCount 制約あり
channelCountMode "clamped-max" channelCountMode 制約あり
channelInterpretation "speakers"
tail-time あり 入力がゼロでもbufferの長さ分、非サイレントなオーディオを出力し続けます。

このノードの入力はモノラル(1チャンネル)またはステレオ(2チャンネル)で、それ以上増やすことはできません。チャンネル数が多いノードからの接続は適切にダウンミックスされます。

このノードにはchannelCount 制約およびchannelCountMode 制約があります。これにより入力はモノラルまたはステレオに限定されます。

[Exposed=Window]
interface ConvolverNode : AudioNode {
    constructor (BaseAudioContext context, optional ConvolverOptions options = {});
    attribute AudioBuffer? buffer;
    attribute boolean normalize;
};

1.17.1. コンストラクター

ConvolverNode(context, options)

このコンストラクターが BaseAudioContext context と オプションオブジェクト options で呼び出された場合、以下の手順を実行します:

  1. normalize 属性を disableNormalization の値の反転に設定します。

  2. もし buffer 存在するなら、buffer 属性にその値を設定します。

    注意: bufferは normalize 属性の値により正規化されます。

  3. o を新しい AudioNodeOptions 辞書とする。

  4. もし channelCountoptions存在するなら、同じ値で ochannelCount を設定する。

  5. もし channelCountModeoptions存在するなら、同じ値で ochannelCountMode を設定する。

  6. もし channelInterpretationoptions存在するなら、同じ値で ochannelInterpretation を設定する。

  7. AudioNodeの初期化this に対して c および o を引数として行う。

ConvolverNode.constructor() メソッドの引数。
パラメータ Nullable Optional 説明
context BaseAudioContext この新しい ConvolverNode関連付けられる BaseAudioContext
options ConvolverOptions この ConvolverNode の初期パラメータ値(省略可能)。

1.17.2. 属性

buffer, AudioBuffer(nullable)

この属性を設定した時点で、buffernormalize属性の状態を使って このインパルス応答に指定された正規化を適用したConvolverNodeを構成します。初期値はnullです。

buffer attribute を設定する際は、以下の同期的な手順を実行します:
  1. bufferのnumber of channels が1, 2, 4いずれでもなく、またbufferのsample-rate が関連付けられたBaseAudioContextsample-rateと一致しない場合は、NotSupportedErrorを投げなければなりません。

  2. AudioBuffer の内容を取得する。

注意: 新しいbufferを設定すると、オーディオにグリッチが発生する場合があります。好ましくない場合は、新たなConvolverNodeを作成し、古いものとクロスフェードすることを推奨します。

注意: ConvolverNodeは、入力チャンネルが1かつbufferが1チャンネルの場合のみモノラル出力となり、それ以外はステレオ出力です。特にbufferが4チャンネルかつ入力が2チャンネルの場合は、行列「真のステレオ」畳み込みを行います。規範的情報はチャンネル構成図参照。

normalize, boolean

bufferが設定された時、インパルス応答が等電力正規化でスケーリングされるかどうかを制御します。デフォルト値はtrueであり、様々なインパルス応答をロードした際により均一な出力レベルを得るためです。normalizefalseの場合、畳み込みはインパルス応答に前処理/スケーリングなしで行われます。この値の変更は、次にbuffer属性が設定されたときのみ有効になります。

normalize属性がfalseのときbuffer属性を設定すると、ConvolverNodeはbufferに格納されたインパルス応答そのままの線形畳み込みを実行します。

一方、normalize属性がtrueのときbuffer属性を設定すると、ConvolverNodeはまずbuffer内のオーディオデータに対してスケーリングしたRMSパワー解析を行い、以下のアルゴリズムでnormalizationScaleを計算します:

function calculateNormalizationScale(buffer) {    const GainCalibration = 0.00125;    const GainCalibrationSampleRate = 44100;    const MinPower = 0.000125;    // RMSパワーで正規化    const numberOfChannels = buffer.numberOfChannels;    const length = buffer.length;    let power = 0;    for (let i = 0; i < numberOfChannels; i++) {        let channelPower = 0;        const channelData = buffer.getChannelData(i);        for (let j = 0; j < length; j++) {            const sample = channelData[j];            channelPower += sample * sample;        }        power += channelPower;    }    power = Math.sqrt(power / (numberOfChannels * length));    // 過負荷防止    if (!isFinite(power) || isNaN(power) || power < MinPower)        power = MinPower;    let scale = 1 / power;    // 未処理音声と知覚音量を同等にするためのキャリブレーション    scale *= GainCalibration;    // サンプルレートに依存したスケーリング    if (buffer.sampleRate)        scale *= GainCalibrationSampleRate / buffer.sampleRate;    // 真のステレオ補正    if (numberOfChannels == 4)        scale *= 0.5;    return scale;}

処理中、ConvolverNodeはこのnormalizationScale値を使い、インパルス応答(bufferで表される)で入力を畳み込みした結果に乗算して最終出力を生成します。または、入力にnormalizationScaleを掛けたり、インパルス応答のバージョンに事前にnormalizationScaleを掛けたりするなど、数学的に等価な方法でも構いません。

1.17.3. ConvolverOptions

これはConvolverNodeを構築する際に使用するオプションを指定します。 すべてのメンバーは省略可能で、指定されなければ通常のデフォルト値でノードが構築されます。

dictionary ConvolverOptions : AudioNodeOptions {
    AudioBuffer? buffer;
    boolean disableNormalization = false;
};
1.17.3.1. 辞書 ConvolverOptions のメンバー
buffer, AudioBuffer(nullable)

ConvolverNode に設定したいbuffer。bufferはdisableNormalizationの値によって正規化されます。

disableNormalization, boolean(デフォルト値 false

ConvolverNodenormalize属性の初期値の逆を指定します。

1.17.4. 入力・インパルス応答・出力のチャンネル構成

実装は ConvolverNode のインパルス応答チャンネルについて、1または2チャンネル入力で様々なリバーブ効果を得るため、以下の構成をサポートしなければなりません。

下図の通り、単一チャンネルの畳み込みはモノラル入力、モノラルインパルス応答、モノラル出力で動作します。残りの図は、入力チャンネル数が1または2、bufferのチャンネル数が1・2・4の場合にサポートされるケースを示しています。 より複雑な任意のマトリックスを希望する開発者は、ChannelSplitterNode、 複数の単一チャンネルConvolverNodeChannelMergerNodeを利用できます。

このノードが能動処理中でない場合、出力は1チャンネルの無音となります。

注意: 下図は能動処理中時の出力を示します。

reverb matrixing
ConvolverNode 使用時の入力および出力チャンネル数の可能性を示す図

1.18. DelayNode インターフェース

ディレイラインはオーディオアプリケーションの基本的な構成要素です。このインターフェースは入力と出力が1つずつのAudioNodeです。

プロパティ 備考
numberOfInputs 1
numberOfOutputs 1
channelCount 2
channelCountMode "max"
channelInterpretation "speakers"
tail-time あり maxDelayTimeまでゼロ入力でも非サイレント音声を出力

出力のチャンネル数は常に入力のチャンネル数と一致します。

入力オーディオ信号を一定時間遅延させます。具体的には、各時刻tで、入力信号input(t)、遅延時間delayTime(t)、出力信号output(t)に対して、output(t) = input(t - delayTime(t))となります。デフォルトのdelayTimeは0秒(遅延なし)です。

DelayNodeの入力チャンネル数が変化した場合(出力チャンネル数も変化)、ノードの内部状態として未出力の遅延オーディオサンプルが残っていることがあります。このサンプルが以前と異なるチャンネル数で受信された場合は、内部の遅延ラインミックスが常に単一の現在のチャンネルレイアウトで行われるよう、アップミックスまたはダウンミックスを行って新しい入力と組み合わせなければなりません。

注意: 定義上、DelayNodeは遅延量と同等のオーディオ処理レイテンシを導入します。

[Exposed=Window]
interface DelayNode : AudioNode {
    constructor (BaseAudioContext context, optional DelayOptions options = {});
    readonly attribute AudioParam delayTime;
};

1.18.1. コンストラクター

DelayNode(context, options)

このコンストラクターが BaseAudioContext c と オプションオブジェクト option で呼び出された場合、ユーザーエージェントは AudioNodeの初期化this に対して context および options を引数にして行わなければなりません。

DelayNode.constructor() メソッドの引数。
パラメータ Nullable Optional 説明
context BaseAudioContext この新しい DelayNode関連付けられる BaseAudioContext
options DelayOptions この DelayNode の初期パラメータ値(省略可能)。

1.18.2. 属性

delayTime, AudioParam(読み取り専用)

適用する遅延量(秒)を表すAudioParamオブジェクト。デフォルトvalueは0(遅延なし)。最小値は0、最大値はmaxDelayTime 引数や DelayOptions 辞書の maxDelayTimeメンバーで決まります。

DelayNodeサイクルの一部なら、delayTime属性値はレンダー量子の最小値にクランプされます。

パラメータ 備考
defaultValue 0
minValue 0
maxValue maxDelayTime
automationRate "a-rate"

1.18.3. DelayOptions

これは DelayNode を構築する際に使用するオプションを指定します。すべてのメンバーは省略可能で、指定しない場合は通常のデフォルト値でノードが構築されます。

dictionary DelayOptions : AudioNodeOptions {
    double maxDelayTime = 1;
    double delayTime = 0;
};
1.18.3.1. 辞書 DelayOptions のメンバー
delayTime, double(デフォルト値 0

ノードの初期遅延時間。

maxDelayTime, double(デフォルト値 1

ノードの最大遅延時間。制約については createDelay(maxDelayTime) 参照。

1.18.4. 処理

DelayNode は内部にdelayTime秒分のオーディオを保持するバッファを持っています。

DelayNodeの処理は、ディレイラインへの書き込みと読み取りの2つに分かれています。これは2つの内部AudioNode(著者には公開されず、ノード内部の動作説明のためだけに存在)によって行われます。どちらもDelayNodeから作成されます。

DelayNodeDelayWriterを作成するとは、AudioNodeと同じインターフェースを持つオブジェクトを作成し、入力オーディオをDelayNodeの内部バッファに書き込むことを意味します。DelayNodeと同じ入力接続を持ちます。

DelayNodeDelayReaderを作成するとは、AudioNodeと同じインターフェースを持つオブジェクトを作成し、DelayNodeの内部バッファからオーディオデータを読み取ることを意味します。DelayNodeと同じAudioNodeと接続されます。DelayReaderソースノードです。

入力バッファを処理する際、DelayWriterはオーディオをDelayNodeの内部バッファに書き込まなければなりません。

出力バッファを生成する際、DelayReaderは対応するDelayWriterdelayTime秒前に書き込んだオーディオと全く同じものを出力しなければなりません。

注意: これはチャンネル数の変更が遅延時間経過後に反映されることを意味します。

1.19. DynamicsCompressorNode インターフェース

DynamicsCompressorNode はダイナミクスコンプレッション効果を実装するAudioNodeプロセッサです。

ダイナミクスコンプレッションは音楽制作やゲームオーディオで非常に一般的に使われます。信号の最も大きい部分の音量を下げ、最も小さい部分の音量を上げます。全体的により大きく、豊かで迫力あるサウンドが実現できます。特に多数の個別サウンドを同時再生するゲームや音楽アプリで、全体の信号レベルを制御し、スピーカーへの音声出力でクリッピング(歪み)を防ぐために重要です。

プロパティ 備考
numberOfInputs 1
numberOfOutputs 1
channelCount 2 channelCount 制約あり
channelCountMode "clamped-max" channelCountMode 制約あり
channelInterpretation "speakers"
tail-time あり このノードにはtail-timeがあり、ルックアヘッド遅延のためゼロ入力でも非サイレント音声を出力し続けます。
[Exposed=Window]
interface DynamicsCompressorNode : AudioNode {
    constructor (BaseAudioContext context,
                 optional DynamicsCompressorOptions options = {});
    readonly attribute AudioParam threshold;
    readonly attribute AudioParam knee;
    readonly attribute AudioParam ratio;
    readonly attribute float reduction;
    readonly attribute AudioParam attack;
    readonly attribute AudioParam release;
};

1.19.1. コンストラクター

DynamicsCompressorNode(context, options)

このコンストラクターが BaseAudioContext c と オプションオブジェクト option で呼び出された場合、ユーザーエージェントは AudioNodeの初期化this に対して context および options を引数にして行わなければなりません。

[[internal reduction]]thisのプライベートスロットで、デシベル単位の浮動小数点数を保持します。[[internal reduction]]を0.0に設定します。

DynamicsCompressorNode.constructor() メソッドの引数。
パラメータ Nullable Optional 説明
context BaseAudioContext この新しい DynamicsCompressorNode関連付けられる BaseAudioContext
options DynamicsCompressorOptions この DynamicsCompressorNode の初期パラメータ値(省略可能)。

1.19.2. 属性

attack, AudioParam(読み取り専用)

10dB分ゲインを下げるのにかかる時間(秒)。

パラメータ 備考
defaultValue .003
minValue 0
maxValue 1
automationRate "k-rate" automation rate 制約あり
knee, AudioParam(読み取り専用)

しきい値を超えた範囲でカーブが「ratio」部分へスムーズに移行する区間を表すデシベル値。

パラメータ 備考
defaultValue 30
minValue 0
maxValue 40
automationRate "k-rate" automation rate 制約あり
ratio, AudioParam(読み取り専用)

出力が1dB変化する際、入力側のdB変化量。

パラメータ 備考
defaultValue 12
minValue 1
maxValue 20
automationRate "k-rate" automation rate 制約あり
reduction, float(読み取り専用)

メーター用の読み取り専用デシベル値で、コンプレッサーが信号に対して現在どれだけゲインリダクションを行っているかを表します。信号が供給されなければ値は0(ゲインリダクションなし)。この属性を読み取る際はプライベートスロット[[internal reduction]]の値を返します。

release, AudioParam(読み取り専用)

10dB分ゲインを上げるのにかかる時間(秒)。

パラメータ 備考
defaultValue .25
minValue 0
maxValue 1
automationRate "k-rate" automation rate 制約あり
threshold, AudioParam(読み取り専用)

コンプレッションが効果を発揮し始めるデシベル値。

パラメータ 備考
defaultValue -24
minValue -100
maxValue 0
automationRate "k-rate" automation rate 制約あり

1.19.3. DynamicsCompressorOptions

これはDynamicsCompressorNodeを構築する際に使用するオプションを指定します。 すべてのメンバーは省略可能で、指定されなければ通常のデフォルト値でノードが構築されます。

dictionary DynamicsCompressorOptions : AudioNodeOptions {
    float attack = 0.003;
    float knee = 30;
    float ratio = 12;
    float release = 0.25;
    float threshold = -24;
};
1.19.3.1. 辞書 DynamicsCompressorOptions のメンバー
attack, float(デフォルト値 0.003

attack AudioParamの初期値。

knee, float(デフォルト値 30

knee AudioParamの初期値。

ratio, float(デフォルト値 12

ratio AudioParamの初期値。

release, float(デフォルト値 0.25

release AudioParamの初期値。

threshold, float(デフォルト値 -24

threshold AudioParamの初期値。

1.19.4. 処理

ダイナミクスコンプレッションには様々な実装方法があります。DynamicsCompressorNode は以下の特徴を持つダイナミクスプロセッサを実装しています:

グラフ化するとこのようなカーブになります:

コンプレッションカーブのグラフィカルな表現
一般的なコンプレッションカーブ(ソフト/ハードニー、しきい値含む)

内部的には、DynamicsCompressorNode は他のAudioNodeと特殊アルゴリズムの組み合わせでゲインリダクション値を計算します。

以下のAudioNodeグラフが内部で使われます。inputoutputはそれぞれ入力・出力AudioNodecontextはこのDynamicsCompressorNode用のBaseAudioContext、そして特殊な EnvelopeFollowerクラスがあり、AudioNodeのように振る舞います。説明は下記:

const delay = new DelayNode(context, {delayTime: 0.006});
const gain = new GainNode(context);
const compression = new EnvelopeFollower();

input.connect(delay).connect(gain).connect(output);
input.connect(compression).connect(gain.gain);
DynamicCompressorNode内部グラフのスキーマ
DynamicsCompressorNode処理アルゴリズムの一部として使われる内部AudioNodeグラフ

注意: これはプレディレイとリダクションゲインの適用を実装します。

以下のアルゴリズムは、入力信号に対してゲインリダクション値を生成するためのEnvelopeFollowerオブジェクトの処理内容です。EnvelopeFollowerは2つのスロットに浮動小数点値を保持し、呼び出し間で値が保存されます。

以下のアルゴリズムは、オーディオのレンダー量子ごとに、各入力サンプルについてreduction gain値を決定します。
  1. attackreleaseは、それぞれattackreleaseの値(k-rateパラメータ)を処理時点でサンプリングし、BaseAudioContextのサンプルレートを掛ける。

  2. detector averageはスロット[[detector average]]の値。

  3. compressor gainはスロット[[compressor gain]]の値。

  4. レンダー量子内の各inputサンプルについて以下を実行:

    1. inputの絶対値が0.0001未満ならattenuationは1.0。それ以外なら、絶対値をcompression curveに通した値をshaped inputとし、attenuationshaped input÷絶対値。

    2. attenuationcompressor gainより大きければreleasingtrue、そうでなければfalse

    3. detector curveattenuationに適用し、detector rateとする。

    4. detector averageattenuationから引き、その差にdetector rateを掛けて加算。

    5. detector averageを最大1.0にクランプ。

    6. envelope rateattackreleaseから計算。

    7. releasingtrueなら、compressor gaincompressor gain×envelope rate(最大1.0にクランプ)。

    8. releasingfalseなら、gain incrementdetector averagecompressor gaingain increment×envelope rateを加算。

    9. reduction gaincompressor gain×makeup gain

    10. metering gainreduction gainデシベルに変換

  5. [[compressor gain]]compressor gainをセット。

  6. [[detector average]]detector averageをセット。

  7. アトミックに内部スロット[[internal reduction]]metering gain値をセット。

    注意: このステップでメーター値はブロック処理終了時に1回更新されます。

メイクアップゲインは固定ゲインステージで、コンプレッサーのratio・knee・thresholdパラメータのみに依存し、入力信号には依存しません。目的は出力レベルを入力レベルと同等にすることです。

メイクアップゲインの計算は次の手順を実行します:
  1. compression curveを1.0に適用し、full range gain

  2. full range makeup gainfull range gainの逆数。

  3. full range makeup gainの0.6乗を返す。

エンベロープレートの計算compressor gaindetector averageの比に関数を適用します。User-Agentはエンベロープ関数の形状を選択できますが、次の制約を満たす必要があります:

この操作はcompressor gaindetector averageの比に関数を適用した値を返します。

detector curveをアタック・リリース時の変化率に適用するとアダプティブリリースを実現できます。次の制約を満たす必要があります:

注意: 例えば圧縮が強いほどリリースが速いアダプティブリリースや、アタックとリリースのカーブ形状が異なるコンプレッサーも許可されます。

圧縮カーブを値に適用するとは、サンプルの値を関数に渡して計算結果を得て、その値を返すことを意味します。この関数は以下の特徴を満たさなければなりません:
  1. threshold および knee に、thresholdknee の値をそれぞれ割り当て、線形単位へ変換し、このブロックの処理時点でサンプリングする(k-rateパラメータとして)。

  2. thresholdknee を、このブロックの処理時点(k-rateパラメータとして)でサンプリングし、その合計を計算する。

  3. この合計値を knee end threshold とし、線形単位へ変換する。

  4. ratio に、ratio の値を割り当て、このブロックの処理時点でサンプリングする(k-rateパラメータとして)。

  5. この関数は、線形 threshold の値までは恒等写像となる(すなわち \(f(x) = x\))。

  6. threshold から knee end threshold までの区間では、ユーザーエージェントはカーブ形状を選択できる。関数全体は単調増加かつ連続でなければならない。

    注: knee が 0 の場合、DynamicsCompressorNode はハードニーコンプレッサーと呼ばれる。

  7. この関数は threshold およびソフトニーより後は、ratio に基づき線形となる(すなわち \(f(x) = \frac{1}{ratio} \cdot x\))。

値\(v\)を線形ゲイン→デシベルに変換するには:
  1. \(v = 0\)なら-1000を返す。

  2. それ以外なら\( 20 \, \log_{10}{v} \)を返す。

値\(v\)をデシベル→線形ゲインに変換するには\(10^{v/20}\)を返す。

1.20. GainNode インターフェース

オーディオ信号のゲイン(増幅)を変更することは、オーディオアプリケーションにおいて基本的な操作です。 このインターフェースは入力・出力が1つずつのAudioNodeです:

プロパティ 備考
numberOfInputs 1
numberOfOutputs 1
channelCount 2
channelCountMode "max"
channelInterpretation "speakers"
tail-time なし

GainNodeの入力データ各チャンネル・各サンプルは、gain AudioParamcomputedValueで乗算されなければなりません。

[Exposed=Window]
interface GainNode : AudioNode {
    constructor (BaseAudioContext context, optional GainOptions options = {});
    readonly attribute AudioParam gain;
};

1.20.1. コンストラクター

GainNode(context, options)

このコンストラクターが BaseAudioContext c と オプションオブジェクト option で呼び出された場合、ユーザーエージェントは AudioNodeの初期化this に対して context および options を引数にして行わなければなりません。

GainNode.constructor() メソッドの引数。
パラメータ Nullable Optional 説明
context BaseAudioContext この新しい GainNode関連付けられる BaseAudioContext
options GainOptions この GainNode の初期パラメータ値(省略可能)。

1.20.2. 属性

gain, AudioParam(読み取り専用)

適用されるゲイン量を表します。

パラメータ 備考
defaultValue 1
minValue 最小単精度float値 約 -3.4028235e38
maxValue 最大単精度float値 約 3.4028235e38
automationRate "a-rate"

1.20.3. GainOptions

これはGainNodeを構築する際に使用するオプションを指定します。すべてのメンバーは省略可能で、指定されなければ通常のデフォルト値でノードが構築されます。

dictionary GainOptions : AudioNodeOptions {
    float gain = 1.0;
};
1.20.3.1. 辞書 GainOptions のメンバー
gain, float(デフォルト値 1.0

このノードのgain AudioParamの初期値。

1.21. IIRFilterNode インターフェース

IIRFilterNode は一般的なIIRフィルタを実装するAudioNodeプロセッサです。一般的には、以下の理由から高次フィルタの実装にはBiquadFilterNodeを使うのが良いです:

ただし、奇数次フィルタは生成できないため、それらが必要な場合や自動化が不要な場合はIIRフィルタが適しています。

一度生成したフィルタ係数は変更できません。

プロパティ 備考
numberOfInputs 1
numberOfOutputs 1
channelCount 2
channelCountMode "max"
channelInterpretation "speakers"
tail-time あり ゼロ入力でも非サイレント音声を出力し続けます。IIRフィルタの性質上、理論的には無限に非ゼロ出力が続きますが、実際には十分ゼロに近づいた時点で終了できます。実際の長さは係数によります。

出力のチャンネル数は常に入力のチャンネル数と一致します。

[Exposed=Window]
interface IIRFilterNode : AudioNode {
    constructor (BaseAudioContext context, IIRFilterOptions options);
    undefined getFrequencyResponse (Float32Array frequencyHz,
                                    Float32Array magResponse,
                                    Float32Array phaseResponse);
};

1.21.1. コンストラクター

IIRFilterNode(context, options)

このコンストラクターが BaseAudioContext c と オプションオブジェクト option で呼び出された場合、ユーザーエージェントは AudioNodeの初期化this に対して context および options を引数にして行わなければなりません。

IIRFilterNode.constructor() メソッドの引数。
パラメータ Nullable Optional 説明
context BaseAudioContext この新しい IIRFilterNode関連付けられる BaseAudioContext
options IIRFilterOptions この IIRFilterNode の初期パラメータ値。

1.21.2. メソッド

getFrequencyResponse(frequencyHz, magResponse, phaseResponse)

現在のフィルタパラメータ設定に基づき、指定した周波数の周波数応答を同期的に計算します。3つのパラメータはすべて同じ長さのFloat32Arrayでなければならず、そうでない場合はInvalidAccessErrorを投げなければなりません。

IIRFilterNode.getFrequencyResponse() メソッドの引数。
パラメータ Nullable Optional 説明
frequencyHz Float32Array 応答値を計算する周波数(Hz)の配列。
magResponse Float32Array 線形の振幅応答値を受け取る出力配列。frequencyHzの値が[0, sampleRate/2]の範囲外の場合、対応するmagResponseの値はNaNとなります。ここでsampleRatesampleRate プロパティ値です。
phaseResponse Float32Array ラジアン単位の位相応答値を受け取る出力配列。frequencyHzの値が[0; sampleRate/2]範囲外の場合、対応するphaseResponseの値はNaNとなります。ここでsampleRatesampleRate プロパティ値です。
戻り値の型: undefined

1.21.3. IIRFilterOptions

IIRFilterOptions辞書はIIRFilterNodeのフィルタ係数指定に使います。

dictionary IIRFilterOptions : AudioNodeOptions {
    required sequence<double> feedforward;
    required sequence<double> feedback;
};
1.21.3.1. 辞書 IIRFilterOptions のメンバー
feedforward, 型 sequence<double>

IIRFilterNodeのフィードフォワード係数。必須。その他の制約はfeedforward引数やcreateIIRFilter()参照。

feedback, 型 sequence<double>

IIRFilterNodeのフィードバック係数。必須。その他の制約はfeedback引数やcreateIIRFilter()参照。

1.21.4. フィルタ定義

\(b_m\)をfeedforward係数、\(a_n\)をfeedback係数とし、これらはcreateIIRFilter()IIRFilterOptions辞書(constructor)で指定します。 このとき一般的なIIRフィルタの伝達関数は、

$$
    H(z) = \frac{\sum_{m=0}^{M} b_m z^{-m}}{\sum_{n=0}^{N} a_n z^{-n}}
$$

ここで、\(M + 1\)はb配列の長さ、\(N + 1\)はa配列の長さです。係数\(a_0\)は0であってはなりません(feedback parameter参照)。 \(b_m\)のうち少なくとも1つは0であってはなりません(feedforward parameter参照)。

同等の時系列式は次の通りです:

$$
    \sum_{k=0}^{N} a_k y(n-k) = \sum_{k=0}^{M} b_k x(n-k)
$$

初期フィルタ状態は全ゼロ状態です。

注意: UAはフィルタ状態にNaN値が生じた場合警告を出すことがあります。これは通常、不安定なフィルタの兆候です。

1.22. MediaElementAudioSourceNode インターフェース

このインターフェースは audio または video 要素からのオーディオソースを表します。

プロパティ 備考
numberOfInputs 0
numberOfOutputs 1
tail-time 参照 なし

出力のチャンネル数は、HTMLMediaElementが参照するメディアのチャンネル数に対応します。 したがって、メディア要素のsrc属性を変更すると、このノードの出力チャンネル数も変化することがあります。

HTMLMediaElementのサンプルレートが、関連付けられたAudioContextのサンプルレートと異なる場合、 HTMLMediaElementからの出力はコンテキストのsample rateに合わせてリサンプリングされなければなりません。

MediaElementAudioSourceNode は、HTMLMediaElementを使って、 AudioContextcreateMediaElementSource()メソッドや、 MediaElementAudioSourceOptions辞書のmediaElementメンバーを使って constructor経由で生成されます。

単一出力のチャンネル数は、HTMLMediaElementcreateMediaElementSource()の引数に渡された場合のオーディオチャンネル数と一致し、オーディオがない場合は1チャンネルとなります。

HTMLMediaElementは、 MediaElementAudioSourceNode生成後も 基本的には同様に動作しますが、再生されるオーディオは直接聞こえるのではなく、 MediaElementAudioSourceNodeがルーティンググラフを通じて接続されることで聞こえるようになります。 したがって、再生・一時停止・シーク・音量・src属性の変更など、HTMLMediaElementの挙動は、 MediaElementAudioSourceNodeなしの場合と同様に動作しなければなりません。

const mediaElement = document.getElementById('mediaElementID');
const sourceNode = context.createMediaElementSource(mediaElement);
sourceNode.connect(filterNode);
[Exposed=Window]
interface MediaElementAudioSourceNode : AudioNode {
    constructor (AudioContext context, MediaElementAudioSourceOptions options);
    [SameObject] readonly attribute HTMLMediaElement mediaElement;
};

1.22.1. コンストラクター

MediaElementAudioSourceNode(context, options)
  1. AudioNodeの初期化this に対して context および options を引数にして行う。

MediaElementAudioSourceNode.constructor() メソッドの引数。
パラメータ Nullable Optional 説明
context AudioContext この新しい MediaElementAudioSourceNode関連付けられる AudioContext
options MediaElementAudioSourceOptions この MediaElementAudioSourceNode の初期パラメータ値。

1.22.2. 属性

mediaElement, HTMLMediaElement(読み取り専用)

この HTMLMediaElement は、この MediaElementAudioSourceNode の構築時に使われます。

1.22.3. MediaElementAudioSourceOptions

これはMediaElementAudioSourceNodeを構築する際に使用するオプションを指定します。

dictionary MediaElementAudioSourceOptions {
    required HTMLMediaElement mediaElement;
};
1.22.3.1. 辞書 MediaElementAudioSourceOptions のメンバー
mediaElement, HTMLMediaElement

リルートされるメディア要素。必須項目です。

1.22.4. MediaElementAudioSourceNodeとクロスオリジンリソースのセキュリティ

HTMLMediaElement はクロスオリジンリソースの再生を許可します。Web Audioでは、MediaElementAudioSourceNodeAudioWorkletNodeScriptProcessorNodeでサンプルを読み取ることができるため、 他オリジンのスクリプトが別オリジンのリソース内容を調べると情報漏洩が生じることがあります。

これを防ぐため、MediaElementAudioSourceNode は、HTMLMediaElement で作成された場合、該当リソースがfetch algorithm [FETCH]によってCORS-cross-originとラベル付けされた場合、通常の出力の代わりに無音を出力しなければなりません。

1.23. MediaStreamAudioDestinationNode インターフェース

このインターフェースは MediaStream を表すオーディオ出力先であり、MediaStreamTrackkind"audio" となる1本のみを持ちます。この MediaStream はノード生成時に作成され、stream 属性経由でアクセスできます。この stream は MediaStreamgetUserMedia() で取得した場合と同様に利用でき、例えば RTCPeerConnection ([webrtc] 参照) の addStream() メソッドでリモートピアに送信できます。

プロパティ 備考
numberOfInputs 1
numberOfOutputs 0
channelCount 2
channelCountMode "explicit"
channelInterpretation "speakers"
tail-time なし

入力のチャンネル数はデフォルトで2(ステレオ)です。

[Exposed=Window]
interface MediaStreamAudioDestinationNode : AudioNode {
    constructor (AudioContext context, optional AudioNodeOptions options = {});
    readonly attribute MediaStream stream;
};

1.23.1. コンストラクター

MediaStreamAudioDestinationNode(context, options)
  1. AudioNodeの初期化this に対して context および options を引数にして行う。

MediaStreamAudioDestinationNode.constructor() メソッドの引数。
パラメータ Nullable Optional 説明
context AudioContext この新しい BaseAudioContext関連付けられる MediaStreamAudioDestinationNode
options AudioNodeOptions この MediaStreamAudioDestinationNode の初期パラメータ値(省略可能)。

1.23.2. 属性

stream, MediaStream(読み取り専用)

この MediaStream は、ノード自身と同じチャンネル数の MediaStreamTrack を1本だけ含み、その kind 属性は "audio" となります。

1.24. MediaStreamAudioSourceNode インターフェース

このインターフェースは MediaStream からのオーディオソースを表します。

プロパティ 備考
numberOfInputs 0
numberOfOutputs 1
tail-time 参照 なし

出力チャンネル数は MediaStreamTrack のチャンネル数に一致します。 MediaStreamTrack が終了した場合、この AudioNode は1チャンネルの無音を出力します。

MediaStreamTrack のサンプルレートが 関連付けられた AudioContext のサンプルレートと異なる場合は、 MediaStreamTrack の出力はコンテキストの sample rate に合わせてリサンプリングされます。

[Exposed=Window]
interface MediaStreamAudioSourceNode : AudioNode {
    constructor (AudioContext context, MediaStreamAudioSourceOptions options);
    [SameObject] readonly attribute MediaStream mediaStream;
};

1.24.1. コンストラクター

MediaStreamAudioSourceNode(context, options)
  1. mediaStream メンバーが options にあり、 MediaStreamMediaStreamTrack が1本以上あり、 その kind 属性値が "audio" でなければ InvalidStateError を投げて中断。 そうでなければ、この stream を inputStream とする。

  2. tracksinputStreamMediaStreamTrack のうち kind"audio" のもの全てのリストとする。

  3. tracks の要素を id 属性で コードユニット値の並び順でソート。

  4. AudioNodeの初期化this に対して context および options を引数にして行う。

  5. この MediaStreamAudioSourceNode の内部スロット [[input track]]tracks の最初の要素をセットする。 これがこのノードの入力オーディオとなる。

構築後、コンストラクターに渡した MediaStream に変更があっても、この AudioNode の出力には影響しません。

スロット [[input track]]MediaStreamTrack への参照保持用です。

注意: コンストラクターで選ばれたトラックを MediaStreamAudioSourceNode から MediaStream から削除しても、 入力は同じトラックから取得し続けます。

注意: 出力トラックの選択仕様はレガシー理由で任意です。入力トラックを明示的に選びたい場合は MediaStreamTrackAudioSourceNode を利用してください。

MediaStreamAudioSourceNode.constructor() メソッドの引数。
パラメータ Nullable Optional 説明
context AudioContext この新しい AudioContext関連付けられる
options MediaStreamAudioSourceOptions この MediaStreamAudioSourceNode の初期パラメータ値。

1.24.2. 属性

mediaStream, MediaStream(読み取り専用)

この MediaStream は、この MediaStreamAudioSourceNode の構築時に使われます。

1.24.3. MediaStreamAudioSourceOptions

これは MediaStreamAudioSourceNode を構築する際に使用するオプションを指定します。

dictionary MediaStreamAudioSourceOptions {
    required MediaStream mediaStream;
};
1.24.3.1. 辞書 MediaStreamAudioSourceOptions のメンバー
mediaStream, MediaStream

ソースとなるメディアストリーム。必須項目です。

1.25. MediaStreamTrackAudioSourceNode インターフェース

このインターフェースは MediaStreamTrack からのオーディオソースを表します。

プロパティ 備考
numberOfInputs 0
numberOfOutputs 1
tail-time 参照 なし

出力チャンネル数は mediaStreamTrack のチャンネル数に一致します。

MediaStreamTrack のサンプルレートが 関連付けられた AudioContext のサンプルレートと異なる場合、 mediaStreamTrack の出力は コンテキストの sample rate に合わせてリサンプリングされます。

[Exposed=Window]
interface MediaStreamTrackAudioSourceNode : AudioNode {
    constructor (AudioContext context, MediaStreamTrackAudioSourceOptions options);
};

1.25.1. コンストラクター

MediaStreamTrackAudioSourceNode(context, options)
  1. mediaStreamTrackkind 属性値が "audio" でなければ InvalidStateError を投げて中断します。

  2. AudioNodeの初期化this に対して context および options を引数にして行う。

MediaStreamTrackAudioSourceNode.constructor() メソッドの引数。
パラメータ Nullable Optional 説明
context AudioContext この新しい AudioContext関連付けられる
options MediaStreamTrackAudioSourceOptions この MediaStreamTrackAudioSourceNode の初期パラメータ値。

1.25.2. MediaStreamTrackAudioSourceOptions

これは MediaStreamTrackAudioSourceNode を構築する際に使用するオプションを指定します。 必須です。

dictionary MediaStreamTrackAudioSourceOptions {
    required MediaStreamTrack mediaStreamTrack;
};
1.25.2.1. 辞書 MediaStreamTrackAudioSourceOptions のメンバー
mediaStreamTrack, MediaStreamTrack

ソースとなるメディアストリームトラック。 この MediaStreamTrackkind 属性値が "audio" でなければ InvalidStateError を投げなければなりません。

1.26. OscillatorNode インターフェース

OscillatorNode は周期波形を生成するオーディオソースを表します。よく使われる波形をいくつか設定できるほか、PeriodicWave オブジェクトを利用して任意の周期波形も設定可能です。

オシレーターは音響合成の基礎的な構成要素です。OscillatorNodeは start() メソッドで指定した時刻から音を出し始めます。

数学的には、連続時間の周期波形は周波数領域で非常に高い(または無限に高い)周波数成分を持ち得ます。この波形を特定のサンプルレートで離散時間のデジタルオーディオ信号としてサンプリングする場合、高周波成分(ナイキスト周波数超)の情報をデジタル化前に捨てる(除去する)必要があります。これを行わない場合、エイリアシングが発生し、高周波成分(ナイキスト周波数超)が 低い周波数領域に折り返して鏡像として現れます。多くの場合、これは聴覚的に不快なアーティファクトを生じます。これはオーディオDSPの基本原理です。

このエイリアシングを回避するため、実装にはいくつか実用的な手法があります。どの手法でも、理想的な離散時間デジタルオーディオ信号は数学的に明確に定義されています。実装のトレードオフはCPU使用量と理想実現度(忠実度)のバランスです。

理想実現に配慮した実装が期待されますが、低価格なハードウェアでは低品質・低負荷な方式も許容されます。

frequencydetunea-rate パラメータで、複合パラメータです。これらで computedOscFrequency値が決まります:

computedOscFrequency(t) = frequency(t) * pow(2, detune(t) / 1200)

OscillatorNodeの瞬時位相は、開始時刻を位相0とした computedOscFrequency の定積分です。公称範囲は [-ナイキスト周波数, ナイキスト周波数]です。

このノードの単一出力は1チャンネル(モノラル)となります。

プロパティ 備考
numberOfInputs 0
numberOfOutputs 1
channelCount 2
channelCountMode "max"
channelInterpretation "speakers"
tail-time なし
enum OscillatorType {
    "sine",
    "square",
    "sawtooth",
    "triangle",
    "custom"
};
OscillatorType 列挙型説明
列挙値 説明
"sine" サイン波
"square" デューティ比0.5の矩形波
"sawtooth" ノコギリ波
"triangle" 三角波
"custom" カスタム周期波
[Exposed=Window]
interface OscillatorNode : AudioScheduledSourceNode {
    constructor (BaseAudioContext context, optional OscillatorOptions options = {});
    attribute OscillatorType type;
    readonly attribute AudioParam frequency;
    readonly attribute AudioParam detune;
    undefined setPeriodicWave (PeriodicWave periodicWave);
};

1.26.1. コンストラクター

OscillatorNode(context, options)

このコンストラクターが BaseAudioContext c と オプションオブジェクト option で呼び出された場合、ユーザーエージェントは AudioNodeの初期化this に対して context および options を引数にして行わなければなりません。

OscillatorNode.constructor() メソッドの引数。
パラメータ Nullable Optional 説明
context BaseAudioContext この新しい OscillatorNode関連付けられる BaseAudioContext
options OscillatorOptions この OscillatorNode の初期パラメータ値(省略可能)。

1.26.2. 属性

detune, AudioParam(読み取り専用)

与えられた値(セント単位)分だけ frequency をオフセットします。デフォルト値は0。a-rateパラメータ。frequency と共に 複合パラメータを形成し、computedOscFrequencyが得られます。下記の公称範囲により、このパラメータで frequency の全範囲をデチューンできます。

パラメータ 備考
defaultValue 0
minValue \(\approx -153600\)
maxValue \(\approx 153600\) この値は \(1200\ \log_2 \mathrm{FLT\_MAX}\)(FLT_MAXは最大float 値)に相当
automationRate "a-rate"
frequency, AudioParam(読み取り専用)

周期波形の周波数(Hz)。デフォルト値は440。a-rateパラメータ。detune とともに 複合パラメータを形成し、computedOscFrequencyとなる。公称範囲は[-ナイキスト周波数, ナイキスト周波数]。

type, OscillatorType

周期波形の形状。直接設定できるのは"custom"以外の定数値のみです。 これを行うと InvalidStateError 例外を投げなければなりません。 setPeriodicWave() メソッドでカスタム波形を設定可能で、その場合この属性は"custom"になります。 デフォルト値は"sine"です。 この属性を設定した際、オシレーターの位相は保存されなければなりません。

1.26.3. メソッド

setPeriodicWave(periodicWave)

PeriodicWaveを指定して任意のカスタム周期波形を設定します。

OscillatorNode.setPeriodicWave() メソッドの引数。
パラメータ Nullable Optional 説明
periodicWave PeriodicWave オシレーターで使用するカスタム波形
戻り値の型: undefined

1.26.4. OscillatorOptions

これはOscillatorNodeを構築する際に使用するオプションを指定します。 すべてのメンバーは省略可能で、未指定の場合は通常のデフォルト値でオシレーターが構築されます。

dictionary OscillatorOptions : AudioNodeOptions {
    OscillatorType type = "sine";
    float frequency = 440;
    float detune = 0;
    PeriodicWave periodicWave;
};
1.26.4.1. 辞書 OscillatorOptions のメンバー
detune, float(デフォルト値 0

OscillatorNodeの初期デチューン値。

frequency, float(デフォルト値 440

OscillatorNodeの初期周波数。

periodicWave, PeriodicWave

OscillatorNode 用のPeriodicWave。 これを指定した場合、type の値は無視され、 "custom"が指定されているものとして扱われます。

type, OscillatorType(デフォルト値 "sine"

構築されるオシレーター種別。これを"custom"にしてperiodicWaveを指定しない場合は InvalidStateError 例外を投げなければなりませんperiodicWave を指定した場合、typeの値は無視され、 "custom"が設定されたものとして扱われます。

1.26.5. 基本波形の位相

各オシレーター種別の理想的な数学的波形を以下に定義します。要約すると、すべての波形は時刻0で正の傾きを持つ奇関数として数学的に定義されます。実際の波形はエイリアシング防止のため異なる場合があります。

オシレーターは、該当するフーリエ級数disableNormalization をfalseにして生成したPeriodicWaveと同じ結果を出力しなければなりません。

"sine"

サインオシレーターの波形:

$$
    x(t) = \sin t
$$
"square"

矩形波オシレーターの波形:

$$
    x(t) = \begin{cases}
                 1 & \mbox{for } 0≤ t < \pi \\
                 -1 & \mbox{for } -\pi < t < 0.
                 \end{cases}
$$

この関数は奇関数で周期\(2\pi\)で全ての\(t\)に拡張されます。

"sawtooth"

ノコギリ波オシレーターの波形(ランプ):

$$
    x(t) = \frac{t}{\pi} \mbox{ for } -\pi < t ≤ \pi;
$$

この関数は奇関数で周期\(2\pi\)で全ての\(t\)に拡張されます。

"triangle"

三角波オシレーターの波形:

$$
    x(t) = \begin{cases}
                     \frac{2}{\pi} t & \mbox{for } 0 ≤ t ≤ \frac{\pi}{2} \\
                     1-\frac{2}{\pi} \left(t-\frac{\pi}{2}\right) & \mbox{for }
                     \frac{\pi}{2} < t ≤ \pi.
                 \end{cases}
$$

この関数は奇関数で周期\(2\pi\)で全ての\(t\)に拡張されます。

1.27. PannerNode インターフェース

このインターフェースは、入力されたオーディオストリームを三次元空間内で位置/空間化する処理ノードを表します。空間化はBaseAudioContextAudioListener (listener属性)との関係で行われます。

プロパティ 備考
numberOfInputs 1
numberOfOutputs 1
channelCount 2 channelCount制約あり
channelCountMode "clamped-max" channelCountMode制約あり
channelInterpretation "speakers"
tail-time 場合による panningModel が"HRTF"の場合、頭部応答処理により無音入力でも非サイレント出力を生成します。それ以外はtail-timeはゼロです。

このノードの入力はモノラル(1ch)またはステレオ(2ch)で、増やすことはできません。チャンネル数が異なるノードからの接続は適切にアップ/ダウンミックスされます。

ノードが積極的に処理中の場合、出力はステレオ(2ch)に固定され、設定変更できません。非処理中は1chの無音となります。

PanningModelType 列挙型は空間化アルゴリズムの種類を決定します。デフォルトは"equalpower"です。

enum PanningModelType {
        "equalpower",
        "HRTF"
};
PanningModelType 列挙型説明
列挙値 説明
"equalpower" イコールパワー・パンニングを使ったシンプルかつ効率的な空間化アルゴリズム。

注意: このパンニングモデルでは、出力計算に使われるAudioParamはすべてa-rateです。

"HRTF" 人体計測インパルス応答の畳み込みを使った高品質空間化アルゴリズム。ステレオ出力を生成します。

注意: このパンニングモデルでは、出力計算に使われるAudioParamはすべてk-rateです。

有効オートメーションレートは、AudioParamPannerNodeに属する場合、panningModelおよびautomationRateによって決定されます。panningModelが「HRTF」の場合、有効オートメーションレートは「k-rate」となり、automationRateの設定に依存しません。それ以外の場合、有効オートメーションレートはautomationRateの値となります。

DistanceModelType 列挙型は、リスナーから音源が離れるほど音量を減衰させる計算アルゴリズムの種類を決定します。デフォルトは"inverse"です。

以下の距離モデルの説明では、\(d\)はリスナーとパンナー間の距離、\(d_{ref}\)はrefDistance属性値、\(d_{max}\)はmaxDistance属性値、\(f\)はrolloffFactor属性値です。

enum DistanceModelType {
    "linear",
    "inverse",
    "exponential"
};
DistanceModelType 列挙型説明
列挙値 説明
"linear" 線形距離モデル。distanceGainは以下で計算:
$$
    1 - f\ \frac{\max\left[\min\left(d, d’_{max}\right), d’_{ref}\right] - d’_{ref}}{d’_{max} - d’_{ref}}
$$

ここで\(d’_{ref} = \min\left(d_{ref}, d_{max}\right)\)、\(d’_{max} = \max\left(d_{ref}, d_{max}\right)\)。\(d’_{ref} = d’_{max}\)の場合、線形モデル値は\(1-f\)となる。

\(d\)は区間\(\left[d’_{ref},\, d’_{max}\right]\)にクランプ。

"inverse" 逆数距離モデル。distanceGainは以下で計算:
$$
    \frac{d_{ref}}{d_{ref} + f\ \left[\max\left(d, d_{ref}\right) - d_{ref}\right]}
$$

\(d\)は区間\(\left[d_{ref},\, \infty\right)\)にクランプ。\n\(d_{ref} = 0\)の場合、モデル値は\(d\)や\(f\)の値に関わらず0になります。

"exponential" 指数距離モデル。distanceGainは以下で計算:
$$
    \left[\frac{\max\left(d, d_{ref}\right)}{d_{ref}}\right]^{-f}
$$

\(d\)は区間\(\left[d_{ref},\, \infty\right)\)にクランプ。\n\(d_{ref} = 0\)の場合、値は\(d\)や\(f\)に関わらず0になります。

[Exposed=Window]
interface PannerNode : AudioNode {
    constructor (BaseAudioContext context, optional PannerOptions options = {});
    attribute PanningModelType panningModel;
    readonly attribute AudioParam positionX;
    readonly attribute AudioParam positionY;
    readonly attribute AudioParam positionZ;
    readonly attribute AudioParam orientationX;
    readonly attribute AudioParam orientationY;
    readonly attribute AudioParam orientationZ;
    attribute DistanceModelType distanceModel;
    attribute double refDistance;
    attribute double maxDistance;
    attribute double rolloffFactor;
    attribute double coneInnerAngle;
    attribute double coneOuterAngle;
    attribute double coneOuterGain;
    undefined setPosition (float x, float y, float z);
    undefined setOrientation (float x, float y, float z);
};

1.27.1. コンストラクター

PannerNode(context, options)

このコンストラクターが BaseAudioContext c と オプションオブジェクト option で呼び出された場合、ユーザーエージェントは AudioNodeの初期化this に対して context および options を引数にして行わなければなりません。

PannerNode.constructor() メソッドの引数。
パラメータ Nullable Optional 説明
context BaseAudioContext この新しい PannerNode関連付けられる BaseAudioContext
options PannerOptions この PannerNode の初期パラメータ値(省略可能)。

1.27.2. 属性

coneInnerAngle, double

指向性オーディオソース用で、音量減衰が起きない角度(度単位)。デフォルト値は360。角度が[0, 360]区間外の場合の動作は未定義。

coneOuterAngle, double

指向性オーディオソース用で、この角度(度単位)外では音量がconeOuterGainで一定に減衰。デフォルト値は360。[0, 360]区間外の場合の動作は未定義。

coneOuterGain, double

指向性オーディオソース用で、coneOuterAngle外でのゲイン値。デフォルト値は0。範囲[0, 1]の線形値。この範囲外ならInvalidStateErrorを投げなければならない。

distanceModel, DistanceModelType

このPannerNodeで使用される距離モデル。デフォルトは"inverse"。

maxDistance, double

音源とリスナーの最大距離。この距離以降は音量減衰しない。デフォルト値は10000。0以下ならRangeError例外を投げなければならない。

orientationX, AudioParam(読み取り専用)

音源が向いている方向ベクトルのx成分(3Dデカルト座標)

パラメータ 備考
defaultValue 1
minValue 最小単精度float値 約 -3.4028235e38
maxValue 最大単精度float値 約 3.4028235e38
automationRate "a-rate" automation rate制約あり
orientationY, AudioParam(読み取り専用)

音源が向いている方向ベクトルのy成分(3Dデカルト座標)

パラメータ 備考
defaultValue 0
minValue 最小単精度float値 約 -3.4028235e38
maxValue 最大単精度float値 約 3.4028235e38
automationRate "a-rate" automation rate制約あり
orientationZ, AudioParam(読み取り専用)

音源が向いている方向ベクトルのz成分(3Dデカルト座標)

パラメータ 備考
defaultValue 0
minValue 最小単精度float値 約 -3.4028235e38
maxValue 最大単精度float値 約 3.4028235e38
automationRate "a-rate" automation rate制約あり
panningModel, PanningModelType

このPannerNodeで使用されるパンニングモデル。デフォルトは"equalpower"。

positionX, AudioParam(読み取り専用)

音源のx座標(3Dデカルト系)

パラメータ 備考
defaultValue 0
minValue 最小単精度float値 約 -3.4028235e38
maxValue 最大単精度float値 約 3.4028235e38
automationRate "a-rate" automation rate制約あり
positionY, AudioParam(読み取り専用)

音源のy座標(3Dデカルト系)

パラメータ 備考
defaultValue 0
minValue 最小単精度float値 約 -3.4028235e38
maxValue 最大単精度float値 約 3.4028235e38
automationRate "a-rate" automation rate制約あり
positionZ, AudioParam(読み取り専用)

音源のz座標(3Dデカルト系)

パラメータ 備考
defaultValue 0
minValue 最小単精度float値 約 -3.4028235e38
maxValue 最大単精度float値 約 3.4028235e38
automationRate "a-rate" automation rate制約あり
refDistance, double

音量減衰の基準距離。この距離未満では音量減衰しない。デフォルト値は1。負値ならRangeError例外を投げなければならない。

rolloffFactor, double

音源がリスナーから離れるほど音量が減衰する速度。デフォルト値は1。負値ならRangeError例外を投げなければならない。

rolloffFactorの公称範囲は rolloffFactorが取りうる最小値と最大値を指定します。範囲外の値は、この範囲にクランプされます。公称範囲はdistanceModel に依存し、次の通りです:

"linear"

公称範囲は \([0, 1]\)。

"inverse"

公称範囲は \([0, \infty)\)。

"exponential"

公称範囲は \([0, \infty)\)。

クランプは距離計算処理時に行われます。属性値は設定された値をそのまま反映し、変更されません。

1.27.3. メソッド

setOrientation(x, y, z)

このメソッドは非推奨です。orientationX.valueorientationY.valueorientationZ.value 属性に、それぞれxyzパラメータを直接設定するのと同じです。

従って、orientationXorientationYorientationZ のいずれかのAudioParamsetValueCurveAtTime() で自動化カーブが設定されている場合、このメソッドを呼び出すとNotSupportedErrorを投げなければなりません。

3次元デカルト座標系で音源が向いている方向を指定します。音の指向性(cone属性で制御)によっては、リスナーと反対方向を向いていると非常に小さくなるか完全に無音になります。

x, y, zパラメータは3D空間の方向ベクトルです。

デフォルト値は(1,0,0)です。

PannerNode.setOrientation() メソッドの引数。
パラメータ Nullable Optional 説明
x float
y float
z float
戻り値の型: undefined
setPosition(x, y, z)

このメソッドは非推奨です。positionX.valuepositionY.valuepositionZ.value 属性に、それぞれxyzパラメータを直接設定するのと同じです。

従って、positionXpositionYpositionZ のいずれかのAudioParamsetValueCurveAtTime() で自動化カーブが設定されている場合、このメソッドを呼び出すとNotSupportedErrorを投げなければなりません。

音源の位置をlistener属性に対して設定します。3次元デカルト座標系を使用します。

x, y, zパラメータは3D空間の座標です。

デフォルト値は(0,0,0)です。

PannerNode.setPosition() メソッドの引数。
パラメータ Nullable Optional 説明
x float
y float
z float
戻り値の型: undefined

1.27.4. PannerOptions

これはPannerNodeを構築する際に使用するオプションを指定します。すべてのメンバーは省略可能で、未指定の場合は通常のデフォルト値でノードが構築されます。

dictionary PannerOptions : AudioNodeOptions {
    PanningModelType panningModel = "equalpower";
    DistanceModelType distanceModel = "inverse";
    float positionX = 0;
    float positionY = 0;
    float positionZ = 0;
    float orientationX = 1;
    float orientationY = 0;
    float orientationZ = 0;
    double refDistance = 1;
    double maxDistance = 10000;
    double rolloffFactor = 1;
    double coneInnerAngle = 360;
    double coneOuterAngle = 360;
    double coneOuterGain = 0;
};
1.27.4.1. 辞書 PannerOptions のメンバー
coneInnerAngle, double(デフォルト値 360

ノードのconeInnerAngle属性の初期値。

coneOuterAngle, double(デフォルト値 360

ノードのconeOuterAngle属性の初期値。

coneOuterGain, double(デフォルト値 0

ノードのconeOuterGain属性の初期値。

distanceModel, DistanceModelType(デフォルト値 "inverse"

ノードで使用する距離モデル。

maxDistance, double(デフォルト値 10000

ノードのmaxDistance属性の初期値。

orientationX, float(デフォルト値 1

orientationX AudioParamの初期x成分値。

orientationY, float(デフォルト値 0

orientationY AudioParamの初期y成分値。

orientationZ, float(デフォルト値 0

orientationZ AudioParamの初期z成分値。

panningModel, PanningModelType(デフォルト値 "equalpower"

ノードで使用するパンニングモデル。

positionX, float(デフォルト値 0

positionX AudioParamの初期x座標値。

positionY, float(デフォルト値 0

positionY AudioParamの初期y座標値。

positionZ, float(デフォルト値 0

positionZ AudioParamの初期z座標値。

refDistance, double(デフォルト値 1

ノードのrefDistance属性の初期値。

rolloffFactor, double(デフォルト値 1

ノードのrolloffFactor属性の初期値。

1.27.5. チャンネル制限

StereoPannerNodeチャンネル制限のセットは、 PannerNodeにも適用されます。

1.28. PeriodicWave インターフェース

PeriodicWave は、OscillatorNode とともに使う任意の周期波形を表します。

適合実装は、PeriodicWave を少なくとも8192要素までサポートしなければなりません。

[Exposed=Window]
interface PeriodicWave {
    constructor (BaseAudioContext context, optional PeriodicWaveOptions options = {});
};

1.28.1. コンストラクター

PeriodicWave(context, options)
  1. p を新しい PeriodicWave オブジェクトとし、[[real]][[imag]] を型 Float32Array の2つの内部スロット、 [[normalize]] を内部スロットとする。

  2. options を次のいずれかのケースに従って処理する:

    1. options.realoptions.imag の両方が指定されている場合

      1. 両者の長さが異なる、またはどちらかの長さが2未満の場合は、IndexSizeErrorを投げてアルゴリズムを中断。

      2. [[real]][[imag]]options.realと同じ長さの新しい配列にセット。

      3. options.real の要素全てを [[real]]に、options.imagの要素全てを [[imag]]にコピー。

    2. options.real のみ指定されている場合

      1. options.real の長さが2未満なら、IndexSizeErrorを投げて中断。

      2. [[real]][[imag]]options.realと同じ長さの配列にセット。

      3. options.real[[real]]にコピーし、[[imag]]は全要素ゼロにする。

    3. options.imag のみ指定されている場合

      1. options.imag の長さが2未満なら、IndexSizeErrorを投げて中断。

      2. [[real]][[imag]]options.imagと同じ長さの配列にセット。

      3. options.imag[[imag]]にコピーし、[[real]]は全要素ゼロにする。

    4. それ以外の場合

      1. [[real]][[imag]]を長さ2のゼロ配列にセット。

      2. [[imag]] のインデックス1に1をセット。

      注意: この PeriodicWaveOscillatorNodeに設定すると、組込タイプ "sine" と同等になる。

  3. 両方の [[real]][[imag]] のインデックス0に0をセットする(DC成分を0にする)。

  4. [[normalize]]disableNormalization属性の逆値に初期化。

  5. p を返す。

PeriodicWave.constructor() メソッドの引数。
パラメータ Nullable Optional 説明
context BaseAudioContext この新しい PeriodicWave関連付けられる BaseAudioContextAudioBufferとは異なり、PeriodicWaveAudioContextOfflineAudioContext間で共有できない。特定のBaseAudioContextに関連付けられる。
options PeriodicWaveOptions この PeriodicWave の初期パラメータ値(省略可能)。

1.28.2. PeriodicWaveConstraints

PeriodicWaveConstraints 辞書は、波形が正規化される方法を指定するために使います。

dictionary PeriodicWaveConstraints {
    boolean disableNormalization = false;
};
1.28.2.1. 辞書 PeriodicWaveConstraints のメンバー
disableNormalization, boolean(デフォルト値 false

周期波形を正規化するかどうか制御します。trueなら波形は正規化されません。falseなら正規化されます。

1.28.3. PeriodicWaveOptions

PeriodicWaveOptions 辞書は波形の構築方法を指定します。real または imag 片方のみ指定の場合、もう片方は同じ長さの全ゼロ配列として扱います(辞書メンバーの説明参照)。 両方未指定なら、OscillatorNodetype "sine" と同等の PeriodicWaveが生成されます。 両方指定の場合、配列長が異なれば NotSupportedError エラーを投げなければなりません

dictionary PeriodicWaveOptions : PeriodicWaveConstraints {
    sequence<float> real;
    sequence<float> imag;
};
1.28.3.1. 辞書 PeriodicWaveOptions のメンバー
imag, 型 sequence<float>

imag パラメータは sine項の配列を表します。最初の要素(インデックス0)はフーリエ級数では存在しません。2番目(インデックス1)が基本周波数、3番目が第一倍音...という意味です。

real, 型 sequence<float>

real パラメータは cosine項の配列を表します。最初の要素(インデックス0)は周期波形のDCオフセット。2番目(インデックス1)が基本周波数、3番目が第一倍音...という意味です。

1.28.4. 波形生成

createPeriodicWave() メソッドは PeriodicWave のフーリエ係数を指定するための2つの配列を受け取ります。\(a\)、\(b\) をそれぞれ長さ \(L\) の [[real]][[imag]]配列とします。基本的な時系列波形 \(x(t)\) は次で計算できます:

$$
    x(t) = \sum_{k=1}^{L-1} \left[a[k]\cos2\pi k t + b[k]\sin2\pi k t\right]
$$

これが基本(未正規化)波形です。

1.28.5. 波形の正規化

この PeriodicWave の内部スロット [[normalize]]true(デフォルト)の場合、 前節で定義した波形を最大値1になるように正規化します。正規化方法は以下の通り。

次を考える:

$$
    \tilde{x}(n) = \sum_{k=1}^{L-1} \left(a[k]\cos\frac{2\pi k n}{N} + b[k]\sin\frac{2\pi k n}{N}\right)
$$

ここで \(N\) は2の累乗です(\(\tilde{x}(n)\)は逆FFTを使って計算可能)。固定正規化係数 \(f\) は次で計算:

$$
    f = \max_{n = 0, \ldots, N - 1} |\tilde{x}(n)|
$$

したがって、実際の正規化波形 \(\hat{x}(n)\) は:

$$
    \hat{x}(n) = \frac{\tilde{x}(n)}{f}
$$

この固定正規化係数は生成されたすべての波形に適用しなければなりません。

1.28.6. オシレーター係数

組込オシレータータイプは PeriodicWave オブジェクトで生成されます。参考までに各組込タイプについて PeriodicWave の係数を示します。デフォルト正規化なしで組込タイプを使いたい場合に役立ちます。

以下の説明では、createPeriodicWave() の 実数係数配列 \(a\)、虚数係数配列 \(b\) を考えます。 すべての場合で \(a[n] = 0\)(波形が奇関数であるため)。また \(b[0] = 0\)です。したがって \(b[n]\) の \(n \ge 1\) のみ下記に指定します。

"sine"
$$
    b[n] = \begin{cases}
                     1 & \mbox{for } n = 1 \\
                     0 & \mbox{otherwise}
                 \end{cases}
$$
"square"
$$
    b[n] = \frac{2}{n\pi}\left[1 - (-1)^n\right]
$$
"sawtooth"
$$
    b[n] = (-1)^{n+1} \dfrac{2}{n\pi}
$$
"triangle"
$$
    b[n] = \frac{8\sin\dfrac{n\pi}{2}}{(\pi n)^2}
$$

1.29. ScriptProcessorNode インターフェース - 非推奨

このインターフェースはAudioNodeであり、 スクリプトを使って直接オーディオの生成・処理・解析が可能です。このノード型は非推奨で、AudioWorkletNodeに置き換えられる予定です。 このテキストは、実装がこのノード型を削除するまで参考用としてのみ残っています。

プロパティ 備考
numberOfInputs 1
numberOfOutputs 1
channelCount numberOfInputChannels ノード生成時に指定したチャンネル数。channelCount制約あり。
channelCountMode "explicit" channelCountMode制約あり
channelInterpretation "speakers"
tail-time なし

ScriptProcessorNodebufferSize を指定して生成され、この値は次のいずれかでなければなりません:256, 512, 1024, 2048, 4096, 8192, 16384。この値は audioprocess イベントが発行される頻度や、各呼び出しで処理すべきサンプルフレーム数を制御します。audioprocess イベントは、ScriptProcessorNode に入力または出力のいずれかが接続されている場合のみ発行されます。bufferSize が小さいほど(数値が低いほど)レイテンシが低く(良好)なります。大きい値は音切れやグリッチ回避に必要です。createScriptProcessor() の bufferSize 引数が未指定または0の場合、実装側で値を選択します。

numberOfInputChannels および numberOfOutputChannels は入力・出力チャンネル数を決定します。両方ともゼロは無効です。

[Exposed=Window]
interface ScriptProcessorNode : AudioNode {
    attribute EventHandler onaudioprocess;
    readonly attribute long bufferSize;
};

1.29.1. 属性

bufferSize, long(読み取り専用)

audioprocess が発行されるたびに処理すべきバッファ(サンプルフレーム数)。合法値は(256, 512, 1024, 2048, 4096, 8192, 16384)。

onaudioprocess, EventHandler

audioprocess イベント型の イベントハンドラーを設定するためのプロパティ。イベントハンドラーに渡されるイベントは AudioProcessingEvent インターフェースを使用します。

1.30. StereoPannerNode インターフェース

このインターフェースは、低コストなパンニングアルゴリズムを使って入力オーディオストリームをステレオイメージ内に定位する処理ノードを表します。このパンニング効果は、ステレオストリーム内のオーディオ要素の位置決めによく使われます。

プロパティ 備考
numberOfInputs 1
numberOfOutputs 1
channelCount 2 channelCount制約あり
channelCountMode "clamped-max" channelCountMode制約あり
channelInterpretation "speakers"
tail-time なし

このノードの入力はステレオ(2チャンネル)で、増やすことはできません。チャンネル数が異なるノードからの接続は適切にアップ/ダウンミックスされます。

このノードの出力はステレオ(2チャンネル)に固定され、設定変更できません。

[Exposed=Window]
interface StereoPannerNode : AudioNode {
    constructor (BaseAudioContext context, optional StereoPannerOptions options = {});
    readonly attribute AudioParam pan;
};

1.30.1. コンストラクター

StereoPannerNode(context, options)

このコンストラクターが BaseAudioContext c と オプションオブジェクト option で呼び出された場合、ユーザーエージェントは AudioNodeの初期化this に対して context および options を引数にして行わなければなりません。

StereoPannerNode.constructor() メソッドの引数。
パラメータ Nullable Optional 説明
context BaseAudioContext この新しい StereoPannerNode関連付けられる BaseAudioContext
options StereoPannerOptions この StereoPannerNode の初期パラメータ値(省略可能)。

1.30.2. 属性

pan, AudioParam(読み取り専用)

出力ステレオイメージ内で入力の位置を表します。-1で完全左、+1で完全右。

パラメータ 備考
defaultValue 0
minValue -1
maxValue 1
automationRate "a-rate"

1.30.3. StereoPannerOptions

これはStereoPannerNodeを構築する際に使用するオプションを指定します。すべてのメンバーは省略可能で、未指定の場合は通常のデフォルト値でノードが構築されます。

dictionary StereoPannerOptions : AudioNodeOptions {
    float pan = 0;
};
1.30.3.1. 辞書 StereoPannerOptions のメンバー
pan, float(デフォルト値 0

pan AudioParamの初期値。

1.30.4. チャンネル制限

処理が上記定義に制約されるため、StereoPannerNodeは 最大2チャンネルのミックス、必ず2チャンネルの出力に制限されます。ChannelSplitterNodeや、 GainNode等で中間処理し、 ChannelMergerNodeで再合成することで、 任意のパンニング・ミックス手法も実現可能です。

1.31. WaveShaperNode インターフェース

WaveShaperNodeAudioNodeプロセッサで、非線形ディストーション効果を実装します。

非線形ウェーブシェイピング・ディストーションは、繊細な非線形ウォーミングから、より顕著なディストーション効果まで幅広く使われます。任意の非線形シェイピングカーブを指定できます。

プロパティ 備考
numberOfInputs 1
numberOfOutputs 1
channelCount 2
channelCountMode "max"
channelInterpretation "speakers"
tail-time 場合による oversample 属性が"2x"または"4x"に設定されている場合のみ tail-timeがあります。 実際のtail-timeの長さは実装依存です。

出力チャンネル数は常に入力チャンネル数と一致します。

enum OverSampleType {
    "none",
    "2x",
    "4x"
};
OverSampleType 列挙型説明
列挙値 説明
"none" オーバーサンプリングしない
"2x" 2倍にオーバーサンプリング
"4x" 4倍にオーバーサンプリング
[Exposed=Window]
interface WaveShaperNode : AudioNode {
    constructor (BaseAudioContext context, optional WaveShaperOptions options = {});
    attribute Float32Array? curve;
    attribute OverSampleType oversample;
};

1.31.1. コンストラクター

WaveShaperNode(context, options)

このコンストラクターが BaseAudioContext c と オプションオブジェクト option で呼び出された場合、ユーザーエージェントは AudioNodeの初期化this に対して context および options を引数にして行わなければなりません。

また、[[curve set]] をこのWaveShaperNodeの内部スロットとし、初期値をfalseにする。optionsが指定され、 curveが含まれていれば、 [[curve set]]trueにする。

WaveShaperNode.constructor() メソッドの引数。
パラメータ Nullable Optional 説明
context BaseAudioContext この新しい WaveShaperNode関連付けられる BaseAudioContext
options WaveShaperOptions この WaveShaperNode の初期パラメータ値(省略可能)。

1.31.2. 属性

curve, Float32Array(nullable)

ウェーブシェイピング効果で使われるシェイピングカーブ。入力信号は原則として範囲[-1, 1]内です。この範囲内の各入力サンプルはシェイピングカーブをインデックス指定で参照し、信号レベル0はカーブ配列の中央値(要素数が奇数の場合)、要素数が偶数の場合は中央2値の間で補間されます。-1未満は配列の最初の値、+1超は配列の最後の値となります。

実装は隣接するカーブ点間の線形補間を行わなければなりません。初期状態ではcurve属性はnullで、その場合WaveShaperNodeは入力をそのまま出力に渡します。

カーブ値は[-1; 1]区間で等間隔に配置されます。偶数要素の場合、信号ゼロの値は存在せず、奇数要素の場合はゼロの値が直接存在します。出力は次のアルゴリズムで決定。

  1. 入力サンプルを \(x\)、対応するノード出力を \(y\)、カーブ配列の \(k\) 番目要素を \(c_k\)、カーブ長を \(N\) とする。

  2. 次を計算:

    $$
        \begin{align*}
        v &= \frac{N-1}{2}(x + 1) \\
        k &= \lfloor v \rfloor \\
        f &= v - k
        \end{align*}
    $$
    
  3. 次で出力:

    $$
        \begin{align*}
        y &=
            \begin{cases}
            c_0 & v \lt 0 \\
            c_{N-1} & v \ge N - 1 \\
            (1-f)\,c_k + fc_{k+1} & \mathrm{otherwise}
            \end{cases}
        \end{align*}
    $$
    

InvalidStateErrorは、 Float32Arraylengthが2未満の値でこの属性を設定したとき投げなければなりません。

この属性が設定されると、WaveShaperNodeはカーブの内部コピーを作成します。したがって、属性設定に使った配列の内容を後で変更しても効果はありません。

curve属性を設定する手順:
  1. new curveFloat32Arrayまたはnullとする。

  2. new curvenullでなく、[[curve set]]がtrueなら、InvalidStateErrorを投げて手順中断。

  3. new curvenullでなければ、[[curve set]]をtrueにする。

  4. new curveをcurve属性に割り当てる。

注意: ゼロ入力で非ゼロ出力値となるカーブを使うと、入力未接続でもこのノードはDC信号を生成します。ノードを下流から切断するまで持続します。

oversample, OverSampleType

シェイピングカーブ適用時にどのオーバーサンプリング方式(有無)を使うか指定します。デフォルトは"none"で、入力サンプルに直接カーブを適用します。"2x"や"4x"は エイリアシング抑制により処理品質向上のため使えます。"4x"が最も高品質。用途によってはオーバーサンプリング無しがシェイピングカーブ精度に有利。

"2x"または"4x"の場合、次の手順を必ず実施:
  1. 入力サンプルをAudioContextのサンプルレートの2倍または4倍にアップサンプリング。 各レンダー量子ごとに2倍(2x)または4倍(4x)のサンプルを生成。

  2. シェイピングカーブを適用。

  3. 結果をAudioContextのサンプルレートにダウンサンプリング。先に処理したサンプルから、最終的に1レンダー量子分のサンプルを生成。

具体的なアップ/ダウンサンプリングフィルタは規定されておらず、音質(エイリアシング低減など)、レイテンシ、パフォーマンスに合わせて調整可能です。

注意: オーバーサンプリングを使うと、アップ/ダウンサンプリングフィルタの影響で処理レイテンシが増加します。レイテンシ量は実装ごとに異なります。

1.31.3. WaveShaperOptions

これはWaveShaperNodeを構築する際に使用するオプションを指定します。すべてのメンバーは省略可能で、未指定の場合は通常のデフォルト値でノードが構築されます。

dictionary WaveShaperOptions : AudioNodeOptions {
    sequence<float> curve;
    OverSampleType oversample = "none";
};
1.31.3.1. 辞書 WaveShaperOptions のメンバー
curve, 型 sequence<float>

ウェーブシェイピング効果用のシェイピングカーブ。

oversample, OverSampleType(デフォルト値 "none"

シェイピングカーブ用に使うオーバーサンプリング方式。

1.32. AudioWorklet インターフェイス

[Exposed=Window, SecureContext]
interface AudioWorklet : Worklet {
  readonly attribute MessagePort port;
};

1.32.1. 属性

port, MessagePort, readonly

MessagePortAudioWorkletGlobalScope のポートに接続されます。

注: この port"message" イベントにイベントリスナーを登録する開発者は、closeMessageChannel のいずれかのエンド(AudioWorklet または AudioWorkletGlobalScope 側)で呼び出し、リソースが収集されるようにしてください。

1.32.2. 概念

AudioWorklet オブジェクトは、開発者がスクリプト(JavaScript や WebAssembly コードなど)を レンダリングスレッド 上でオーディオ処理するために提供し、カスタム AudioNode をサポートします。 この処理機構は、オーディオグラフ内の他の組み込み AudioNode とスクリプトコードの同期的な実行を保証します。

この仕組みを実現するために、対応するオブジェクトのペアを定義しなければなりません:AudioWorkletNodeAudioWorkletProcessor です。 前者は他の AudioNode オブジェクトのようにメイングローバルスコープのインターフェイスを表し、後者は AudioWorkletGlobalScope という特別なスコープ内で内部オーディオ処理を実装します。

AudioWorkletの概念
AudioWorkletNodeAudioWorkletProcessor

BaseAudioContext には、正確に1つの AudioWorklet が存在します。

AudioWorkletworkletグローバルスコープ型AudioWorkletGlobalScope です。

AudioWorkletworklet宛先型"audioworklet" です。

addModule(moduleUrl) メソッドでスクリプトをインポートすると、AudioWorkletProcessor のクラス定義が AudioWorkletGlobalScope 下に登録されます。 インポートしたクラスコンストラクターと、コンストラクターから生成されたアクティブインスタンス用の2種類の内部ストレージ領域があります。

AudioWorklet には1つの内部スロットがあります:

// bypass-processor.js スクリプトファイル、AudioWorkletGlobalScope上で実行
class BypassProcessor extends AudioWorkletProcessor {
    process (inputs, outputs) {
        // 単一入力、単一チャンネル。
        const input = inputs[0];
        const output = outputs[0];
        output[0].set(input[0]);

        // アクティブな入力がある場合のみ処理。
        return false;
    }
};

registerProcessor('bypass-processor', BypassProcessor);
// メイングローバルスコープ
const context = new AudioContext();
context.audioWorklet.addModule('bypass-processor.js').then(() => {
    const bypassNode = new AudioWorkletNode(context, 'bypass-processor');
});

メイングローバルスコープで AudioWorkletNode をインスタンス化する際、対応する AudioWorkletProcessorAudioWorkletGlobalScope で生成されます。これら2つのオブジェクトは § 2 処理モデル で述べる非同期メッセージパッシングによって通信します。

1.32.3. AudioWorkletGlobalScope インターフェイス

この特別な実行コンテキストは、スクリプトによるオーディオデータの生成・処理・解析を、オーディオレンダリングスレッド上で直接可能にするために設計されています。 ユーザーが提供したスクリプトコードはこのスコープで評価され、1つ以上の AudioWorkletProcessor のサブクラスを定義し、それらが AudioWorkletNode と1対1で関連する AudioWorkletProcessor のインスタンス化に利用されます。

AudioContext には、1つ以上の AudioWorkletNode が含まれる場合、必ず1つの AudioWorkletGlobalScope が存在します。 インポートされたスクリプトの実行は [HTML] で定義される UA によって行われます。[HTML] のデフォルト指定を上書きし、 AudioWorkletGlobalScope はユーザーエージェントによって 任意に終了されてはなりません。

AudioWorkletGlobalScope には以下の内部スロットがあります:

注: AudioWorkletGlobalScope には、これらのインスタンス間で共有されるその他のデータやコードも含めることができます。例えば、複数のプロセッサが同じArrayBuffer(ウェーブテーブルやインパルス応答)を共有することも可能です。

注: AudioWorkletGlobalScope は、1つの BaseAudioContext と紐づき、そのコンテキスト用の単一オーディオレンダリングスレッドに関連します。これにより、同時スレッドでグローバルスコープコードが動作する際のデータ競合が防止されます。

callback AudioWorkletProcessorConstructor = AudioWorkletProcessor (object options);

[Global=(Worklet, AudioWorklet), Exposed=AudioWorklet]
interface AudioWorkletGlobalScope : WorkletGlobalScope {
    undefined registerProcessor (DOMString name,
                                               AudioWorkletProcessorConstructor processorCtor);
    readonly attribute unsigned long long currentFrame;
    readonly attribute double currentTime;
    readonly attribute float sampleRate;
    readonly attribute unsigned long renderQuantumSize;
    readonly attribute MessagePort port;
};
1.32.3.1. 属性
currentFrame, unsigned long long, readonly

処理中のオーディオブロックの現在フレーム。これは、[[current frame]] 内部スロットの値と一致しなければなりません。該当する BaseAudioContext の値です。

currentTime, double, readonly

処理中のオーディオブロックのコンテキスト時間。この値は定義上、BaseAudioContextcurrentTime 属性のうち、コントロールスレッドで最新観測可能な値と等しくなります。

sampleRate, float, readonly

関連付けられた BaseAudioContext のサンプルレートです。

renderQuantumSize, unsigned long, readonly

関連付けられた BaseAudioContext のプライベートスロット [[render quantum size]] の値です。

port, MessagePort, readonly

MessagePortAudioWorklet のポートに接続されます。

注: この port"message" イベントにイベントリスナーを登録する場合は、closeMessageChannel のいずれかのエンド(AudioWorklet または AudioWorkletGlobalScope 側)で呼び出し、リソースが収集されるようにしてください。

1.32.3.2. メソッド
registerProcessor(name, processorCtor)

AudioWorkletProcessor から派生したクラスコンストラクターを登録します。

registerProcessor(name, processorCtor) メソッドが呼び出されたとき、以下の手順を実行します。いずれかの段階で例外が発生した場合、残りの手順は中止されます。
  1. name が空文字列の場合、NotSupportedError をスローします

  2. namenode name to processor constructor map に既にキーとして存在する場合、NotSupportedError をスローします

  3. IsConstructor(argument=processorCtor) の結果が false の場合、TypeError をスローします

  4. prototype Get(O=processorCtor, P="prototype") の結果とします。

  5. Type(argument=prototype) の結果が Object でない場合、TypeError をスローします

  6. parameterDescriptorsValueGet(O=processorCtor, P="parameterDescriptors") の結果とします。

  7. parameterDescriptorsValueundefined でない場合、次の手順を実行します:

    1. parameterDescriptorSequence変換 により parameterDescriptorsValue から sequence<AudioParamDescriptor> 型のIDL値へ変換した結果とします。

    2. paramNames を空の配列とします。

    3. parameterDescriptorSequence の各 descriptor について:
      1. paramNamedescriptor 内の name メンバーの値とします。NotSupportedError をスローします、もし paramNames に既に paramName の値が含まれる場合。

      2. paramNameparamNames 配列に追加します。

      3. defaultValuedescriptor 内の defaultValue メンバーの値とします。

      4. minValuedescriptor 内の minValue メンバーの値とします。

      5. maxValuedescriptor 内の maxValue メンバーの値とします。

      6. もし minValue <= defaultValue <= maxValue 式が false なら、InvalidStateError をスローします

  8. nameprocessorCtor のキーと値のペアを、関連する node name to processor constructor map に追加します。該当する AudioWorkletGlobalScope のものです。

  9. media element task をキューして、nameparameterDescriptorSequence のキーと値のペアを 関連する node name to parameter descriptor map に追加します。該当する BaseAudioContext のものです。

注: クラスコンストラクターの参照は一度だけ検索されるべきであり、登録後に動的に変更される機会はありません。

AudioWorkletGlobalScope.registerProcessor(name, processorCtor) メソッドの引数
パラメータ Nullable Optional 説明
name DOMString 登録するクラスコンストラクターを表す文字列キー。このキーは AudioWorkletProcessor のコンストラクターを AudioWorkletNode 構築時に検索するために使われます。
processorCtor AudioWorkletProcessorConstructor AudioWorkletProcessor から拡張されたクラスコンストラクターです。
返却型: undefined
1.32.3.3. AudioWorkletProcessor のインスタンス化

AudioWorkletNode の構築の最後に、 構造体である プロセッサー構築データ がスレッド間転送のために準備されます。この 構造体 には以下の 項目が含まれます:

転送されたデータが AudioWorkletGlobalScope に到着すると、レンダリングスレッド は以下のアルゴリズムを呼び出します:

  1. constructionDataプロセッサー構築データ制御スレッドから転送されたもの)とする。

  2. processorNamenodeReferenceserializedPort をそれぞれ constructionDatanamenodeport とする。

  3. serializedOptionsconstructionDataoptions とする。

  4. deserializedPortStructuredDeserialize(serializedPort, 現在の Realm) の結果とする。

  5. deserializedOptionsStructuredDeserialize(serializedOptions, 現在の Realm) の結果とする。

  6. processorCtorprocessorName をキーとして AudioWorkletGlobalScopeノード名とプロセッサーコンストラクタのマップ から検索した結果とする。

  7. nodeReference および deserializedPort をこの AudioWorkletGlobalScopeノード参照転送ポート にそれぞれ格納する。

  8. コールバック関数の構築processorCtor から deserializedOptions を引数として行う。コールバック内で例外がスローされた場合は、タスクをキューし、制御スレッドイベントprocessorerrornodeReferenceErrorEvent を用いて発火する。

  9. pending processor construction data スロットを空にする。

1.32.4. AudioWorkletNode インターフェイス

このインターフェイスは、ユーザー定義の AudioNode を表し、 制御スレッド上で動作します。 ユーザーは AudioWorkletNodeBaseAudioContext から作成でき、 このノードは他の組み込み AudioNode と接続して オーディオグラフを構成できます。

プロパティ 備考
numberOfInputs 1
numberOfOutputs 1
channelCount 2
channelCountMode "max"
channelInterpretation "speakers"
tail-time 備考参照 すべての tail-time はノード自身で処理されます

すべての AudioWorkletProcessorアクティブソース フラグを持ち、初期値は true です。このフラグにより、入力が接続されていない場合でもノードはメモリに保持され、オーディオ処理を行います。

すべての AudioWorkletNode から投稿されたタスクは、関連付けられた BaseAudioContext のタスクキューに投稿されます。

[Exposed=Window]
interface AudioParamMap {
    readonly maplike<DOMString, AudioParam>;
};

このインターフェイスは readonly maplike によって "entries", "forEach", "get", "has", "keys", "values", @@iterator メソッドおよび "size" ゲッターを備えます。

[Exposed=Window, SecureContext]
interface AudioWorkletNode : AudioNode {
    constructor (BaseAudioContext context, DOMString name,
               optional AudioWorkletNodeOptions options = {});
    readonly attribute AudioParamMap parameters;
    readonly attribute MessagePort port;
    attribute EventHandler onprocessorerror;
};
1.32.4.1. コンストラクター
AudioWorkletNode(context, name, options)
AudioWorkletNode.constructor() メソッドの引数。
パラメーター Nullable Optional 説明
context BaseAudioContext この新しい BaseAudioContextAudioWorkletNode関連付けられます。
name DOMString この文字列は BaseAudioContextノード名からパラメータ記述子へのマップ のキーとなります。
options AudioWorkletNodeOptions この AudioWorkletNode の初期パラメータ値(任意)。

コンストラクターが呼び出されたとき、ユーザーエージェントは 制御スレッドで以下の手順を実行しなければなりません:

AudioWorkletNode コンストラクターが context, nodeName, options で呼び出された場合:
  1. nodeNameBaseAudioContextノード名からパラメータ記述子へのマップ にキーとして存在しない場合、InvalidStateError 例外を投げてこれらの手順を中止する。

  2. nodethis の値とする。

  3. AudioNode の初期化nodecontextoptions を引数として実行する。

  4. 入力、出力および出力チャンネルの設定nodeoptions で行う。 例外が発生した場合は残りの手順を中止する。

  5. messageChannel を新しい MessageChannel とする。

  6. nodePortmessageChannelport1 属性の値とする。

  7. processorPortOnThisSidemessageChannelport2 属性の値とする。

  8. serializedProcessorPortStructuredSerializeWithTransfer(processorPortOnThisSide, « processorPortOnThisSide ») の結果とする。

  9. Convert options 辞書を optionsObject に変換する。

  10. serializedOptionsStructuredSerialize(optionsObject) の結果とする。

  11. nodeportnodePort に設定する。

  12. parameterDescriptorsnodeNameノード名からパラメータ記述子へのマップ から取得した結果とする:

    1. audioParamMap を新しい AudioParamMap オブジェクトとする。

    2. parameterDescriptors の各 descriptor について:

      1. paramNamename メンバーの値とする。

      2. audioParam を新しい AudioParam インスタンスとして、automationRate, defaultValue, minValue, および maxValue の値を descriptor の各メンバーの値と同じにする。

      3. audioParamMap の entries に paramNameaudioParam のペアを追加する。

    3. parameterDataoptions に存在する場合は、以下の手順を実行する:

      1. parameterDataparameterData の値とする。

      2. parameterData の各 paramNameparamValue について:

        1. audioParamMapparamName のキーのエントリが存在する場合は、そのエントリを audioParamInMap とする。

        2. audioParamInMapvalue プロパティを paramValue に設定する。

    4. nodeparametersaudioParamMap に設定する。

  13. 制御メッセージをキューに入れることで、対応するAudioWorkletProcessorのコンストラクター呼び出す。この際、プロセッサー構築データとして、nodeNamenodeserializedOptionsserializedProcessorPortが渡される。

1.32.4.2. 属性
onprocessorerror, EventHandler

プロセッサの constructorprocess メソッド、 またはユーザー定義クラスメソッドから未処理の例外がスローされた場合、プロセッサは メディア要素タスクをキューし、イベントを発火して関連付けられた processorerror イベントを AudioWorkletNode で発生させ、ErrorEvent を使用します。

ErrorEventmessagefilenamelinenocolno 属性を制御スレッドで適切に作成・初期化されます。

未処理の例外がスローされると、その後プロセッサは生涯にわたり無音を出力する点に注意してください。

parameters, AudioParamMap, readonly

parameters 属性は、名前付きで関連付けられた AudioParam オブジェクトのコレクションです。この maplike オブジェクトは、 AudioWorkletProcessor クラスのコンストラクターで AudioParamDescriptor のリストからインスタンス化時に生成されます。

port, MessagePort, readonly

すべての AudioWorkletNode には port が関連付けられており、この MessagePort です。 このポートは 対応する AudioWorkletProcessor オブジェクトのポートと接続されており、 AudioWorkletNodeAudioWorkletProcessor の間で双方向通信が可能です。

注: この port"message" イベントにイベントリスナーを登録する著者は、closeMessageChannel のいずれか一方(AudioWorkletProcessor または AudioWorkletNode 側)で呼び出し、リソースを回収できるようにしてください。

1.32.4.3. AudioWorkletNodeOptions

AudioWorkletNodeOptions 辞書は AudioWorkletNode のインスタンスの属性を初期化するために使用できます。

dictionary AudioWorkletNodeOptions : AudioNodeOptions {
    unsigned long numberOfInputs = 1;
    unsigned long numberOfOutputs = 1;
    sequence<unsigned long> outputChannelCount;
    record<DOMString, double> parameterData;
    object processorOptions;
};
1.32.4.3.1. 辞書 AudioWorkletNodeOptions のメンバー
numberOfInputs, unsigned long、デフォルトは 1

これは AudioNodenumberOfInputs 属性の値を初期化するために使用されます。

numberOfOutputs, unsigned long、デフォルトは 1

これは AudioNodenumberOfOutputs 属性の値を初期化するために使用されます。

outputChannelCount, sequence<unsigned long>

この配列は各出力のチャンネル数を設定するために使用されます。

parameterData, 型 record<DOMString, double>

これはユーザー定義のキーと値のペアのリストであり、AudioParamvalueAudioWorkletNode 内で名前が一致するものに初期設定するために使用されます。

processorOptions, object

これは AudioWorkletNode に紐付けられる AudioWorkletProcessor インスタンスのカスタムプロパティ初期化に使用できる任意のユーザー定義データです。

1.32.4.3.2. AudioWorkletNodeOptions によるチャンネル設定

以下のアルゴリズムは AudioWorkletNodeOptions で様々なチャンネル構成を設定する方法を示します。

  1. node をこのアルゴリズムに与えられた AudioWorkletNode インスタンスとする。

  2. numberOfInputsnumberOfOutputs の両方が 0 の場合、 NotSupportedError を投げて以降の手順を中止する。

  3. outputChannelCount存在する場合、

    1. outputChannelCount のいずれかの値が 0 または実装の最大チャンネル数を超えている場合、NotSupportedError を投げて以降の手順を中止する。

    2. outputChannelCount の長さが numberOfOutputs と等しくない場合、IndexSizeError を投げて以降の手順を中止する。

    3. numberOfInputsnumberOfOutputs の両方が 1 の場合、 node の出力チャンネル数を outputChannelCount の1つの値に設定する。

    4. それ以外の場合は node の k 番目の出力チャンネル数を outputChannelCount 配列の k 番目の要素に設定し、return する。

  4. outputChannelCount存在しない場合、

    1. numberOfInputsnumberOfOutputs の両方が 1 の場合、 node の初期出力チャンネル数を 1 に設定し、return する。

      注: この場合、出力チャンネル数は 入力と channelCountMode に基づいて、実行時に computedNumberOfChannels に動的に変更されます。

    2. それ以外の場合は node の各出力チャンネル数を 1 に設定し、return する。

1.32.5. AudioWorkletProcessor インターフェイス

このインターフェイスは、オーディオ レンダリングスレッド 上で動作する オーディオ処理コードを表します。 AudioWorkletGlobalScope 内に存在し、クラス定義が実際のオーディオ処理を実現します。 AudioWorkletProcessor の構築は AudioWorkletNode の構築によってのみ発生することに注意してください。

[Exposed=AudioWorklet]
interface AudioWorkletProcessor {
    constructor ();
    readonly attribute MessagePort port;
};

callback AudioWorkletProcessCallback =
  boolean (FrozenArray<FrozenArray<Float32Array>> inputs,
           FrozenArray<FrozenArray<Float32Array>> outputs,
           object parameters);

AudioWorkletProcessor には2つの内部スロットがあります:

[[node reference]]

関連付けられた AudioWorkletNode への参照です。

[[callable process]]

process() が呼び出し可能な関数かどうかを示す真偽値フラグです。

1.32.5.1. コンストラクター
AudioWorkletProcessor()

AudioWorkletProcessor のコンストラクターが呼び出されるとき、 以下の手順が レンダリングスレッド上で実行されます。

  1. nodeReference を 現在の AudioWorkletGlobalScopepending processor construction data から検索したノード参照とする。 スロットが空の場合は TypeError 例外を投げる。

  2. processorthis の値とする。

  3. processor[[node reference]]nodeReference を設定する。

  4. processor[[callable process]]true に設定する。

  5. deserializedPortpending processor construction data から検索した転送ポートとする。

  6. processorportdeserializedPort を設定する。

  7. pending processor construction data スロットを空にする。

1.32.5.2. 属性
port, MessagePort, readonly

すべての AudioWorkletProcessor には port が関連付けられており、これは MessagePort です。 このポートは 対応する AudioWorkletNode オブジェクトのポートと接続されており、 AudioWorkletNodeAudioWorkletProcessor の間で双方向通信が可能です。

注: この port"message" イベントにイベントリスナーを登録する著者は、closeMessageChannel のいずれか一方(AudioWorkletProcessor または AudioWorkletNode 側)で呼び出し、リソースを回収できるようにしてください。

1.32.5.3. コールバック AudioWorkletProcessCallback

ユーザーは AudioWorkletProcessor を拡張してカスタムオーディオプロセッサーを定義できます。 サブクラスは AudioWorkletProcessCallback である process() を定義しなければならず、オーディオ処理アルゴリズムを実装し、静的プロパティ parameterDescriptors を持つことができ、これは AudioParamDescriptor のイテラブルです。

process() コールバック関数は グラフのレンダリングで指定された通りに扱われます。

このコールバックの戻り値は、 AudioWorkletProcessor に紐付けられた AudioWorkletNode のライフタイムを制御します。

このライフタイム方針は 組み込みノードで見られる様々な方式をサポートできます。例:

上記定義は process() 実装で戻り値がない場合(事実上 false とみなされる、 実効的な戻り値は falsy な undefined)は 入力がアクティブな時のみアクティブな AudioWorkletProcessor には合理的な挙動であることを意味します。

下記例は AudioParamAudioWorkletProcessor で定義・利用する方法を示します。

class MyProcessor extends AudioWorkletProcessor {
  static get parameterDescriptors() {
    return [{
      name: 'myParam',
      defaultValue: 0.5,
      minValue: 0,
      maxValue: 1,
      automationRate: "k-rate"
    }];
  }

  process(inputs, outputs, parameters) {
    // 1つ目のinputとoutputを取得
    const input = inputs[0];
    const output = outputs[0];
    const myParam = parameters.myParam;

    // 単純なアンプ処理。automationRateが"k-rate"なので各レンダー量子ごとに[0]のみ
    for (let channel = 0; channel < output.length; ++channel) {
      for (let i = 0; i < output[channel].length; ++i) {
        output[channel][i] = input[channel][i] * myParam[0];
      }
    }
  }
}
1.32.5.3.1. コールバック AudioWorkletProcessCallback のパラメーター
以下は AudioWorkletProcessCallback 関数のパラメーターの説明です。

一般に、inputs および outputs 配列は呼び出し間で再利用され、メモリ割り当てが行われません。ただし、トポロジーが変化した場合(例えば、入力や出力のチャンネル数が変化した場合)、新しい配列が再割り当てされます。また、inputsoutputs のいずれかが転送された場合も新しい配列が再割り当てされます。

inputsFrozenArray<FrozenArray<Float32Array>>

ユーザーエージェントが提供する入力オーディオバッファ。inputs[n][m] は \(n\) 番目の入力の \(m\) 番目のチャンネル用の Float32Array です。入力数は構築時に固定ですが、チャンネル数は computedNumberOfChannels に基づき動的に変更できます。

現在のレンダー量子において AudioWorkletNode の \(n\) 番目の入力に actively processingAudioNode が接続されていない場合、 inputs[n] の内容は空配列となり、入力チャンネル数が 0 であることを示します。この場合のみ inputs[n] の要素数が 0 になる可能性があります。

outputsFrozenArray<FrozenArray<Float32Array>>

ユーザーエージェントが消費するための出力オーディオバッファ。outputs[n][m] は \(n\) 番目の出力の \(m\) 番目のチャンネル用の Float32Array オブジェクトで、オーディオサンプルが格納されます。各 Float32Array はゼロで初期化されています。ノードに出力が1つしかない場合、出力チャンネル数は computedNumberOfChannels と一致します。

parametersobject

ordered mapnameparameterValuesparameters["name"]parameterValues を返し、これは FrozenArray<Float32Array> で、その nameAudioParam のオートメーション値です。

各配列には computedValuerender quantum のすべてのフレーム分入っています。ただし、このレンダー量子内でオートメーションがスケジュールされていなければ、配列の長さは 1 で、その値は AudioParam の定数値となる場合があります。

このオブジェクトは以下の手順でフリーズされます。

  1. parameterordered map の name とパラメータ値とする。

  2. SetIntegrityLevel(parameter, frozen)

このフリーズされた ordered map は、アルゴリズムで計算されて parameters 引数に渡されます。

注: このオブジェクトは変更できないため、 配列の長さが変わらない限り、連続した呼び出しで同じオブジェクトを使うことができます。

1.32.5.4. AudioParamDescriptor

AudioParamDescriptor 辞書は、 AudioParam オブジェクトのプロパティを指定するために使用します。 このオブジェクトは AudioWorkletNode で利用されます。

dictionary AudioParamDescriptor {
    required DOMString name;
    float defaultValue = 0;
    float minValue = -3.4028235e38;
    float maxValue = 3.4028235e38;
    AutomationRate automationRate = "a-rate";
};
1.32.5.4.1. 辞書 AudioParamDescriptor のメンバー

これらのメンバーの値には制約があります。詳細は AudioParamDescriptor の処理アルゴリズムを参照してください。

automationRate, AutomationRate、デフォルトは "a-rate"

デフォルトのオートメーションレートを表します。

defaultValue, float、デフォルトは 0

パラメータのデフォルト値を表します。

maxValue, float、デフォルトは 3.4028235e38

最大値を表します。

minValue, float、デフォルトは -3.4028235e38

最小値を表します。

name, DOMString

パラメータの名前を表します。

1.32.6. AudioWorklet のイベントシーケンス

以下の図は、AudioWorklet に関して発生する理想化されたイベントシーケンスを示します:

AudioWorklet のシーケンス

図に示されている手順は、AudioContext と それに関連付けられる AudioWorkletGlobalScope の作成、 さらに AudioWorkletNode と それに紐付く AudioWorkletProcessor の作成に関する 一例のイベントシーケンスです。

  1. AudioContext が作成される。

  2. メインスコープで context.audioWorklet にスクリプトモジュールの追加要求を行う。

  3. まだ存在しない場合、新しい AudioWorkletGlobalScope が context に関連付けて作成される。これは AudioWorkletProcessor の クラス定義が評価されるグローバルスコープとなる。(以降の呼び出しでは、既存のスコープが利用される。)

  4. インポートされたスクリプトが新たに作成されたグローバルスコープで実行される。

  5. インポートされたスクリプトの実行の一部として、AudioWorkletProcessor"custom"(上記図の例)というキーで AudioWorkletGlobalScope 内に 登録される。これにより、グローバルスコープおよび AudioContext の両方でマップが更新される。

  6. addModule() の promise が解決される。

  7. メインスコープで、ユーザーが指定したキーとオプション辞書を使って AudioWorkletNode が作成される。

  8. ノードの作成時、このキーを用いて正しい AudioWorkletProcessor のサブクラスがインスタンス化用に検索される。

  9. その AudioWorkletProcessor サブクラスのインスタンスが、同じオプション辞書の構造化クローンでインスタンス化される。 このインスタンスは、先に作成された AudioWorkletNode とペアになる。

1.32.7. AudioWorklet の例

1.32.7.1. BitCrusher ノード

ビットクラッシングは、サンプル値の量子化(より低いビット深度のシミュレーション)と 時間解像度の量子化(より低いサンプルレートのシミュレーション)によって オーディオストリームの品質を下げる仕組みです。 この例では、AudioParam(この場合は a-rateとして扱う)を AudioWorkletProcessor 内で利用する方法を示しています。

const context = new AudioContext();context.audioWorklet.addModule('bitcrusher.js').then(() => {    const osc = new OscillatorNode(context);    const amp = new GainNode(context);    // ワークレットノードを作成。'BitCrusher'は    // bitcrusher.jsインポート時に登録された    // AudioWorkletProcessor を識別する。optionsはAudioParamsを自動初期化。    const bitcrusher = new AudioWorkletNode(context, 'bitcrusher', {        parameterData: {bitDepth: 8}    });    osc.connect(bitcrusher).connect(amp).connect(context.destination);    osc.start();});
class Bitcrusher extends AudioWorkletProcessor {
    ...(コードは原文通り)...

注: AudioWorkletProcessor クラスの定義で、著者が提供したコンストラクターが this 以外を返したり super() を正しく呼ばない場合は InvalidStateError がスローされます。

1.32.7.2. VUメーターノード

この簡易音量計の例は、 AudioWorkletNode のサブクラスとして ネイティブ AudioNode のように振る舞うノードの作成方法を さらに示します。 コンストラクターオプションを受け取り、 AudioWorkletNodeAudioWorkletProcessor 間の スレッド間通信(非同期)をカプセル化します。 このノードは出力を使いません。

/* vumeter-node.js: Main global scope */export default class VUMeterNode extends AudioWorkletNode {    constructor (context, updateIntervalInMS) {        super(context, 'vumeter', {            numberOfInputs: 1,            numberOfOutputs: 0,            channelCount: 1,            processorOptions: {                updateIntervalInMS: updateIntervalInMS || 16.67            }        });        // States in AudioWorkletNode        this._updateIntervalInMS = updateIntervalInMS;        this._volume = 0;        // Handles updated values from AudioWorkletProcessor        this.port.onmessage = event => {            if (event.data.volume)                this._volume = event.data.volume;        }        this.port.start();    }    get updateInterval() {        return this._updateIntervalInMS;    }    set updateInterval(updateIntervalInMS) {        this._updateIntervalInMS = updateIntervalInMS;        this.port.postMessage({updateIntervalInMS: updateIntervalInMS});    }    draw () {        // Draws the VU meter based on the volume value        // every |this._updateIntervalInMS| milliseconds.    }};
/* vumeter-processor.js: AudioWorkletGlobalScope */const SMOOTHING_FACTOR = 0.9;const MINIMUM_VALUE = 0.00001;registerProcessor('vumeter', class extends AudioWorkletProcessor {    constructor (options) {        super();        this._volume = 0;        this._updateIntervalInMS = options.processorOptions.updateIntervalInMS;        this._nextUpdateFrame = this._updateIntervalInMS;        this.port.onmessage = event => {            if (event.data.updateIntervalInMS)                this._updateIntervalInMS = event.data.updateIntervalInMS;        }    }    get intervalInFrames () {        return this._updateIntervalInMS / 1000 * sampleRate;    }    process (inputs, outputs, parameters) {        const input = inputs[0];        // Note that the input will be down-mixed to mono; however, if no inputs are        // connected then zero channels will be passed in.        if (input.length > 0) {            const samples = input[0];            let sum = 0;            let rms = 0;            // Calculated the squared-sum.            for (let i = 0; i < samples.length; ++i)                sum += samples[i] * samples[i];            // Calculate the RMS level and update the volume.            rms = Math.sqrt(sum / samples.length);            this._volume = Math.max(rms, this._volume * SMOOTHING_FACTOR);            // Update and sync the volume property with the main thread.            this._nextUpdateFrame -= samples.length;            if (this._nextUpdateFrame < 0) {                this._nextUpdateFrame += this.intervalInFrames;                this.port.postMessage({volume: this._volume});            }        }        // Keep on processing if the volume is above a threshold, so that        // disconnecting inputs does not immediately cause the meter to stop        // computing its smoothed value.        return this._volume >= MINIMUM_VALUE;    }});
/* index.js: Main global scope, entry point */import VUMeterNode from './vumeter-node.js';const context = new AudioContext();context.audioWorklet.addModule('vumeter-processor.js').then(() => {    const oscillator = new OscillatorNode(context);    const vuMeterNode = new VUMeterNode(context, 25);    oscillator.connect(vuMeterNode);    oscillator.start();    function drawMeter () {        vuMeterNode.draw();        requestAnimationFrame(drawMeter);    }    drawMeter();});

2. 処理モデル

2.1. 背景

この節は規範的ではありません。

低遅延が要求されるリアルタイムオーディオシステムは多くの場合、コールバック関数を使って実装されます。オペレーティングシステムが、再生を途切れさせないためにさらにオーディオを計算する必要があるとき、プログラムを呼び戻します。理想的にはこのコールバックは高優先度のスレッド(しばしばシステム上で最も高い優先度)で呼び出されます。つまり、オーディオを扱うプログラムはこのコールバックからのみコードを実行します。スレッド境界を越えたり、レンダリングスレッドとコールバックの間にバッファリングを追加すると、当然ながら遅延が増えたり、システムのグリッチ耐性が低下します。

このため、Webプラットフォームで非同期処理を行う従来の方法であるイベントループはここでは機能しません。なぜなら、スレッドが継続的に実行されているわけではないからです。さらに、従来の実行コンテキスト(WindowやWorker)では不要かつ潜在的にブロッキングとなる多くの操作が可能になっており、許容できるパフォーマンスを得る上で好ましくありません。

また、Workerモデルではスクリプト実行コンテキストのために専用スレッドを作成する必要がありますが、全ての AudioNode は通常同じ実行コンテキストを共有します。

注: この節は最終結果がどうあるべきかを規定するものであり、実装方法を規定するものではありません。特に、メッセージキューを使う代わりに、実装者はスレッド間で共有されるメモリを使っても構いません。ただし、メモリ操作が順序変更されない限りです。

2.2. 制御スレッドとレンダリングスレッド

Web Audio API は 制御スレッドレンダリングスレッド を使って実装しなければなりません。

制御スレッドAudioContext がインスタンス化されるスレッドであり、著者がオーディオグラフを操作する、つまり BaseAudioContext の操作を呼び出すスレッドです。レンダリングスレッド は、実際のオーディオ出力が計算されるスレッドであり、制御スレッド からの呼び出しに応じて動作します。AudioContext の場合はリアルタイム・コールバックベースのオーディオスレッド、OfflineAudioContext の場合は通常のスレッドになることがあります。

制御スレッド[HTML] で説明されている従来のイベントループを使います。

レンダリングスレッド は、オーディオグラフのレンダリングのセクションで説明される特化したレンダリングループを使います。

制御スレッド から レンダリングスレッド への通信は 制御メッセージのパスで行われます。逆方向の通信は従来のイベントループタスクで行われます。

AudioContext には、制御メッセージキューがひとつあり、これは 制御メッセージのリストで、レンダリングスレッド上で動作する操作です。

制御メッセージをキューするとは、BaseAudioContext制御メッセージキューの末尾にメッセージを追加することです。

注: 例えば、sourcestart() を正常に呼び出すと、関連する AudioBufferSourceNode制御メッセージ制御メッセージキュー に追加されます。

制御メッセージ制御メッセージキューで 挿入時刻順に並びます。最も古いメッセージ制御メッセージキューの先頭にあるものです。

制御メッセージキューの入れ替えとは、制御メッセージキュー QA ともう一つの 制御メッセージキュー QB を次の手順で入れ替えることです:
  1. QC を新しい空の 制御メッセージキューとする。

  2. QA制御メッセージをすべて QC に移動する。

  3. QB制御メッセージをすべて QA に移動する。

  4. QC制御メッセージをすべて QB に移動する。

2.3. 非同期操作

AudioNode のメソッド呼び出しは事実上非同期であり、2段階で行わなければなりません:同期部分と非同期部分です。各メソッドの一部は 制御スレッドで実行され(例えばパラメータが不正な場合に例外を投げる等)、一部は レンダリングスレッドで実行されます(例えば AudioParam の値を変更するなど)。

AudioNodeBaseAudioContext の各操作の説明では、同期部分が ⌛ で示されています。それ以外の操作は 並列で実行されます([HTML] 参照)。

同期部分は 制御スレッドで即座に実行されます。失敗した場合はメソッド実行は中止され、例外が投げられることがあります。成功した場合は、レンダリングスレッドで実行する操作を符号化した 制御メッセージがこの レンダリングスレッド制御メッセージキュー にエンキューされます。

同期部分と非同期部分の順序は他のイベントとの関係でも必ず同じでなければなりません:操作 AB があり、それぞれ同期・非同期部分 ASyncAAsyncBSyncBAsync がある場合、AB より先に発生したら ASyncBSync より先に、AAsyncBAsync より先に実行されます。つまり、同期・非同期部分は順序が入れ替わることはありません。

2.4. オーディオグラフのレンダリング

オーディオグラフのレンダリングは、サンプルフレームのブロック単位で行われ、そのブロックサイズは BaseAudioContext のライフタイム中一定です。 ブロック内のサンプルフレーム数を レンダー量子サイズと呼び、ブロック自体は レンダー量子と呼ばれます。初期値は128で、renderSizeHintを設定することで変更可能です。

あるスレッド上でアトミックに発生する操作は、他のスレッドで別のアトミック操作が実行中でない場合にのみ実行できます。

BaseAudioContext G および 制御メッセージキュー Q から オーディオのブロックをレンダリングするアルゴリズムは複数ステップからなり、グラフのレンダリングのアルゴリズムで詳しく説明されます。

AudioContextレンダリングスレッドシステムレベルのオーディオコールバックによって定期的に駆動されます。 各コールには システムレベルのオーディオコールバックバッファサイズ があり、 次のシステムレベルのオーディオコールバックまでに 計算を完了すべきサンプルフレーム数です(サイズは可変)。

システムレベルのオーディオコールバックごとに 負荷値が計算されます。これは実行時間を システムレベルのオーディオコールバックバッファサイズで割り、 さらに sampleRate で割った値です。

理想的には負荷値が1.0未満となり、再生にかかる時間より短時間でレンダリングできていることを意味します。オーディオバッファアンダーランはこの負荷値が1.0を超えたときに発生します。すなわちリアルタイムに十分速くレンダリングできない状態です。

オーディオグラフのレンダー量子サイズは必ずしもシステムレベルのオーディオコールバックバッファサイズの約数とは限りません。 これにより、オーディオ遅延が増加し、アンダーランを起こさずに許容できる最大負荷が減少します。

システムレベルのオーディオコールバック負荷値の概念は OfflineAudioContextには適用されません。

オーディオコールバックは制御メッセージキューのタスクとしてもキューされます。UAは、こうしたタスクを満たすためにレンダー量子を処理してバッファサイズを埋めるため、以下のアルゴリズムを実行しなければなりません。 制御メッセージキューに加え、各 AudioContext には通常の タスクキューがあり、これは制御スレッドからレンダリングスレッドへ投稿されるタスク専用で、 関連付けタスクキューと呼ばれます。各レンダー量子処理後には、processメソッド実行中にキューされたマイクロタスクを実行するための追加のマイクロタスクチェックポイントが実行されます。

AudioWorkletNode から投稿されたすべてのタスクは、 関連付けられた BaseAudioContext関連付けタスクキューに投稿されます。

レンダリングループ開始前に一度だけ次のステップを実行しなければなりません。
  1. BaseAudioContext の内部スロット [[current frame]] を 0 に設定する。同時に currentTime も 0 に設定する。

レンダー量子をレンダリングするとき、次の手順を実行しなければなりません。
  1. render resultfalse とする。

  2. 制御メッセージキュー を処理する。

    1. Qrendering を空の 制御メッセージキューとする。アトミックに 入れ替えQrendering と現在の 制御メッセージキュー の間で行う。

    2. Qrendering にメッセージがある間、次の手順を繰り返す:

      1. Qrendering最も古いメッセージの非同期部分を実行する。

      2. Qrendering最も古いメッセージを削除する。

  3. BaseAudioContext関連付けタスクキューを処理する。

    1. task queueBaseAudioContext関連付けタスクキューとする。

    2. task counttask queue 内のタスク数とする。

    3. task count が 0 でない間、次の手順を繰り返す:

      1. oldest tasktask queue 内で最初に実行可能なタスクとし、task queue から削除する。

      2. レンダリングループの現在実行中タスクを oldest task に設定する。

      3. oldest task のステップを実行する。

      4. レンダリングループの現在実行中タスクを null に戻す。

      5. task count をデクリメントする。

      6. マイクロタスクチェックポイントを行う。

  4. レンダー量子を処理する。

    1. [[rendering thread state]]running でない場合は false を返す。

    2. BaseAudioContextAudioNode の処理順を決定する。

      1. ordered node list を空の AudioNodeAudioListener のリストとする。アルゴリズム終了時に順序付けされたリストとなる。

      2. nodes をこの BaseAudioContext で作成され、まだ生存しているすべてのノードの集合とする。

      3. AudioListenernodes に追加する。

      4. cycle breakers を空の DelayNode の集合とする。サイクルに含まれる DelayNode を格納する。

      5. nodes 内の各 AudioNode node について:

        1. node がサイクルに含まれる DelayNode の場合、cycle breakers に追加し、nodes から削除する。

      6. cycle breakers 内の各 DelayNode delay について:

        1. delayWriterdelayReader をそれぞれ DelayWriterDelayReader として nodes に追加し、delay のすべての入力・出力を切断する。

          注: これによりサイクルが解消される。サイクルに含まれる DelayNode は、両端を独立して扱える。サイクル内の遅延ラインはレンダー量子未満にはできない。

      7. nodes にサイクルがある場合は、サイクルに含まれる AudioNodeミュートし、nodes から削除する。

      8. nodes 内のすべての要素は未マーク状態とする。未マーク要素がある間、次の手順を繰り返す:

        1. nodes の要素から node を選択する。

        2. Visit node を実行する。

        ノードを訪問する(Visit)とは、次の手順を行うこと:
        1. node がマーク済みなら中止する。

        2. node をマークする。

        3. nodeAudioNode の場合は、 入力に接続されている各 AudioNode について Visit を実行する。

        4. node の各 AudioParam param について:

          1. param に接続されている各 AudioNode param input node について:

            1. Visit param input node

        5. nodeordered node list の先頭に追加する。

      9. ordered node list の順序を逆にする。

    3. AudioListenerAudioParam の値をこのブロックで 計算する。

    4. ordered node list 内の各 AudioNode について:

      1. この AudioNode の各 AudioParam について次の手順を実行:

        1. この AudioParamAudioNode が接続されている場合、すべての AudioNode読み取り可能としたバッファ合計し、モノラルチャンネルに ダウンミックスし、このバッファを 入力AudioParamバッファとする。

        2. この AudioParam の値をこのブロックで 計算する。

        3. この AudioParam[[current value]] スロットを § 1.6.3 値の計算に従って設定する 制御メッセージをキューする

      2. この AudioNode に入力が接続されている場合、すべての AudioNode読み取り可能としたバッファ合計し、入力チャンネル数に合わせて アップ/ダウンミックスする。得られたバッファを 入力バッファとする。

      3. この AudioNodeソースノード の場合は、オーディオブロックを計算し、読み取り可能とする

      4. この AudioNodeAudioWorkletNode の場合は次のサブステップを実行:

        1. processorAudioWorkletNode に関連付けられた AudioWorkletProcessor インスタンスとする。

        2. Oprocessor に対応する ECMAScript オブジェクトとする。

        3. processCallback を初期化されていない変数とする。

        4. completion を初期化されていない変数とする。

        5. スクリプトを実行する準備現在の設定オブジェクトで行う。

        6. コールバックを実行する準備現在の設定オブジェクトで行う。

        7. getResult Get(O, "process") とする。

        8. getResult abrupt completion の場合、completiongetResult を設定し、return のラベルへジャンプする。

        9. processCallbackgetResult.[[Value]] に設定する。

        10. ! IsCallable(processCallback) が false の場合:

          1. completion に新しく作成した Completion {[[Type]]: throw, [[Value]]: 新しい TypeError オブジェクト, [[Target]]: 空} を設定する。

          2. return のラベルへのジャンプ。

        11. [[callable process]]true に設定する。

        12. 以下のサブステップを実行:

          1. argsinputsoutputsparameters からなる Web IDL 引数リストとする。

          2. esArgs args を ECMAScript 引数リストへ変換した結果とする。

          3. callResult Call(processCallback, O, esArgs) とする。この操作で オーディオブロックが計算される。正常終了時は Float32Array のコピーされた要素を含むバッファが 読み取り可能とする。この呼び出し内で解決された PromiseAudioWorkletGlobalScope のマイクロタスクキューにキューされる。

          4. callResult abrupt completion の場合は completioncallResult を設定し、return のラベルへジャンプ。

          5. processoractive source フラグを ToBoolean(callResult.[[Value]]) に設定する。

        13. Return: この時点で completion は ECMAScript completion 値となっている。

          1. コールバック実行後の後処理現在の設定オブジェクトで行う。

          2. スクリプト実行後の後処理現在の設定オブジェクトで行う。

          3. completion abrupt completion の場合:

            1. [[callable process]]false に設定する。

            2. processoractive source フラグを false に設定する。

            3. 無音出力バッファを読み取り可能にする

            4. タスクをキューし、制御スレッドprocessorerror イベントを発火し、関連付けられた AudioWorkletNodeErrorEvent を使う。

      5. この AudioNode出力ノード(destination node) の場合は、入力を記録する

      6. それ以外の場合は 入力バッファを処理し、得られたバッファを 読み取り可能とする

    5. アトミックに次の手順を実行する:

      1. [[current frame]]レンダー量子サイズ分インクリメントする。

      2. currentTime[[current frame]]sampleRate で割った値に設定する。

    6. render resulttrue に設定する。

  5. マイクロタスクチェックポイントを実行する。

  6. render result を返す。

ミュート(Muting)とは、AudioNode の 出力が、このオーディオブロックのレンダリング中必ず無音になることを意味します。

バッファを読み取り可能にする(Making a buffer available for reading)とは、AudioNode の バッファが、この AudioNode に接続された 他の AudioNode から 安全に読み出せる状態にすることです。

注: 例えば、実装では新しいバッファを割り当てたり、未使用となった既存バッファを再利用するなど、より高度な機構を採用することもできます。

入力の記録(Recording the input)とは、AudioNode の 入力データを将来利用するためにコピーすることです。

オーディオブロックの計算(Computing a block of audio)とは、この AudioNode のアルゴリズムを実行し、[[render quantum size]] サンプルフレームを生成することです。

入力バッファの処理(Processing an input buffer)とは、 AudioNode のアルゴリズムを実行し、入力バッファと、この AudioNodeAudioParam の値を入力として用いることです。

2.5. AudioContext でシステムオーディオリソースのエラーを扱う方法

AudioContext audioContext は、オーディオシステムリソースのエラー発生時、レンダリングスレッドで次の手順を実行します。

  1. audioContext[[rendering thread state]]running である場合:

    1. システムリソースの解放を試みる。

    2. audioContext[[rendering thread state]]suspended に設定する。

    3. メディア要素タスクをキューし、次の手順を実行する:

      1. error イベントを audioContext で発火する。イベント名は error

      2. audioContext[[suspended by user]]false に設定する。

      3. audioContext[[control thread state]]suspended に設定する。

      4. audioContextstate 属性を "suspended" に設定する。

      5. statechange イベントを audioContext で発火する。

    4. これらの手順を中止する。

  2. audioContext[[rendering thread state]]suspended である場合:

    1. メディア要素タスクをキューし、次の手順を実行する:

      1. error イベントを audioContext で発火する。イベント名は error

注: システムオーディオリソースのエラーの例としては、AudioContext のアクティブレンダリング中に外部またはワイヤレスのオーディオデバイスが切断される場合などが挙げられます。

2.6. ドキュメントのアンロード

BaseAudioContext を使用するドキュメントに対して、追加の アンロード時クリーンアップ手順 が定義されています:
  1. 関連するグローバルオブジェクトがドキュメントの関連付けWindowと同じである AudioContext および OfflineAudioContext[[pending promises]] のすべての promise を InvalidStateError でrejectする。

  2. すべての decoding thread を停止する。

  3. AudioContext または OfflineAudioContext に対して close() を呼び出す 制御メッセージをキューする

3. 動的ライフタイム

3.1. 背景

注: AudioContext および AudioNode のライフタイム特性の規範的な説明は AudioContextのライフタイムおよび AudioNodeのライフタイム で記載されています。

この節は規範的ではありません。

静的なルーティング構成の作成だけでなく、有限のライフタイムを持つ動的に割り当てられるボイスでカスタムエフェクトルーティングを行うことも可能であるべきです。本節では、このような短命なボイスを「ノート」と呼びます。多くのオーディオアプリケーションでノートの概念が使われており、例としてドラムマシン、シーケンサー、ゲーム中の多数のワンショットサウンドがあります。

従来のソフトウェアシンセサイザーでは、ノートは利用可能なリソースプールから動的に割り当て・解放されます。MIDIノートオンメッセージを受信するとノートが割り当てられ、サンプルデータの終端到達(非ループ)、エンベロープのサステインフェーズがゼロになる、MIDIノートオフメッセージでリリースフェーズに入る、などで再生終了時にノートが解放されます。MIDIノートオフの場合、リリースエンベロープフェーズが終了するまでノートはすぐには解放されません。常時多くのノートが再生されていても、ノート集合は新規ノートの追加と既存ノートの解放で絶えず変化します。

オーディオシステムは「ノート」イベントごとにルーティンググラフの該当部分を自動で解体します。「ノート」は AudioBufferSourceNode で表現され、 他の処理ノードに直接接続できます。ノート再生終了時、contextは AudioBufferSourceNode への参照を自動で解放し、 これにより接続されているノードへの参照も解放されます。これらのノードはグラフから自動で切断され、参照がなくなれば削除されます。グラフ内で長寿命かつ複数ボイスで共有するノードは明示的に管理できます。複雑そうですが、追加処理不要で自動的に行われます。

3.2.

動的割り当て
早期に解放されるサブグラフを含むグラフ

ローパスフィルター、パンナー、2つ目のゲインノードはワンショットサウンドから直接接続されています。再生終了時、contextが自動で(点線内の全て)を解放します。ワンショットサウンドや接続ノードへの参照がなければ直ちにグラフから削除・消去されます。ストリーミングソースはグローバル参照があり、明示的切断まで接続されたままです。JavaScriptでの例は以下の通りです:

let context = 0;let compressor = 0;let gainNode1 = 0;let streamingAudioSource = 0;// 「長寿命」部分の初期セットアップfunction setupAudioContext() {        context = new AudioContext();        compressor = context.createDynamicsCompressor();        gainNode1 = context.createGain();        // ストリーミングオーディオソースの作成        const audioElement = document.getElementById('audioTagID');        streamingAudioSource = context.createMediaElementSource(audioElement);        streamingAudioSource.connect(gainNode1);        gainNode1.connect(compressor);        compressor.connect(context.destination);}// 後でユーザー操作(通常はマウスやキーイベント)に応じて// ワンショットサウンドを再生できるfunction playSound() {        const oneShotSound = context.createBufferSource();        oneShotSound.buffer = dogBarkingBuffer;        // フィルター、パンナー、ゲインノード作成        const lowpass = context.createBiquadFilter();        const panner = context.createPanner();        const gainNode2 = context.createGain();        // 接続        oneShotSound.connect(lowpass);        lowpass.connect(panner);        panner.connect(gainNode2);        gainNode2.connect(compressor);        // 今から0.75秒後に再生(即座に再生するには0を渡す)        oneShotSound.start(context.currentTime + 0.75);}

4. チャンネルのアップミックス・ダウンミックス

この節は現行標準です。

AudioNode の入力には、すべての接続されたチャンネルを合成する ミキシング規則 があります。簡単な例として、入力がモノラル出力とステレオ出力から接続されている場合、通常はモノラル接続がステレオにアップミックスされ、ステレオ接続と合算されます。しかし、もちろん全ての AudioNode の各入力に対して正確な ミキシング規則を定義することが重要です。すべての入力のデフォルトミキシング規則は、特にモノラル・ステレオストリームの非常に一般的なケースにおいて、細部を気にせずとも「とりあえず動く」よう選択されています。高度な用途、とくにマルチチャンネルの場合は規則を変更できます。

用語定義として、アップミックスは少ないチャンネル数のストリームを多いチャンネル数のストリームに変換する処理、ダウンミックスは多いチャンネル数のストリームを少ないチャンネル数のストリームに変換する処理です。

AudioNode の入力は、接続されたすべての出力をミックスする必要があります。この過程で、任意のタイミングにおける実際の入力チャンネル数を表す内部値 computedNumberOfChannels を計算します。

AudioNode の入力について、実装は以下を行わなければなりません:
  1. computedNumberOfChannels を計算する。

  2. 入力への各接続について:

    1. ノードの channelInterpretation 属性で指定された ChannelInterpretation 値に従い、接続を computedNumberOfChannelsアップミックス または ダウンミックス する。

    2. 他の接続(他のストリーム)と合算してミックスする。このとき、各接続でステップ1で アップミックスまたはダウンミックスされた対応チャンネルごとに単純加算する。

4.1. スピーカーチャンネルレイアウト

channelInterpretation が "speakers" の場合、アップミックス および ダウンミックスは特定のチャンネルレイアウトについて定義されます。

モノラル(1チャンネル)、ステレオ(2チャンネル)、クアッド(4チャンネル)、5.1(6チャンネル)は必ずサポートされなければなりません。他のチャンネルレイアウトは現行標準の将来バージョンでサポートされる可能性があります。

4.2. チャンネル順序

チャンネル順序は以下の表で定義されます。個々のマルチチャンネルフォーマットは全ての中間チャンネルをサポートしない場合があります。実装は、下記で定義された順番でチャンネルを提供し、存在しないチャンネルはスキップしなければなりません。

順序 ラベル モノ ステレオ クアッド 5.1
0 SPEAKER_FRONT_LEFT 0 0 0 0
1 SPEAKER_FRONT_RIGHT 1 1 1
2 SPEAKER_FRONT_CENTER 2
3 SPEAKER_LOW_FREQUENCY 3
4 SPEAKER_BACK_LEFT 2 4
5 SPEAKER_BACK_RIGHT 3 5
6 SPEAKER_FRONT_LEFT_OF_CENTER
7 SPEAKER_FRONT_RIGHT_OF_CENTER
8 SPEAKER_BACK_CENTER
9 SPEAKER_SIDE_LEFT
10 SPEAKER_SIDE_RIGHT
11 SPEAKER_TOP_CENTER
12 SPEAKER_TOP_FRONT_LEFT
13 SPEAKER_TOP_FRONT_CENTER
14 SPEAKER_TOP_FRONT_RIGHT
15 SPEAKER_TOP_BACK_LEFT
16 SPEAKER_TOP_BACK_CENTER
17 SPEAKER_TOP_BACK_RIGHT

4.3. テールタイムが入力・出力チャンネル数に与える影響

AudioNode が 非ゼロの テールタイム を持ち、出力チャンネル数が入力チャンネル数に依存する場合、入力チャンネル数が変化した際は AudioNodeテールタイム を考慮しなければなりません。

入力チャンネル数が減少した場合、出力チャンネル数の変更は、より多いチャンネル数で受け取った入力が出力に影響しなくなったタイミングで行わなければなりません。

入力チャンネル数が増加した場合、その挙動は AudioNode の型によって異なります:

注: 直感的には、これは処理中にステレオ情報が失われないようにするためです。複数の入力レンダー量子が異なるチャンネル数で出力レンダー量子に寄与する場合、出力レンダー量子のチャンネル数は入力レンダー量子のチャンネル数の上位集合となります。

4.4. スピーカーレイアウトのアップミックス

モノラルのアップミックス:

    1 -> 2 : モノラルからステレオへのアップミックス
        output.L = input;
        output.R = input;

    1 -> 4 : モノラルからクアッドへのアップミックス
        output.L = input;
        output.R = input;
        output.SL = 0;
        output.SR = 0;

    1 -> 5.1 : モノラルから5.1へのアップミックス
        output.L = 0;
        output.R = 0;
        output.C = input; // センターに入れる
        output.LFE = 0;
        output.SL = 0;
        output.SR = 0;

ステレオのアップミックス:

    2 -> 4 : ステレオからクアッドへのアップミックス
        output.L = input.L;
        output.R = input.R;
        output.SL = 0;
        output.SR = 0;

    2 -> 5.1 : ステレオから5.1へのアップミックス
        output.L = input.L;
        output.R = input.R;
        output.C = 0;
        output.LFE = 0;
        output.SL = 0;
        output.SR = 0;

クアッドのアップミックス:

    4 -> 5.1 : クアッドから5.1へのアップミックス
        output.L = input.L;
        output.R = input.R;
        output.C = 0;
        output.LFE = 0;
        output.SL = input.SL;
        output.SR = input.SR;

4.5. スピーカーレイアウトのダウンミックス

例えば、5.1ソース素材をステレオ再生する場合など、ダウンミックスが必要となります。

モノラルへのダウンミックス:

    2 -> 1 : ステレオからモノラル
        output = 0.5 * (input.L + input.R);

    4 -> 1 : クアッドからモノラル
        output = 0.25 * (input.L + input.R + input.SL + input.SR);

    5.1 -> 1 : 5.1からモノラル
        output = sqrt(0.5) * (input.L + input.R) + input.C + 0.5 * (input.SL + input.SR)

ステレオへのダウンミックス:

    4 -> 2 : クアッドからステレオ
        output.L = 0.5 * (input.L + input.SL);
        output.R = 0.5 * (input.R + input.SR);

    5.1 -> 2 : 5.1からステレオ
        output.L = L + sqrt(0.5) * (input.C + input.SL)
        output.R = R + sqrt(0.5) * (input.C + input.SR)

クアッドへのダウンミックス:

    5.1 -> 4 : 5.1からクアッド
        output.L = L + sqrt(0.5) * input.C
        output.R = R + sqrt(0.5) * input.C
        output.SL = input.SL
        output.SR = input.SR

4.6. チャンネル規則の例

// Set gain node to explicit 2-channels (stereo).gain.channelCount = 2;gain.channelCountMode = "explicit";gain.channelInterpretation = "speakers";// Set "hardware output" to 4-channels for DJ-app with two stereo output busses.context.destination.channelCount = 4;context.destination.channelCountMode = "explicit";context.destination.channelInterpretation = "discrete";// Set "hardware output" to 8-channels for custom multi-channel speaker array// with custom matrix mixing.context.destination.channelCount = 8;context.destination.channelCountMode = "explicit";context.destination.channelInterpretation = "discrete";// Set "hardware output" to 5.1 to play an HTMLAudioElement.context.destination.channelCount = 6;context.destination.channelCountMode = "explicit";context.destination.channelInterpretation = "speakers";// Explicitly down-mix to mono.gain.channelCount = 1;gain.channelCountMode = "explicit";gain.channelInterpretation = "speakers";

5. オーディオ信号値

5.1. オーディオサンプルフォーマット

線形パルス符号変調(linear PCM)は、オーディオ値が定期的な間隔でサンプリングされ、連続する値間の量子化レベルが線形に均一なフォーマットを示します。

この仕様で信号値がスクリプトに公開される場合、それらは線形32ビット浮動小数点パルス符号変調フォーマット(線形32ビット float PCM)となっており、しばしば Float32Array オブジェクトの形で提供されます。

5.2. レンダリング

任意のオーディオグラフの出力ノードにおける全てのオーディオ信号の範囲は、標準的に [-1, 1] です。この範囲外の信号値、または NaN、正の無限大あるいは負の無限大となる値のオーディオ再生は、本仕様では定義されません。

6. 空間化・パンニング

6.1. 背景

現代の3Dゲームにおける一般的な機能要件は、複数のオーディオソースを3D空間で動的に空間化・移動できることです。例えば OpenAL にはこの機能があります。

PannerNode を使うことで、オーディオストリームを AudioListener を基準に空間化または空間上の位置指定が可能です。 BaseAudioContext には必ず1つの AudioListener が含まれます。 パナーとリスナーは共に、右手系のデカルト座標系を用いた3D空間上の位置を持ちます。座標系で使う単位(例:メートル、フィートなど)は定義されていません。これは、これら座標によって計算される効果が、特定の単位に依存せず不変であるためです。 PannerNode オブジェクト(音源ストリームを表す)は、音が投射される方向を示す orientation ベクトルを持ちます。さらに、音の指向性を示す sound cone を持ちます。例えば、音が全方位型(オムニディレクショナル)であれば、どの方向でも聞こえますが、より指向性がある場合はリスナーの方向を向いているときのみ聞こえます。 AudioListener オブジェクト(人の耳を表す)は、forward および up ベクトルを持ち、人物が向いている方向を示します。

空間化用の座標系は、以下の図にデフォルト値とともに示されています。AudioListenerPannerNode の位置は、分かりやすくするためデフォルトから移動されています。

panner-coord
座標系の図とAudioListener・PannerNodeの属性。

レンダリング中、PannerNodeazimuth(方位角)elevation(仰角) を計算します。これらの値は空間化効果をレンダリングするために内部的に利用されます。これらの値の利用方法の詳細は パンニングアルゴリズムのセクションを参照してください。

6.2. 方位角と仰角

以下のアルゴリズムは、PannerNodeazimuth(方位角)および elevation(仰角)を計算するために必ず使用されなければなりません。実装は、以下の様々な AudioParam が "a-rate" か "k-rate" かを適切に考慮しなければなりません。

// |context| を BaseAudioContext、|panner| を// context内で作成されたPannerNodeとする。// ソース-リスナーのベクトルを計算する。const listener = context.listener;const sourcePosition = new Vec3(panner.positionX.value, panner.positionY.value,                                panner.positionZ.value);const listenerPosition =    new Vec3(listener.positionX.value, listener.positionY.value,             listener.positionZ.value);const sourceListener = sourcePosition.diff(listenerPosition).normalize();if (sourceListener.magnitude == 0) {  // ソースとリスナーが同一位置の場合の退化ケース処理。  azimuth = 0;  elevation = 0;  return;}// 軸を整列。const listenerForward = new Vec3(listener.forwardX.value, listener.forwardY.value,                                 listener.forwardZ.value);const listenerUp =    new Vec3(listener.upX.value, listener.upY.value, listener.upZ.value);const listenerRight = listenerForward.cross(listenerUp);if (listenerRight.magnitude == 0) {  // リスナーの「up」と「forward」ベクトルが線形従属の場合、  // 「right」が決定できないケースの処理  azimuth = 0;  elevation = 0;  return;}// リスナーのright, forwardに垂直な単位ベクトルを決定するconst listenerRightNorm = listenerRight.normalize();const listenerForwardNorm = listenerForward.normalize();const up = listenerRightNorm.cross(listenerForwardNorm);const upProjection = sourceListener.dot(up);const projectedSource = sourceListener.diff(up.scale(upProjection)).normalize();azimuth = 180 * Math.acos(projectedSource.dot(listenerRightNorm)) / Math.PI;// ソースがリスナーの前方か後方かを判定。const frontBack = projectedSource.dot(listenerForwardNorm);if (frontBack < 0)  azimuth = 360 - azimuth;// azimuthをリスナー「right」ベクトルではなく「forward」ベクトル基準に調整。if ((azimuth >= 0) && (azimuth <= 270))  azimuth = 90 - azimuth;else  azimuth = 450 - azimuth;elevation = 90 - 180 * Math.acos(sourceListener.dot(up)) / Math.PI;if (elevation > 90)  elevation = 180 - elevation;else if (elevation < -90)  elevation = -180 - elevation;

6.3. パンニングアルゴリズム

モノラル→ステレオおよびステレオ→ステレオのパンニングは必須です。モノラル→ステレオ処理は、すべての入力接続がモノラルの場合に使用されます。それ以外はステレオ→ステレオ処理が用いられます。

6.3.1. PannerNode「equalpower」パンニング

これは、基本的で合理的な結果を提供する、シンプルで比較的低コストなアルゴリズムです。 PannerNodepanningModel 属性が "equalpower" に設定されている場合に使用されます。この場合elevation値は無視されます。アルゴリズムは automationRate で指定された適切なレートで必ず実装しなければなりません。 PannerNodeAudioParamAudioListenerAudioParam が "a-rate" の場合、a-rate処理を用いる必要があります。

  1. このAudioNodeが計算する各サンプルについて:

    1. azimuth方位角と仰角のセクションで計算された値とする。

    2. azimuth値を次のように [-90, 90] 範囲に収める:

      // まず azimuth を [-180, 180] の範囲にクランプ。
      azimuth = max(-180, azimuth);
      azimuth = min(180, azimuth);
      
      // 次に [-90, 90] の範囲にラップ。
      if (azimuth < -90)
          azimuth = -180 - azimuth;
      else if (azimuth > 90)
          azimuth = 180 - azimuth;
      
    3. 正規化値 x は、モノラル入力の場合 azimuth から次のように計算される:

      x = (azimuth + 90) / 180;
      

      ステレオ入力の場合:

      if (azimuth <= 0) { // -90 → 0
          // azimuth値 [-90, 0] 度を [-90, 90] の範囲へ変換。
          x = (azimuth + 90) / 90;
      } else { // 0 → 90
          // azimuth値 [0, 90] 度を [-90, 90] の範囲へ変換。
          x = azimuth / 90;
      }
      
    4. 左右のゲイン値は次のように計算:

      gainL = cos(x * Math.PI / 2);
      gainR = sin(x * Math.PI / 2);
      
    5. モノラル入力の場合、ステレオ出力は次のように計算:

      outputL = input * gainL;
      outputR = input * gainR;
      

      ステレオ入力の場合の出力:

      if (azimuth <= 0) {
          outputL = inputL + inputR * gainL;
          outputR = inputR * gainR;
      } else {
          outputL = inputL * gainL;
          outputR = inputR + inputL * gainR;
      }
      
    6. 距離ゲインとコーンゲインを適用。距離の計算は距離効果、コーンゲインはサウンドコーン参照:

      let distance = distance();
      let distanceGain = distanceModel(distance);
      let totalGain = coneGain() * distanceGain();
      outputL = totalGain * outputL;
      outputR = totalGain * outputR;
      

6.3.2. PannerNode「HRTF」パンニング(ステレオのみ)

これは様々な方位角・仰角で記録されたHRTF (頭部伝達関数)のインパルス応答セットを必要とします。実装には高効率な畳み込み関数が必要です。「equalpower」より計算コストは高いですが、より知覚的に空間化されたサウンドを提供します。

HRTFによるパンニング処理の図。

6.3.3. StereoPannerNode パンニング

StereoPannerNode について、次のアルゴリズムが必ず実装されなければなりません。
  1. このAudioNodeが計算する各サンプルについて:

    1. panはこのpan AudioParamcomputedValueとする。

    2. panを [-1, 1] にクランプ:

      pan = max(-1, pan);
      pan = min(1, pan);
      
    3. pan値を正規化して [0, 1] の範囲にする。モノラル入力の場合:

      x = (pan + 1) / 2;
      

      ステレオ入力の場合:

      if (pan <= 0)
          x = pan + 1;
      else
          x = pan;
      
    4. 左右のゲイン値を次のように計算:

      gainL = cos(x * Math.PI / 2);
      gainR = sin(x * Math.PI / 2);
      
    5. モノラル入力の場合、ステレオ出力は次のように計算:

      outputL = input * gainL;
      outputR = input * gainR;
      

      ステレオ入力の場合の出力:

      if (pan <= 0) {
          outputL = inputL + inputR * gainL;
          outputR = inputR * gainR;
      } else {
          outputL = inputL * gainL;
          outputR = inputR + inputL * gainR;
      }
      

6.4. 距離効果

音源が近いほど音が大きくなり、遠いほど小さくなります。音量が距離によってどのように変化するかは、distanceModel 属性によって決まります。

オーディオレンダリング中、distance値はパナーとリスナーの位置から次のように計算されます:

function distance(panner) {  const pannerPosition = new Vec3(panner.positionX.value, panner.positionY.value,                                  panner.positionZ.value);  const listener = context.listener;  const listenerPosition =      new Vec3(listener.positionX.value, listener.positionY.value,               listener.positionZ.value);  return pannerPosition.diff(listenerPosition).magnitude;}

distanceは、distanceModel 属性に応じてdistanceGainの計算に使われます。各距離モデルの計算方法はDistanceModelType セクションを参照してください。

処理の一部として、PannerNode は入力オーディオ信号にdistanceGainを掛けて、遠い音を小さく、近い音を大きくします。

6.5. サウンドコーン

リスナーと各音源は向いている方向を示すオリエンテーションベクトルを持ちます。各音源の投射特性は「内側コーン」と「外側コーン」で記述され、音源の方向ベクトルからのソース/リスナー角度に応じた音の強度を示します。つまり、音源がリスナーの正面を向いているときは音が大きく、軸から外れるほど小さくなります。音源は全方位型(オムニディレクショナル)にもできます。

次の図は音源のコーンとリスナーの関係を示します。図中で coneInnerAngle = 50 および coneOuterAngle = 120です。 内側コーンは方向ベクトルの両側に25度、外側コーンは両側に60度広がっています。

cone-diagram
音源のコーン角度と音源・リスナーの位置・オリエンテーションの関係図

次のアルゴリズムは、音源(PannerNode)とリスナーを与えてコーン効果によるゲイン寄与を計算するために必ず使用されなければなりません:

function coneGain() {  const sourceOrientation =      new Vec3(source.orientationX, source.orientationY, source.orientationZ);  if (sourceOrientation.magnitude == 0 ||      ((source.coneInnerAngle == 360) && (source.coneOuterAngle == 360)))    return 1; // コーン指定なし - ゲイン1  // 正規化されたソース-リスナーベクトル  const sourcePosition = new Vec3(panner.positionX.value, panner.positionY.value,                                  panner.positionZ.value);  const listenerPosition =      new Vec3(listener.positionX.value, listener.positionY.value,               listener.positionZ.value);  const sourceToListener = sourcePosition.diff(listenerPosition).normalize();  const normalizedSourceOrientation = sourceOrientation.normalize();  // ソースのオリエンテーションベクトルとソース-リスナーベクトルの角度  const angle = 180 *                Math.acos(sourceToListener.dot(normalizedSourceOrientation)) /                Math.PI;  const absAngle = Math.abs(angle);  // ここで2で割る理由は、APIが全角度(半角度ではなく)を扱うため  const absInnerAngle = Math.abs(source.coneInnerAngle) / 2;  const absOuterAngle = Math.abs(source.coneOuterAngle) / 2;  let gain = 1;  if (absAngle <= absInnerAngle) {    // 減衰なし    gain = 1;  } else if (absAngle >= absOuterAngle) {    // 最大減衰    gain = source.coneOuterGain;  } else {    // 内側と外側のコーンの間    // inner → outer, xは0→1    const x = (absAngle - absInnerAngle) / (absOuterAngle - absInnerAngle);    gain = (1 - x) + source.coneOuterGain * x;  }  return gain;}

7. パフォーマンス考慮事項

7.1. レイテンシ

latency
レイテンシが重要となるユースケース

ウェブアプリケーションでは、マウスやキーボードイベント(keydown、mousedownなど)と音が聞こえるまでの遅延時間が重要です。

この遅延時間はレイテンシと呼ばれ、複数の要因(入力デバイスのレイテンシ、内部バッファのレイテンシ、DSP処理のレイテンシ、出力デバイスのレイテンシ、ユーザーの耳とスピーカーの距離など)によって生じ、累積します。レイテンシが大きいほど、ユーザー体験は満足度が下がります。極端に大きい場合は音楽制作やゲームプレイが不可能になることもあります。中程度でもタイミングに影響し、音が遅れて聞こえたりゲームが反応しない印象を与えます。音楽アプリではリズムに、ゲームではプレイの精度に影響します。インタラクティブアプリでは、極端に低いアニメーションフレームレートと同様、体験を損ないます。用途によって許容されるレイテンシは3~6ミリ秒から25~50ミリ秒まで様々です。

実装は一般的に全体のレイテンシを最小化するよう努めます。

全体のレイテンシの最小化とともに、実装はAudioContextcurrentTimeAudioProcessingEventplaybackTimeの差も最小化しようとします。 ScriptProcessorNode の廃止により、この考慮は今後重要性が下がります。

さらに、いくつかのAudioNode はオーディオグラフの一部経路にレイテンシを追加する場合があります。具体的には:

7.2. オーディオバッファコピー

acquire the content操作がAudioBuffer に対して行われる際、通常チャンネルデータのコピーを行うことなく処理できます。特に、最後のステップは次回のgetChannelData() 呼び出し時に遅延実行すべきです。 すなわち、複数回連続してacquire the contents操作を行い、間にgetChannelData() を挟まない場合(例:同じAudioBufferSourceNode で複数回再生)では、割り当てやコピーなしで実装可能です。

さらに実装は追加の最適化が可能です: getChannelData()AudioBuffer で呼び出されたとき、まだ新しいArrayBuffer が割り当てられていないが、以前のacquire the content操作の呼び出し元がAudioBuffer のデータ使用を終了していれば、生データバッファを新しいAudioBuffer に再利用でき、チャンネルデータの再割り当てやコピーを回避できます。

7.3. AudioParam遷移

value 属性を直接設定しても自動的なスムージングは行われませんが、特定のパラメータについては値を直接設定するよりも滑らかな遷移が望ましいです。

setTargetAtTime() メソッドを低いtimeConstantとともに使うことで、滑らかな遷移を実現できます。

7.4. オーディオのグリッチ(音切れ)

オーディオのグリッチは、通常の連続したオーディオストリームが途切れることで発生し、大きなクリック音やポップ音となります。これはマルチメディアシステムにおける致命的な障害とされ、必ず回避しなければなりません。オーディオストリームをハードウェアへ届けるスレッドに問題が生じる(スレッドの優先度や時間制約が適切でないためのスケジューリングレイテンシなど)ことで発生する場合や、オーディオDSPがCPU速度に対してリアルタイム処理できる以上の負荷を要求している場合などが原因となります。

8. セキュリティとプライバシーの考慮事項

Self-Review Questionnaire: Security and Privacy § questionsに従い:

  1. この仕様は個人識別可能情報を扱いますか?

    Web Audio APIを使って聴力検査を行うことが可能であり、個人が聞き取れる周波数範囲(年齢とともに低下)を明らかにできます。ただし、これはユーザーの自覚的参加と同意なしには難しく、能動的な操作が必要です。

  2. この仕様は高価値データを扱いますか?

    いいえ。Web Audioでクレジットカード情報などは利用されません。Web Audioを使って音声データの処理や分析は可能ですが、ユーザーのマイクへのアクセスはgetUserMedia() による許可制です。

  3. この仕様は、セッションをまたいでオリジンに新しい状態を導入しますか?

    いいえ。AudioWorkletはセッションをまたいで保持されません。

  4. この仕様は、永続的かつクロスオリジンな状態をWebに公開しますか?

    はい。サポートされるオーディオサンプルレートや出力デバイスのチャンネル数が公開されます。AudioContext参照。

  5. この仕様は、オリジンが現在アクセスできない他のデータを公開しますか?

    はい。利用可能なAudioNodeに関する情報をWeb Audio APIが公開することにより、クライアントの特徴(例:オーディオハードウェアのサンプルレート)をページが取得可能です。さらに、AnalyserNodeScriptProcessorNodeでタイミング情報を収集できます。これら情報はクライアントのフィンガープリント生成に用いられる可能性があります。

    Princeton CITPのWeb Transparency and Accountability Projectによる研究では、DynamicsCompressorNodeOscillatorNodeでクライアントからエントロピーを取得し、デバイスのフィンガープリント化が可能であると示されています。これは、異なる実装間のDSPアーキテクチャ、リサンプリング戦略や丸め処理の差異、コンパイラフラグやCPUアーキテクチャ(ARM vs. x86)による細かな、通常は可聴でない違いが原因です。

    しかし実際には、これにより得られる情報は(User Agent文字列など)より簡単な手段ですでに得られるものとほぼ同じです。「このブラウザXはプラットフォームY上で動作中」といった情報です。ただし追加的なフィンガープリント可能性を減らすため、各ノードの出力によるフィンガープリント化を抑制する措置をブラウザに求めます。

    クロックスキューによるフィンガープリントについては、Steven J MurdochとSebastian Zanderによる記述があります。getOutputTimestampで検出できる可能性があります。SkewベースのフィンガープリントはNakiblyらによるHTMLの例でも示されています。詳細はHigh Resolution Time § 10. Privacy Considerationsを参照してください。

    レイテンシによるフィンガープリントも可能です。これはbaseLatencyoutputLatencyから推測できる場合があります。対策としてジッタ(ディザ)や量子化を加え、正確なスキューが誤って報告されるようにします。ただしほとんどのオーディオシステムは低レイテンシを目指しており、WebAudioで生成されるオーディオを他のオーディオ・ビデオソースや視覚的キューと同期させる必要があります(例:ゲームや音楽制作環境)。過剰なレイテンシは使い勝手を損ない、アクセシビリティの問題となることもあります。

    AudioContextのサンプルレートによるフィンガープリント化も可能です。これを最小化するために以下を推奨します:

    1. 44.1kHzと48kHzがデフォルトレートとして許可され、システムは最適なものを選択します。(デバイスが44.1なら44.1を、96kHzなら48kHzなど、最も「互換性が高い」レートが選ばれます。)

    2. デバイスがそれ以外のレートの場合も、システムはどちらかにリサンプリングすべきです(バッテリー消費増加の可能性あり)。(例:16kHzなら48kHzに変換されることが期待されます。)

    3. ブラウザがネイティブレートの強制利用をユーザーが選択できるUI(例えばフラグ設定)を提供することが期待されますが、この設定はAPIで公開されません。

    4. AudioContextのコンストラクタで明示的に異なるレートを要求できることも仕様に含まれています。通常は要求されたレートでレンダリングし、出力デバイスに合わせてアップ/ダウンサンプルします。ネイティブでサポートされていればそのまま出力されます。例えばMediaDevicesの機能をユーザー操作で取得し、高いレートがサポートされていればそれを利用できます。

    AudioContextの出力チャンネル数によるフィンガープリント化も可能です。maxChannelCountは2(ステレオ)に設定することを推奨します。ステレオは最も一般的なチャンネル数です。

  6. この仕様は新しいスクリプト実行やロード機構を導入しますか?

    いいえ。[HTML]仕様で定義されたスクリプト実行方式を利用します。

  7. この仕様はオリジンがユーザーの位置情報へアクセスすることを許可しますか?

    いいえ。

  8. この仕様はオリジンがユーザーのデバイス上のセンサーへアクセスすることを許可しますか?

    直接は許可しません。本仕様では音声入力については定義されていませんが、クライアントのオーディオ入力やマイクへのアクセスには適切な方法でユーザーの許可が必要です。通常はgetUserMedia()API経由で行われます。

    さらに、Media Capture and Streams仕様のセキュリティ・プライバシー考慮事項にも注意が必要です。特に、環境音の分析や一意な音を再生することで、ユーザーの居場所(部屋単位や複数ユーザー・デバイスの同時滞在など)を特定できる場合があります。オーディオ出力・入力の両方にアクセスできれば、ブラウザ内の分離されたコンテキスト間で通信を行うことも可能です。

  9. この仕様はオリジンがユーザーのローカル計算環境の側面にアクセスすることを許可しますか?

    直接は許可しません。要求されたサンプルレートはすべてサポートされ、必要であればアップサンプリングされます。Media Capture and Streamsを使ってMediaTrackSupportedConstraintsで対応サンプルレートを調査することは可能ですが、明示的なユーザー同意が必要です。これも微弱なフィンガープリント化につながる可能性はありますが、実際にはほとんどの民生・業務用デバイスは44.1kHz(CD用)または48kHz(DAT用)の標準レートを使用しています。リソースが限られるデバイスは11kHz(音声品質)を、高級機器は88.2, 96, 192kHzもサポートすることがあります。

    すべての実装に48kHzなど単一の共通レートへのアップサンプリングを義務付けると、CPU負荷増加以外に利点がなく、ハイエンド機器に低レートを強制するとWeb Audioがプロ用途に不向きとされてしまいます。

  10. この仕様はオリジンが他のデバイスへアクセスすることを許可しますか?

    通常は他のネットワークデバイスへのアクセスを許可しません(例外:録音スタジオのDanteネットワークデバイスなどは専用ネットワークを使用)。必然的にユーザーのオーディオ出力デバイス(複数の場合もあり)へのアクセスは許可されます。

    音声や音による制御デバイスでは、Web Audio APIが他デバイスの制御に用いられる場合があります。また、音響機器が超音波帯に敏感な場合は、可聴外で制御できる可能性もあります。これはHTMLでも<audio>や<video>要素経由で同様に可能です。一般的なサンプリングレートでは設計上、可聴外帯域はほとんどありません:

    人間の聴覚限界は通常20kHzとされます。44.1kHzサンプリングではナイキスト限界が22.05kHzとなり、20~22.05kHz間は急峻なロールオフフィルタで強力減衰されます。

    48kHzサンプリングでも20~24kHz帯域で減衰されます(パスバンドでの位相歪みを避けやすい)。

  11. この仕様はオリジンがユーザーエージェントのネイティブUIの制御を行うことを許可しますか?

    UIに音声アシスタントやスクリーンリーダーなどのオーディオ要素がある場合、Web Audio APIを使ってネイティブUIの一部を模倣し、攻撃をローカルシステムイベントに見せかけることが可能です。これはHTMLの<audio>要素でも同様です。

  12. この仕様は一時的な識別子をWebに公開しますか?

    いいえ。

  13. この仕様はファーストパーティとサードパーティのコンテキストで動作の違いを設けますか?

    いいえ。

  14. この仕様はユーザーエージェントの「シークレットモード」において動作を変更しますか?

    変更しません。

  15. この仕様はユーザーのローカルデバイスにデータを永続化しますか?

    いいえ。

  16. この仕様は「セキュリティの考慮事項」と「プライバシーの考慮事項」セクションを持っていますか?

    はい(本セクションです)。

  17. この仕様はデフォルトのセキュリティ特性をダウングレードできますか?

    いいえ。

9. 要件とユースケース

[webaudio-usecases]を参照してください。

10. 仕様コードの共通定義

このセクションでは、本仕様で用いられるJavaScriptコードの共通関数およびクラスについて説明します。

// 3次元ベクトルクラスclass Vec3 {    // 3つの座標から生成    constructor(x, y, z) {        this.x = x;        this.y = y;        this.z = z;    }    // 他のベクトルとの内積    dot(v) {        return (this.x * v.x) + (this.y * v.y) + (this.z * v.z);    }    // 他のベクトルとの外積    cross(v) {        return new Vec3((this.y * v.z) - (this.z * v.y),            (this.z * v.x) - (this.x * v.z),            (this.x * v.y) - (this.y * v.x));    }    // 他のベクトルとの差分    diff(v) {        return new Vec3(this.x - v.x, this.y - v.y, this.z - v.z);    }    // ベクトルの大きさ(ノルム)    get magnitude() {        return Math.sqrt(dot(this));    }    // スカラー倍したベクトルのコピーを取得    scale(s) {        return new Vec3(this.x * s, this.y * s, this.z * s);    }    // 正規化したベクトルのコピーを取得    normalize() {        const m = magnitude;        if (m == 0) {            return new Vec3(0, 0, 0);        }        return scale(1 / m);    }}

11. 変更履歴

12. 謝辞

本仕様はW3CAudio Working Groupによる共同作業です。

ワーキンググループの現メンバーおよび元メンバー、仕様への貢献者(執筆時点、アルファベット順):
Adenot, Paul (Mozilla Foundation) - 仕様共同編集者; Akhgari, Ehsan (Mozilla Foundation); Becker, Steven (Microsoft Corporation); Berkovitz, Joe (招待専門家、Noteflight/Hal Leonard所属) - WG共同議長(2013年9月~2017年12月); Bossart, Pierre (Intel Corporation); Borins, Myles (Google, Inc); Buffa, Michel (NSAU); Caceres, Marcos (招待専門家); Cardoso, Gabriel (INRIA); Carlson, Eric (Apple, Inc); Chen, Bin (Baidu, Inc); Choi, Hongchan (Google, Inc) - 仕様共同編集者; Collichio, Lisa (Qualcomm); Geelnard, Marcus (Opera Software); Gehring, Todd (Dolby Laboratories); Goode, Adam (Google, Inc); Gregan, Matthew (Mozilla Foundation); Hikawa, Kazuo (AMEI); Hofmann, Bill (Dolby Laboratories); Jägenstedt, Philip (Google, Inc); Jeong, Paul Changjin (HTML5 Converged Technology Forum); Kalliokoski, Jussi (招待専門家); Lee, WonSuk (Electronics and Telecommunications Research Institute); Kakishita, Masahiro (AMEI); Kawai, Ryoya (AMEI); Kostiainen, Anssi (Intel Corporation); Lilley, Chris (W3Cスタッフ); Lowis, Chris (招待専門家) - WG共同議長(2012年12月~2013年9月、BBC所属); MacDonald, Alistair (W3C招待専門家) — WG共同議長(2011年3月~2012年7月); Mandyam, Giridhar (Qualcomm Innovation Center, Inc); Michel, Thierry (W3C/ERCIM); Nair, Varun (Facebook); Needham, Chris (BBC); Noble, Jer (Apple, Inc); O’Callahan, Robert(Mozilla Foundation); Onumonu, Anthony (BBC); Paradis, Matthew (BBC) - WG共同議長(2013年9月~現在); Pozdnyakov, Mikhail (Intel Corporation); Raman, T.V. (Google, Inc); Rogers, Chris (Google, Inc); Schepers, Doug (W3C/MIT); Schmitz, Alexander (JS Foundation); Shires, Glen (Google, Inc); Smith, Jerry (Microsoft Corporation); Smith, Michael (W3C/Keio); Thereaux, Olivier (BBC); Toy, Raymond (Google, Inc.) - WG共同議長(2017年12月~現在); Toyoshima, Takashi (Google, Inc); Troncy, Raphael (Institut Telecom); Verdie, Jean-Charles (MStar Semiconductor, Inc.); Wei, James (Intel Corporation); Weitnauer, Michael (IRT); Wilson, Chris (Google,Inc); Zergaoui, Mohamed (INNOVIMAX)

適合性

文書の規約

適合性要件は、記述的な断言とRFC 2119用語の組み合わせで表現されています。 現行標準の規範部分における “MUST”, “MUST NOT”, “REQUIRED”, “SHALL”, “SHALL NOT”, “SHOULD”, “SHOULD NOT”, “RECOMMENDED”, “MAY”, “OPTIONAL” などのキーワードはRFC 2119で定義される意味として解釈されます。 ただし、可読性のため、本仕様ではこれらの単語はすべて大文字では記載されていません。

本仕様のすべての本文は規範ですが、明示的に非規範であるとされたセクション、例、および注記は除きます。[RFC2119]

本仕様の例は「例えば」という語で導入されるか、class="example"を用いて規範文と区別されます。以下のようになります:

これは参考例です。

参考となる注記は「注記」で始まり、class="note"で規範文と区別されます。以下のようになります:

注記:これは参考情報の注記です。

適合するアルゴリズム

アルゴリズムの中で命令形で記述されている要件(例:「先頭の空白文字をすべて除去する」「falseを返してこれらの手順を中止する」など)は、アルゴリズムの導入部で使用されたキーワード(「must」「should」「may」など)の意味として解釈されます。

アルゴリズムや具体的な手順として表現された適合性要件は、最終結果が同等である限り、どのような方法で実装しても構いません。 特に、本仕様で定義されるアルゴリズムは理解しやすさを重視しており、性能を意図したものではありません。 実装者は最適化を推奨します。

索引

本仕様で定義される用語

参照によって定義される用語

参考文献

規範的参考文献

[DOM]
Anne van Kesteren. DOM Standard. 現行標準. URL: https://dom.spec.whatwg.org/
[ECMASCRIPT]
ECMAScript Language Specification. URL: https://tc39.es/ecma262/multipage/
[FETCH]
Anne van Kesteren. Fetch Standard. 現行標準. URL: https://fetch.spec.whatwg.org/
[HR-TIME-3]
Yoav Weiss. High Resolution Time. 2023年7月19日. WD. URL: https://www.w3.org/TR/hr-time-3/
[HTML]
Anne van Kesteren; et al. HTML Standard. 現行標準. URL: https://html.spec.whatwg.org/multipage/
[INFRA]
Anne van Kesteren; Domenic Denicola. Infra Standard. 現行標準. URL: https://infra.spec.whatwg.org/
[MEDIACAPTURE-STREAMS]
Cullen Jennings; et al. Media Capture and Streams. 2024年10月3日. CR. URL: https://www.w3.org/TR/mediacapture-streams/
[MIMESNIFF]
Gordon P. Hemsley. MIME Sniffing Standard. 現行標準. URL: https://mimesniff.spec.whatwg.org/
[RFC2119]
S. Bradner. Key words for use in RFCs to Indicate Requirement Levels. 1997年3月. Best Current Practice. URL: https://datatracker.ietf.org/doc/html/rfc2119
[SECURITY-PRIVACY-QUESTIONNAIRE]
Theresa O'Connor; Peter Snyder. Self-Review Questionnaire: Security and Privacy. 2021年12月16日. NOTE. URL: https://www.w3.org/TR/security-privacy-questionnaire/
[WEBIDL]
Edgar Chen; Timothy Gu. Web IDL Standard. 現行標準. URL: https://webidl.spec.whatwg.org/
[WEBRTC]
Cullen Jennings; et al. WebRTC: Real-Time Communication in Browsers. 2024年10月8日. REC. URL: https://www.w3.org/TR/webrtc/

参考情報

[2DCONTEXT]
Rik Cabanier; et al. HTML Canvas 2D Context. 2021年1月28日. REC. URL: https://www.w3.org/TR/2dcontext/
[MEDIASTREAM-RECORDING]
Miguel Casas-sanchez. MediaStream Recording. 2023年5月11日. WD. URL: https://www.w3.org/TR/mediastream-recording/
[WEBAUDIO-USECASES]
Joe Berkovitz; Olivier Thereaux. Web Audio Processing: Use Cases and Requirements. 2013年1月29日. NOTE. URL: https://www.w3.org/TR/webaudio-usecases/
[WEBCODECS]
Paul Adenot; Bernard Aboba; Eugene Zemtsov. WebCodecs. 2024年10月8日. WD. URL: https://www.w3.org/TR/webcodecs/
[WEBGL]
Dean Jackson; Jeff Gilbert. WebGL 2.0 Specification. 2017年8月12日. URL: https://www.khronos.org/registry/webgl/specs/latest/2.0/
[XHR]
Anne van Kesteren. XMLHttpRequest Standard. 現行標準. URL: https://xhr.spec.whatwg.org/

IDL索引

enum AudioContextState {
    "suspended",
    "running",
    "closed"
};

enum AudioContextRenderSizeCategory {
    "default",
    "hardware"
};

callback DecodeErrorCallback = undefined (DOMException error);

callback DecodeSuccessCallback = undefined (AudioBuffer decodedData);

[Exposed=Window]
interface BaseAudioContext : EventTarget {
    readonly attribute AudioDestinationNode destination;
    readonly attribute float sampleRate;
    readonly attribute double currentTime;
    readonly attribute AudioListener listener;
    readonly attribute AudioContextState state;
    readonly attribute unsigned long renderQuantumSize;
    [SameObject, SecureContext]
    readonly attribute AudioWorklet audioWorklet;
    attribute EventHandler onstatechange;

    AnalyserNode createAnalyser ();
    BiquadFilterNode createBiquadFilter ();
    AudioBuffer createBuffer (unsigned long numberOfChannels,
                                unsigned long length,
                                float sampleRate);
    AudioBufferSourceNode createBufferSource ();
    ChannelMergerNode createChannelMerger (optional unsigned long numberOfInputs = 6);
    ChannelSplitterNode createChannelSplitter (
        optional unsigned long numberOfOutputs = 6);
    ConstantSourceNode createConstantSource ();
    ConvolverNode createConvolver ();
    DelayNode createDelay (optional double maxDelayTime = 1.0);
    DynamicsCompressorNode createDynamicsCompressor ();
    GainNode createGain ();
    IIRFilterNode createIIRFilter (sequence<double> feedforward,
                                    sequence<double> feedback);
    OscillatorNode createOscillator ();
    PannerNode createPanner ();
    PeriodicWave createPeriodicWave (sequence<float> real,
                                        sequence<float> imag,
                                        optional PeriodicWaveConstraints constraints = {});
    ScriptProcessorNode createScriptProcessor(
        optional unsigned long bufferSize = 0,
        optional unsigned long numberOfInputChannels = 2,
        optional unsigned long numberOfOutputChannels = 2);
    StereoPannerNode createStereoPanner ();
    WaveShaperNode createWaveShaper ();

    Promise<AudioBuffer> decodeAudioData (
        ArrayBuffer audioData,
        optional DecodeSuccessCallback? successCallback,
        optional DecodeErrorCallback? errorCallback);
};

enum AudioContextLatencyCategory {
        "balanced",
        "interactive",
        "playback"
};

enum AudioSinkType {
    "none"
};

[Exposed=Window]
interface AudioContext : BaseAudioContext {
    constructor (optional AudioContextOptions contextOptions = {});
    readonly attribute double baseLatency;
    readonly attribute double outputLatency;
    [SecureContext] readonly attribute (DOMString or AudioSinkInfo) sinkId;
    [SecureContext] readonly attribute AudioRenderCapacity renderCapacity;
    attribute EventHandler onsinkchange;
    attribute EventHandler onerror;
    AudioTimestamp getOutputTimestamp ();
    Promise<undefined> resume ();
    Promise<undefined> suspend ();
    Promise<undefined> close ();
    [SecureContext] Promise<undefined> setSinkId ((DOMString or AudioSinkOptions) sinkId);
    MediaElementAudioSourceNode createMediaElementSource (HTMLMediaElement mediaElement);
    MediaStreamAudioSourceNode createMediaStreamSource (MediaStream mediaStream);
    MediaStreamTrackAudioSourceNode createMediaStreamTrackSource (
        MediaStreamTrack mediaStreamTrack);
    MediaStreamAudioDestinationNode createMediaStreamDestination ();
};

dictionary AudioContextOptions {
    (AudioContextLatencyCategory or double) latencyHint = "interactive";
    float sampleRate;
    (DOMString or AudioSinkOptions) sinkId;
    (AudioContextRenderSizeCategory or unsigned long) renderSizeHint = "default";
};

dictionary AudioSinkOptions {
    required AudioSinkType type;
};

[Exposed=Window]
interface AudioSinkInfo {
    readonly attribute AudioSinkType type;
};

dictionary AudioTimestamp {
    double contextTime;
    DOMHighResTimeStamp performanceTime;
};

[Exposed=Window]
interface AudioRenderCapacity : EventTarget {
    undefined start(optional AudioRenderCapacityOptions options = {});
        undefined stop();
        attribute EventHandler onupdate;
};

dictionary AudioRenderCapacityOptions {
        double updateInterval = 1;
};

[Exposed=Window]
interface AudioRenderCapacityEvent : Event {
    constructor (DOMString type, optional AudioRenderCapacityEventInit eventInitDict = {});
        readonly attribute double timestamp;
        readonly attribute double averageLoad;
        readonly attribute double peakLoad;
        readonly attribute double underrunRatio;
};

dictionary AudioRenderCapacityEventInit : EventInit {
    double timestamp = 0;
    double averageLoad = 0;
    double peakLoad = 0;
    double underrunRatio = 0;
};

[Exposed=Window]
interface OfflineAudioContext : BaseAudioContext {
    constructor(OfflineAudioContextOptions contextOptions);
    constructor(unsigned long numberOfChannels, unsigned long length, float sampleRate);
    Promise<AudioBuffer> startRendering();
    Promise<undefined> resume();
    Promise<undefined> suspend(double suspendTime);
    readonly attribute unsigned long length;
    attribute EventHandler oncomplete;
};

dictionary OfflineAudioContextOptions {
    unsigned long numberOfChannels = 1;
    required unsigned long length;
    required float sampleRate;
    (AudioContextRenderSizeCategory or unsigned long) renderSizeHint = "default";
};

[Exposed=Window]
interface OfflineAudioCompletionEvent : Event {
    constructor (DOMString type, OfflineAudioCompletionEventInit eventInitDict);
    readonly attribute AudioBuffer renderedBuffer;
};

dictionary OfflineAudioCompletionEventInit : EventInit {
    required AudioBuffer renderedBuffer;
};

[Exposed=Window]
interface AudioBuffer {
    constructor (AudioBufferOptions options);
    readonly attribute float sampleRate;
    readonly attribute unsigned long length;
    readonly attribute double duration;
    readonly attribute unsigned long numberOfChannels;
    Float32Array getChannelData (unsigned long channel);
    undefined copyFromChannel (Float32Array destination,
                               unsigned long channelNumber,
                               optional unsigned long bufferOffset = 0);
    undefined copyToChannel (Float32Array source,
                             unsigned long channelNumber,
                             optional unsigned long bufferOffset = 0);
};

dictionary AudioBufferOptions {
    unsigned long numberOfChannels = 1;
    required unsigned long length;
    required float sampleRate;
};

[Exposed=Window]
interface AudioNode : EventTarget {
    AudioNode connect (AudioNode destinationNode,
                       optional unsigned long output = 0,
                       optional unsigned long input = 0);
    undefined connect (AudioParam destinationParam, optional unsigned long output = 0);
    undefined disconnect ();
    undefined disconnect (unsigned long output);
    undefined disconnect (AudioNode destinationNode);
    undefined disconnect (AudioNode destinationNode, unsigned long output);
    undefined disconnect (AudioNode destinationNode,
                          unsigned long output,
                          unsigned long input);
    undefined disconnect (AudioParam destinationParam);
    undefined disconnect (AudioParam destinationParam, unsigned long output);
    readonly attribute BaseAudioContext context;
    readonly attribute unsigned long numberOfInputs;
    readonly attribute unsigned long numberOfOutputs;
    attribute unsigned long channelCount;
    attribute ChannelCountMode channelCountMode;
    attribute ChannelInterpretation channelInterpretation;
};

enum ChannelCountMode {
    "max",
    "clamped-max",
    "explicit"
};

enum ChannelInterpretation {
    "speakers",
    "discrete"
};

dictionary AudioNodeOptions {
    unsigned long channelCount;
    ChannelCountMode channelCountMode;
    ChannelInterpretation channelInterpretation;
};

enum AutomationRate {
    "a-rate",
    "k-rate"
};

[Exposed=Window]
interface AudioParam {
    attribute float value;
    attribute AutomationRate automationRate;
    readonly attribute float defaultValue;
    readonly attribute float minValue;
    readonly attribute float maxValue;
    AudioParam setValueAtTime (float value, double startTime);
    AudioParam linearRampToValueAtTime (float value, double endTime);
    AudioParam exponentialRampToValueAtTime (float value, double endTime);
    AudioParam setTargetAtTime (float target, double startTime, float timeConstant);
    AudioParam setValueCurveAtTime (sequence<float> values,
                                    double startTime,
                                    double duration);
    AudioParam cancelScheduledValues (double cancelTime);
    AudioParam cancelAndHoldAtTime (double cancelTime);
};

[Exposed=Window]
interface AudioScheduledSourceNode : AudioNode {
    attribute EventHandler onended;
    undefined start(optional double when = 0);
    undefined stop(optional double when = 0);
};

[Exposed=Window]
interface AnalyserNode : AudioNode {
    constructor (BaseAudioContext context, optional AnalyserOptions options = {});
    undefined getFloatFrequencyData (Float32Array array);
    undefined getByteFrequencyData (Uint8Array array);
    undefined getFloatTimeDomainData (Float32Array array);
    undefined getByteTimeDomainData (Uint8Array array);
    attribute unsigned long fftSize;
    readonly attribute unsigned long frequencyBinCount;
    attribute double minDecibels;
    attribute double maxDecibels;
    attribute double smoothingTimeConstant;
};

dictionary AnalyserOptions : AudioNodeOptions {
    unsigned long fftSize = 2048;
    double maxDecibels = -30;
    double minDecibels = -100;
    double smoothingTimeConstant = 0.8;
};

[Exposed=Window]
interface AudioBufferSourceNode : AudioScheduledSourceNode {
    constructor (BaseAudioContext context,
                 optional AudioBufferSourceOptions options = {});
    attribute AudioBuffer? buffer;
    readonly attribute AudioParam playbackRate;
    readonly attribute AudioParam detune;
    attribute boolean loop;
    attribute double loopStart;
    attribute double loopEnd;
    undefined start (optional double when = 0,
                     optional double offset,
                     optional double duration);
};

dictionary AudioBufferSourceOptions {
    AudioBuffer? buffer;
    float detune = 0;
    boolean loop = false;
    double loopEnd = 0;
    double loopStart = 0;
    float playbackRate = 1;
};

[Exposed=Window]
interface AudioDestinationNode : AudioNode {
    readonly attribute unsigned long maxChannelCount;
};

[Exposed=Window]
interface AudioListener {
    readonly attribute AudioParam positionX;
    readonly attribute AudioParam positionY;
    readonly attribute AudioParam positionZ;
    readonly attribute AudioParam forwardX;
    readonly attribute AudioParam forwardY;
    readonly attribute AudioParam forwardZ;
    readonly attribute AudioParam upX;
    readonly attribute AudioParam upY;
    readonly attribute AudioParam upZ;
    undefined setPosition (float x, float y, float z);
    undefined setOrientation (float x, float y, float z, float xUp, float yUp, float zUp);
};

[Exposed=Window]
interface AudioProcessingEvent : Event {
    constructor (DOMString type, AudioProcessingEventInit eventInitDict);
    readonly attribute double playbackTime;
    readonly attribute AudioBuffer inputBuffer;
    readonly attribute AudioBuffer outputBuffer;
};

dictionary AudioProcessingEventInit : EventInit {
    required double playbackTime;
    required AudioBuffer inputBuffer;
    required AudioBuffer outputBuffer;
};

enum BiquadFilterType {
    "lowpass",
    "highpass",
    "bandpass",
    "lowshelf",
    "highshelf",
    "peaking",
    "notch",
    "allpass"
};

[Exposed=Window]
interface BiquadFilterNode : AudioNode {
    constructor (BaseAudioContext context, optional BiquadFilterOptions options = {});
    attribute BiquadFilterType type;
    readonly attribute AudioParam frequency;
    readonly attribute AudioParam detune;
    readonly attribute AudioParam Q;
    readonly attribute AudioParam gain;
    undefined getFrequencyResponse (Float32Array frequencyHz,
                                    Float32Array magResponse,
                                    Float32Array phaseResponse);
};

dictionary BiquadFilterOptions : AudioNodeOptions {
    BiquadFilterType type = "lowpass";
    float Q = 1;
    float detune = 0;
    float frequency = 350;
    float gain = 0;
};

[Exposed=Window]
interface ChannelMergerNode : AudioNode {
    constructor (BaseAudioContext context, optional ChannelMergerOptions options = {});
};

dictionary ChannelMergerOptions : AudioNodeOptions {
    unsigned long numberOfInputs = 6;
};

[Exposed=Window]
interface ChannelSplitterNode : AudioNode {
    constructor (BaseAudioContext context, optional ChannelSplitterOptions options = {});
};

dictionary ChannelSplitterOptions : AudioNodeOptions {
    unsigned long numberOfOutputs = 6;
};

[Exposed=Window]
interface ConstantSourceNode : AudioScheduledSourceNode {
    constructor (BaseAudioContext context, optional ConstantSourceOptions options = {});
    readonly attribute AudioParam offset;
};

dictionary ConstantSourceOptions {
    float offset = 1;
};

[Exposed=Window]
interface ConvolverNode : AudioNode {
    constructor (BaseAudioContext context, optional ConvolverOptions options = {});
    attribute AudioBuffer? buffer;
    attribute boolean normalize;
};

dictionary ConvolverOptions : AudioNodeOptions {
    AudioBuffer? buffer;
    boolean disableNormalization = false;
};

[Exposed=Window]
interface DelayNode : AudioNode {
    constructor (BaseAudioContext context, optional DelayOptions options = {});
    readonly attribute AudioParam delayTime;
};

dictionary DelayOptions : AudioNodeOptions {
    double maxDelayTime = 1;
    double delayTime = 0;
};

[Exposed=Window]
interface DynamicsCompressorNode : AudioNode {
    constructor (BaseAudioContext context,
                 optional DynamicsCompressorOptions options = {});
    readonly attribute AudioParam threshold;
    readonly attribute AudioParam knee;
    readonly attribute AudioParam ratio;
    readonly attribute float reduction;
    readonly attribute AudioParam attack;
    readonly attribute AudioParam release;
};

dictionary DynamicsCompressorOptions : AudioNodeOptions {
    float attack = 0.003;
    float knee = 30;
    float ratio = 12;
    float release = 0.25;
    float threshold = -24;
};

[Exposed=Window]
interface GainNode : AudioNode {
    constructor (BaseAudioContext context, optional GainOptions options = {});
    readonly attribute AudioParam gain;
};

dictionary GainOptions : AudioNodeOptions {
    float gain = 1.0;
};

[Exposed=Window]
interface IIRFilterNode : AudioNode {
    constructor (BaseAudioContext context, IIRFilterOptions options);
    undefined getFrequencyResponse (Float32Array frequencyHz,
                                    Float32Array magResponse,
                                    Float32Array phaseResponse);
};

dictionary IIRFilterOptions : AudioNodeOptions {
    required sequence<double> feedforward;
    required sequence<double> feedback;
};

[Exposed=Window]
interface MediaElementAudioSourceNode : AudioNode {
    constructor (AudioContext context, MediaElementAudioSourceOptions options);
    [SameObject] readonly attribute HTMLMediaElement mediaElement;
};

dictionary MediaElementAudioSourceOptions {
    required HTMLMediaElement mediaElement;
};

[Exposed=Window]
interface MediaStreamAudioDestinationNode : AudioNode {
    constructor (AudioContext context, optional AudioNodeOptions options = {});
    readonly attribute MediaStream stream;
};

[Exposed=Window]
interface MediaStreamAudioSourceNode : AudioNode {
    constructor (AudioContext context, MediaStreamAudioSourceOptions options);
    [SameObject] readonly attribute MediaStream mediaStream;
};

dictionary MediaStreamAudioSourceOptions {
    required MediaStream mediaStream;
};

[Exposed=Window]
interface MediaStreamTrackAudioSourceNode : AudioNode {
    constructor (AudioContext context, MediaStreamTrackAudioSourceOptions options);
};

dictionary MediaStreamTrackAudioSourceOptions {
    required MediaStreamTrack mediaStreamTrack;
};

enum OscillatorType {
    "sine",
    "square",
    "sawtooth",
    "triangle",
    "custom"
};

[Exposed=Window]
interface OscillatorNode : AudioScheduledSourceNode {
    constructor (BaseAudioContext context, optional OscillatorOptions options = {});
    attribute OscillatorType type;
    readonly attribute AudioParam frequency;
    readonly attribute AudioParam detune;
    undefined setPeriodicWave (PeriodicWave periodicWave);
};

dictionary OscillatorOptions : AudioNodeOptions {
    OscillatorType type = "sine";
    float frequency = 440;
    float detune = 0;
    PeriodicWave periodicWave;
};

enum PanningModelType {
        "equalpower",
        "HRTF"
};

enum DistanceModelType {
    "linear",
    "inverse",
    "exponential"
};

[Exposed=Window]
interface PannerNode : AudioNode {
    constructor (BaseAudioContext context, optional PannerOptions options = {});
    attribute PanningModelType panningModel;
    readonly attribute AudioParam positionX;
    readonly attribute AudioParam positionY;
    readonly attribute AudioParam positionZ;
    readonly attribute AudioParam orientationX;
    readonly attribute AudioParam orientationY;
    readonly attribute AudioParam orientationZ;
    attribute DistanceModelType distanceModel;
    attribute double refDistance;
    attribute double maxDistance;
    attribute double rolloffFactor;
    attribute double coneInnerAngle;
    attribute double coneOuterAngle;
    attribute double coneOuterGain;
    undefined setPosition (float x, float y, float z);
    undefined setOrientation (float x, float y, float z);
};

dictionary PannerOptions : AudioNodeOptions {
    PanningModelType panningModel = "equalpower";
    DistanceModelType distanceModel = "inverse";
    float positionX = 0;
    float positionY = 0;
    float positionZ = 0;
    float orientationX = 1;
    float orientationY = 0;
    float orientationZ = 0;
    double refDistance = 1;
    double maxDistance = 10000;
    double rolloffFactor = 1;
    double coneInnerAngle = 360;
    double coneOuterAngle = 360;
    double coneOuterGain = 0;
};

[Exposed=Window]
interface PeriodicWave {
    constructor (BaseAudioContext context, optional PeriodicWaveOptions options = {});
};

dictionary PeriodicWaveConstraints {
    boolean disableNormalization = false;
};

dictionary PeriodicWaveOptions : PeriodicWaveConstraints {
    sequence<float> real;
    sequence<float> imag;
};

[Exposed=Window]
interface ScriptProcessorNode : AudioNode {
    attribute EventHandler onaudioprocess;
    readonly attribute long bufferSize;
};

[Exposed=Window]
interface StereoPannerNode : AudioNode {
    constructor (BaseAudioContext context, optional StereoPannerOptions options = {});
    readonly attribute AudioParam pan;
};

dictionary StereoPannerOptions : AudioNodeOptions {
    float pan = 0;
};

enum OverSampleType {
    "none",
    "2x",
    "4x"
};

[Exposed=Window]
interface WaveShaperNode : AudioNode {
    constructor (BaseAudioContext context, optional WaveShaperOptions options = {});
    attribute Float32Array? curve;
    attribute OverSampleType oversample;
};

dictionary WaveShaperOptions : AudioNodeOptions {
    sequence<float> curve;
    OverSampleType oversample = "none";
};

[Exposed=Window, SecureContext]
interface AudioWorklet : Worklet {
  readonly attribute MessagePort port;
};

callback AudioWorkletProcessorConstructor = AudioWorkletProcessor (object options);

[Global=(Worklet, AudioWorklet), Exposed=AudioWorklet]
interface AudioWorkletGlobalScope : WorkletGlobalScope {
    undefined registerProcessor (DOMString name,
                                               AudioWorkletProcessorConstructor processorCtor);
    readonly attribute unsigned long long currentFrame;
    readonly attribute double currentTime;
    readonly attribute float sampleRate;
    readonly attribute unsigned long renderQuantumSize;
    readonly attribute MessagePort port;
};

[Exposed=Window]
interface AudioParamMap {
    readonly maplike<DOMString, AudioParam>;
};

[Exposed=Window, SecureContext]
interface AudioWorkletNode : AudioNode {
    constructor (BaseAudioContext context, DOMString name,
               optional AudioWorkletNodeOptions options = {});
    readonly attribute AudioParamMap parameters;
    readonly attribute MessagePort port;
    attribute EventHandler onprocessorerror;
};

dictionary AudioWorkletNodeOptions : AudioNodeOptions {
    unsigned long numberOfInputs = 1;
    unsigned long numberOfOutputs = 1;
    sequence<unsigned long> outputChannelCount;
    record<DOMString, double> parameterData;
    object processorOptions;
};

[Exposed=AudioWorklet]
interface AudioWorkletProcessor {
    constructor ();
    readonly attribute MessagePort port;
};

callback AudioWorkletProcessCallback =
  boolean (FrozenArray<FrozenArray<Float32Array>> inputs,
           FrozenArray<FrozenArray<Float32Array>> outputs,
           object parameters);

dictionary AudioParamDescriptor {
    required DOMString name;
    float defaultValue = 0;
    float minValue = -3.4028235e38;
    float maxValue = 3.4028235e38;
    AutomationRate automationRate = "a-rate";
};

MDN

AnalyserNode/AnalyserNode

In all current engines.

Firefox53+Safari14.1+Chrome55+
Opera?Edge79+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

AnalyserNode/fftSize

In all current engines.

Firefox25+Safari6+Chrome14+
Opera?Edge79+
Edge (Legacy)12+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView4.4.3+Samsung Internet?Opera Mobile?
MDN

AnalyserNode/frequencyBinCount

In all current engines.

Firefox25+Safari6+Chrome14+
Opera?Edge79+
Edge (Legacy)12+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView4.4.3+Samsung Internet?Opera Mobile?
MDN

AnalyserNode/getByteFrequencyData

In all current engines.

Firefox25+Safari6+Chrome14+
Opera?Edge79+
Edge (Legacy)12+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView4.4.3+Samsung Internet?Opera Mobile?
MDN

AnalyserNode/getByteTimeDomainData

In all current engines.

Firefox25+Safari6+Chrome14+
Opera?Edge79+
Edge (Legacy)12+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView4.4.3+Samsung Internet?Opera Mobile?
MDN

AnalyserNode/getFloatFrequencyData

In all current engines.

Firefox25+Safari6+Chrome14+
Opera?Edge79+
Edge (Legacy)12+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView4.4.3+Samsung Internet?Opera Mobile?
MDN

AnalyserNode/getFloatTimeDomainData

In all current engines.

Firefox30+Safari14.1+Chrome35+
Opera?Edge79+
Edge (Legacy)12+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

AnalyserNode/maxDecibels

In all current engines.

Firefox25+Safari6+Chrome14+
Opera?Edge79+
Edge (Legacy)12+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView4.4.3+Samsung Internet?Opera Mobile?
MDN

AnalyserNode/minDecibels

In all current engines.

Firefox25+Safari6+Chrome14+
Opera?Edge79+
Edge (Legacy)12+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView4.4.3+Samsung Internet?Opera Mobile?
MDN

AnalyserNode/smoothingTimeConstant

In all current engines.

Firefox25+Safari6+Chrome14+
Opera?Edge79+
Edge (Legacy)12+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView4.4.3+Samsung Internet?Opera Mobile?
MDN

AnalyserNode

In all current engines.

Firefox25+Safari6+Chrome14+
Opera?Edge79+
Edge (Legacy)12+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView4.4.3+Samsung Internet?Opera Mobile?
MDN

AudioBuffer/AudioBuffer

In all current engines.

Firefox53+Safari14.1+Chrome55+
Opera?Edge79+
Edge (Legacy)NoneIENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet6.0+Opera Mobile42+
MDN

AudioBuffer/copyFromChannel

In all current engines.

Firefox27+Safari14.1+Chrome43+
Opera?Edge79+
Edge (Legacy)13+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

AudioBuffer/copyToChannel

In all current engines.

Firefox27+Safari14.1+Chrome43+
Opera?Edge79+
Edge (Legacy)13+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

AudioBuffer/duration

In all current engines.

Firefox25+Safari6+Chrome14+
Opera?Edge79+
Edge (Legacy)12+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView4.4.3+Samsung Internet?Opera Mobile?
MDN

AudioBuffer/getChannelData

In all current engines.

Firefox25+Safari6+Chrome14+
Opera?Edge79+
Edge (Legacy)12+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView4.4.3+Samsung Internet?Opera Mobile?
MDN

AudioBuffer/length

In all current engines.

Firefox25+Safari6+Chrome14+
Opera?Edge79+
Edge (Legacy)12+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView4.4.3+Samsung Internet?Opera Mobile?
MDN

AudioBuffer/numberOfChannels

In all current engines.

Firefox25+Safari6+Chrome14+
Opera?Edge79+
Edge (Legacy)12+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView4.4.3+Samsung Internet?Opera Mobile?
MDN

AudioBuffer/sampleRate

In all current engines.

Firefox25+Safari6+Chrome14+
Opera?Edge79+
Edge (Legacy)12+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView4.4.3+Samsung Internet?Opera Mobile?
MDN

AudioBuffer

In all current engines.

Firefox25+Safari6+Chrome14+
Opera?Edge79+
Edge (Legacy)12+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView4.4.3+Samsung Internet?Opera Mobile?
MDN

AudioBufferSourceNode/AudioBufferSourceNode

In all current engines.

Firefox53+Safari14.1+Chrome55+
Opera?Edge79+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

AudioBufferSourceNode/buffer

In all current engines.

Firefox25+Safari6+Chrome14+
Opera?Edge79+
Edge (Legacy)12+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView4.4.3+Samsung Internet?Opera Mobile?
MDN

AudioBufferSourceNode/detune

In all current engines.

Firefox40+Safari14.1+Chrome44+
Opera?Edge79+
Edge (Legacy)13+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

AudioBufferSourceNode/loop

In all current engines.

Firefox25+Safari6+Chrome15+
Opera?Edge79+
Edge (Legacy)12+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView4.4.3+Samsung Internet?Opera Mobile?
MDN

AudioBufferSourceNode/loopEnd

In all current engines.

Firefox25+Safari7+Chrome24+
Opera?Edge79+
Edge (Legacy)12+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView4.4.3+Samsung Internet?Opera Mobile?
MDN

AudioBufferSourceNode/loopStart

In all current engines.

Firefox25+Safari7+Chrome24+
Opera?Edge79+
Edge (Legacy)12+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView4.4.3+Samsung Internet?Opera Mobile?
MDN

AudioBufferSourceNode/playbackRate

In all current engines.

Firefox25+Safari6+Chrome14+
Opera?Edge79+
Edge (Legacy)12+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView4.4.3+Samsung Internet?Opera Mobile?
MDN

AudioBufferSourceNode/start

In all current engines.

Firefox25+Safari7+Chrome24+
Opera?Edge79+
Edge (Legacy)12+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView4.4.3+Samsung Internet?Opera Mobile?
MDN

AudioBufferSourceNode

In all current engines.

Firefox25+Safari6+Chrome14+
Opera?Edge79+
Edge (Legacy)12+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView4.4.3+Samsung Internet?Opera Mobile?
MDN

AudioContext/AudioContext

In all current engines.

Firefox25+Safari14.1+Chrome35+
Opera22+Edge79+
Edge (Legacy)12+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView37+Samsung Internet3.0+Opera Mobile22+
MDN

AudioContext/baseLatency

In all current engines.

Firefox70+Safari14.1+Chrome58+
Opera?Edge79+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

AudioContext/close

In all current engines.

Firefox40+Safari9+Chrome42+
Opera?Edge79+
Edge (Legacy)14+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

AudioContext/createMediaElementSource

In all current engines.

Firefox25+Safari6+Chrome15+
Opera?Edge79+
Edge (Legacy)12+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView37+Samsung Internet?Opera Mobile?
MDN

AudioContext/createMediaStreamDestination

In all current engines.

Firefox25+Safari11+Chrome25+
Opera?Edge79+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView37+Samsung Internet?Opera Mobile?
MDN

AudioContext/createMediaStreamSource

In all current engines.

Firefox25+Safari11+Chrome22+
Opera?Edge79+
Edge (Legacy)12+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView37+Samsung Internet?Opera Mobile?
MDN

AudioContext/createMediaStreamTrackSource

In only one current engine.

Firefox68+SafariNoneChromeNone
Opera?EdgeNone
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

AudioContext/getOutputTimestamp

In all current engines.

Firefox70+Safari14.1+Chrome57+
Opera?Edge79+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

AudioContext/outputLatency

Firefox70+SafariNoneChrome102+
Opera?Edge102+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

AudioContext/resume

In all current engines.

Firefox40+Safari9+Chrome41+
Opera?Edge79+
Edge (Legacy)14+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

AudioContext/setSinkId

In only one current engine.

FirefoxNoneSafariNoneChrome110+
Opera?Edge110+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

AudioContext/sinkchange_event

In only one current engine.

FirefoxNoneSafariNoneChrome110+
Opera?Edge110+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

AudioContext/sinkId

In only one current engine.

FirefoxNoneSafariNoneChrome110+
Opera?Edge110+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

AudioContext/suspend

In all current engines.

Firefox40+Safari9+Chrome41+
Opera?Edge79+
Edge (Legacy)14+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

AudioContext

In all current engines.

Firefox25+Safari14.1+Chrome35+
Opera?Edge79+
Edge (Legacy)12+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

AudioDestinationNode/maxChannelCount

In all current engines.

Firefox25+Safari14.1+Chrome27+
Opera?Edge79+
Edge (Legacy)12+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView37+Samsung Internet?Opera Mobile?
MDN

AudioDestinationNode

In all current engines.

Firefox25+Safari6+Chrome14+
Opera?Edge79+
Edge (Legacy)12+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView4.4.3+Samsung Internet?Opera Mobile?
MDN

AudioListener/forwardX

FirefoxNoneSafari14.1+Chrome52+
Opera?Edge79+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

AudioListener/forwardY

FirefoxNoneSafari14.1+Chrome52+
Opera?Edge79+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

AudioListener/forwardZ

FirefoxNoneSafari14.1+Chrome52+
Opera?Edge79+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

AudioListener/positionX

FirefoxNoneSafari14.1+Chrome52+
Opera?Edge79+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

AudioListener/positionY

FirefoxNoneSafari14.1+Chrome52+
Opera?Edge79+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

AudioListener/positionZ

FirefoxNoneSafari14.1+Chrome52+
Opera?Edge79+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

AudioListener/upX

FirefoxNoneSafari14.1+Chrome52+
Opera?Edge79+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

AudioListener/upY

FirefoxNoneSafari14.1+Chrome52+
Opera?Edge79+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

AudioListener/upZ

FirefoxNoneSafari14.1+Chrome52+
Opera?Edge79+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

AudioListener

In all current engines.

Firefox25+Safari6+Chrome14+
Opera?Edge79+
Edge (Legacy)12+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView4.4.3+Samsung Internet?Opera Mobile?
MDN

AudioNode/channelCount

In all current engines.

Firefox25+Safari7+Chrome27+
Opera?Edge79+
Edge (Legacy)12+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView37+Samsung Internet?Opera Mobile?
MDN

AudioNode/channelCountMode

In all current engines.

Firefox25+Safari7+Chrome27+
Opera?Edge79+
Edge (Legacy)12+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView37+Samsung Internet?Opera Mobile?
MDN

AudioNode/channelInterpretation

In all current engines.

Firefox25+Safari7+Chrome27+
Opera?Edge79+
Edge (Legacy)12+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView37+Samsung Internet?Opera Mobile?
MDN

AudioNode/connect

In all current engines.

Firefox25+Safari6+Chrome14+
Opera?Edge79+
Edge (Legacy)12+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView4.4.3+Samsung Internet?Opera Mobile?
MDN

AudioNode/connect

In all current engines.

Firefox25+Safari6+Chrome14+
Opera?Edge79+
Edge (Legacy)12+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView4.4.3+Samsung Internet?Opera Mobile?
MDN

AudioNode/context

In all current engines.

Firefox25+Safari6+Chrome14+
Opera?Edge79+
Edge (Legacy)12+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView4.4.3+Samsung Internet?Opera Mobile?
MDN

AudioNode/disconnect

In all current engines.

Firefox25+Safari6+Chrome14+
Opera?Edge79+
Edge (Legacy)12+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView4.4.3+Samsung Internet?Opera Mobile?
MDN

AudioNode/numberOfInputs

In all current engines.

Firefox25+Safari6+Chrome14+
Opera?Edge79+
Edge (Legacy)12+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView4.4.3+Samsung Internet?Opera Mobile?
MDN

AudioNode/numberOfOutputs

In all current engines.

Firefox25+Safari6+Chrome14+
Opera?Edge79+
Edge (Legacy)12+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView4.4.3+Samsung Internet?Opera Mobile?
MDN

AudioNode

In all current engines.

Firefox25+Safari6+Chrome14+
Opera?Edge79+
Edge (Legacy)12+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView4.4.3+Samsung Internet?Opera Mobile?
MDN

AudioParam/cancelAndHoldAtTime

FirefoxNoneSafari14.1+Chrome57+
Opera?Edge79+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

AudioParam/cancelScheduledValues

In all current engines.

Firefox25+Safari6+Chrome14+
Opera?Edge79+
Edge (Legacy)12+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView37+Samsung Internet?Opera Mobile?
MDN

AudioParam/defaultValue

In all current engines.

Firefox25+Safari6+Chrome14+
Opera?Edge79+
Edge (Legacy)12+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView37+Samsung Internet?Opera Mobile?
MDN

AudioParam/exponentialRampToValueAtTime

FirefoxNoneSafari6+Chrome14+
Opera?Edge79+
Edge (Legacy)12+IENone
Firefox for Android?iOS Safari?Chrome for AndroidNoneAndroid WebView37+Samsung Internet1.0+Opera Mobile14+
MDN

AudioParam/linearRampToValueAtTime

FirefoxNoneSafari6+Chrome14+
Opera?Edge79+
Edge (Legacy)12+IENone
Firefox for Android?iOS Safari?Chrome for AndroidNoneAndroid WebView37+Samsung Internet1.0+Opera Mobile14+
MDN

AudioParam/maxValue

In all current engines.

Firefox53+Safari6+Chrome52+
Opera?Edge79+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

AudioParam/minValue

In all current engines.

Firefox53+Safari6+Chrome52+
Opera?Edge79+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

AudioParam/setTargetAtTime

In all current engines.

Firefox25+Safari6+Chrome14+
Opera?Edge79+
Edge (Legacy)12+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView37+Samsung Internet?Opera Mobile?
MDN

AudioParam/setValueAtTime

In all current engines.

Firefox25+Safari6+Chrome14+
Opera?Edge79+
Edge (Legacy)12+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView37+Samsung Internet?Opera Mobile?
MDN

AudioParam/setValueCurveAtTime

In all current engines.

Firefox25+Safari6+Chrome14+
Opera?Edge79+
Edge (Legacy)12+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView37+Samsung Internet?Opera Mobile?
MDN

AudioParam/value

In all current engines.

Firefox25+Safari6+Chrome14+
Opera?Edge79+
Edge (Legacy)12+IENone
Firefox for Android25+iOS Safari?Chrome for Android?Android WebView37+Samsung Internet?Opera Mobile?
MDN

AudioParam

In all current engines.

Firefox25+Safari6+Chrome14+
Opera?Edge79+
Edge (Legacy)12+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView37+Samsung Internet?Opera Mobile?
MDN

AudioParamMap

In all current engines.

Firefox76+Safari14.1+Chrome66+
Opera?Edge79+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

AudioScheduledSourceNode/ended_event

In all current engines.

Firefox25+Safari7+Chrome30+
Opera?Edge79+
Edge (Legacy)12+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView37+Samsung Internet?Opera Mobile?
MDN

AudioScheduledSourceNode/start

In all current engines.

Firefox25+Safari7+Chrome24+
Opera?Edge79+
Edge (Legacy)12+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

AudioScheduledSourceNode/stop

In all current engines.

Firefox25+Safari7+Chrome24+
Opera?Edge79+
Edge (Legacy)12+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

AudioScheduledSourceNode

In all current engines.

Firefox53+Safari14+Chrome57+
Opera?Edge79+
Edge (Legacy)NoneIENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView57+Samsung Internet?Opera Mobile?
MDN

AudioSinkInfo/type

In only one current engine.

FirefoxNoneSafariNoneChrome110+
Opera?Edge110+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

AudioSinkInfo

In only one current engine.

FirefoxNoneSafariNoneChrome110+
Opera?Edge110+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

AudioWorklet

In all current engines.

Firefox76+Safari14.1+Chrome66+
Opera?Edge79+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

AudioWorkletGlobalScope/currentFrame

In all current engines.

Firefox76+Safari14.1+Chrome66+
Opera?Edge79+
Edge (Legacy)?IENone
Firefox for AndroidNoneiOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

AudioWorkletGlobalScope/currentTime

In all current engines.

Firefox76+Safari14.1+Chrome66+
Opera?Edge79+
Edge (Legacy)?IENone
Firefox for AndroidNoneiOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

AudioWorkletGlobalScope/registerProcessor

In all current engines.

Firefox76+Safari14.1+Chrome66+
Opera?Edge79+
Edge (Legacy)?IENone
Firefox for AndroidNoneiOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

AudioWorkletGlobalScope/sampleRate

In all current engines.

Firefox76+Safari14.1+Chrome66+
Opera?Edge79+
Edge (Legacy)?IENone
Firefox for AndroidNoneiOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

AudioWorkletGlobalScope

In all current engines.

Firefox76+Safari14.1+Chrome66+
Opera?Edge79+
Edge (Legacy)?IENone
Firefox for AndroidNoneiOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

AudioWorkletNode/AudioWorkletNode

In all current engines.

Firefox76+Safari14.1+Chrome66+
Opera?Edge79+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

AudioWorkletNode/parameters

In all current engines.

Firefox76+Safari14.1+Chrome66+
Opera?Edge79+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

AudioWorkletNode/port

In all current engines.

Firefox76+Safari14.1+Chrome66+
Opera?Edge79+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

AudioWorkletNode/processorerror_event

In all current engines.

Firefox76+Safari14.1+Chrome66+
Opera?Edge79+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

AudioWorkletNode

In all current engines.

Firefox76+Safari14.1+Chrome66+
Opera?Edge79+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

AudioWorkletProcessor/AudioWorkletProcessor

In all current engines.

Firefox76+Safari14.1+Chrome64+
Opera?Edge79+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

AudioWorkletProcessor/port

In all current engines.

Firefox76+Safari14.1+Chrome64+
Opera?Edge79+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

AudioWorkletProcessor

In all current engines.

Firefox76+Safari14.1+Chrome64+
Opera?Edge79+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

BaseAudioContext/audioWorklet

In all current engines.

Firefox76+Safari14.1+Chrome66+
Opera?Edge79+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

BaseAudioContext/createAnalyser

In all current engines.

Firefox25+Safari6+Chrome14+
Opera?Edge79+
Edge (Legacy)12+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView4.4.3+Samsung Internet?Opera Mobile?
MDN

BaseAudioContext/createBiquadFilter

In all current engines.

Firefox25+Safari6+Chrome14+
Opera?Edge79+
Edge (Legacy)12+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView4.4.3+Samsung Internet?Opera Mobile?
MDN

BaseAudioContext/createBuffer

In all current engines.

Firefox25+Safari6+Chrome14+
Opera?Edge79+
Edge (Legacy)12+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView4.4.3+Samsung Internet?Opera Mobile?
MDN

BaseAudioContext/createBufferSource

In all current engines.

Firefox25+Safari6+Chrome14+
Opera?Edge79+
Edge (Legacy)12+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView4.4.3+Samsung Internet?Opera Mobile?
MDN

BaseAudioContext/createChannelMerger

In all current engines.

Firefox25+Safari6+Chrome14+
Opera?Edge79+
Edge (Legacy)12+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView4.4.3+Samsung Internet?Opera Mobile?
MDN

BaseAudioContext/createChannelSplitter

In all current engines.

Firefox25+Safari6+Chrome14+
Opera?Edge79+
Edge (Legacy)12+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView4.4.3+Samsung Internet?Opera Mobile?
MDN

BaseAudioContext/createConstantSource

In all current engines.

Firefox52+Safari14.1+Chrome56+
Opera?Edge79+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

BaseAudioContext/createConvolver

In all current engines.

Firefox25+Safari6+Chrome14+
Opera?Edge79+
Edge (Legacy)12+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView4.4.3+Samsung Internet?Opera Mobile?
MDN

BaseAudioContext/createDelay

In all current engines.

Firefox25+Safari7+Chrome24+
Opera?Edge79+
Edge (Legacy)12+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView37+Samsung Internet?Opera Mobile?
MDN

BaseAudioContext/createDynamicsCompressor

In all current engines.

Firefox25+Safari6+Chrome14+
Opera?Edge79+
Edge (Legacy)12+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView4.4.3+Samsung Internet?Opera Mobile?
MDN

BaseAudioContext/createGain

In all current engines.

Firefox25+Safari7+Chrome24+
Opera?Edge79+
Edge (Legacy)12+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView37+Samsung Internet?Opera Mobile?
MDN

BaseAudioContext/createIIRFilter

In all current engines.

Firefox50+Safari14.1+Chrome49+
Opera?Edge79+
Edge (Legacy)14+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

BaseAudioContext/createOscillator

In all current engines.

Firefox25+Safari6+Chrome20+
Opera?Edge79+
Edge (Legacy)12+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

BaseAudioContext/createPanner

In all current engines.

Firefox25+Safari6+Chrome14+
Opera?Edge79+
Edge (Legacy)12+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView4.4.3+Samsung Internet?Opera Mobile?
MDN

BaseAudioContext/createPeriodicWave

In all current engines.

Firefox25+Safari8+Chrome30+
Opera?Edge79+
Edge (Legacy)12+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

BaseAudioContext/createStereoPanner

In all current engines.

Firefox37+Safari14.1+Chrome41+
Opera?Edge79+
Edge (Legacy)12+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

BaseAudioContext/createWaveShaper

In all current engines.

Firefox25+Safari6+Chrome15+
Opera?Edge79+
Edge (Legacy)12+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView4.4.3+Samsung Internet?Opera Mobile?
MDN

BaseAudioContext/currentTime

In all current engines.

Firefox25+Safari6+Chrome14+
Opera?Edge79+
Edge (Legacy)12+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView4.4.3+Samsung Internet?Opera Mobile?
MDN

BaseAudioContext/decodeAudioData

In all current engines.

Firefox25+Safari6+Chrome14+
Opera?Edge79+
Edge (Legacy)12+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView4.4.3+Samsung Internet?Opera Mobile?
MDN

BaseAudioContext/destination

In all current engines.

Firefox25+Safari6+Chrome14+
Opera?Edge79+
Edge (Legacy)12+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView4.4.3+Samsung Internet?Opera Mobile?
MDN

BaseAudioContext/listener

In all current engines.

Firefox25+Safari6+Chrome14+
Opera?Edge79+
Edge (Legacy)12+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView4.4.3+Samsung Internet?Opera Mobile?
MDN

BaseAudioContext/sampleRate

In all current engines.

Firefox25+Safari6+Chrome14+
Opera?Edge79+
Edge (Legacy)12+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView4.4.3+Samsung Internet?Opera Mobile?
MDN

BaseAudioContext/state

In all current engines.

Firefox40+Safari9+Chrome41+
Opera?Edge79+
Edge (Legacy)14+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

BaseAudioContext/statechange_event

In all current engines.

Firefox40+Safari9+Chrome41+
Opera?Edge79+
Edge (Legacy)14+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

BaseAudioContext

In all current engines.

Firefox53+Safari14.1+Chrome56+
Opera?Edge79+
Edge (Legacy)NoneIENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView56+Samsung Internet?Opera Mobile?
MDN

BiquadFilterNode/BiquadFilterNode

In all current engines.

Firefox53+Safari14.1+Chrome55+
Opera?Edge79+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

BiquadFilterNode/Q

In all current engines.

Firefox25+Safari6+Chrome14+
Opera?Edge79+
Edge (Legacy)12+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView4.4.3+Samsung Internet?Opera Mobile?
MDN

BiquadFilterNode/detune

In all current engines.

Firefox25+Safari7+Chrome25+
Opera?Edge79+
Edge (Legacy)12+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView37+Samsung Internet?Opera Mobile?
MDN

BiquadFilterNode/frequency

In all current engines.

Firefox25+Safari6+Chrome14+
Opera?Edge79+
Edge (Legacy)12+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView4.4.3+Samsung Internet?Opera Mobile?
MDN

BiquadFilterNode/gain

In all current engines.

Firefox25+Safari6+Chrome14+
Opera?Edge79+
Edge (Legacy)12+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView4.4.3+Samsung Internet?Opera Mobile?
MDN

BiquadFilterNode/getFrequencyResponse

In all current engines.

Firefox25+Safari6+Chrome17+
Opera?Edge79+
Edge (Legacy)12+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView4.4.3+Samsung Internet?Opera Mobile?
MDN

BiquadFilterNode/type

In all current engines.

Firefox25+Safari6+Chrome14+
Opera?Edge79+
Edge (Legacy)12+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView4.4.3+Samsung Internet?Opera Mobile?
MDN

BiquadFilterNode

In all current engines.

Firefox25+Safari6+Chrome14+
Opera?Edge79+
Edge (Legacy)12+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView4.4.3+Samsung Internet?Opera Mobile?
MDN

ChannelMergerNode/ChannelMergerNode

In all current engines.

Firefox53+Safari14.1+Chrome55+
Opera?Edge79+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

ChannelMergerNode

In all current engines.

Firefox25+Safari6+Chrome14+
Opera?Edge79+
Edge (Legacy)12+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView4.4.3+Samsung Internet?Opera Mobile?
MDN

ChannelSplitterNode/ChannelSplitterNode

In all current engines.

Firefox53+Safari14.1+Chrome55+
Opera?Edge79+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

ChannelSplitterNode

In all current engines.

Firefox25+Safari6+Chrome14+
Opera?Edge79+
Edge (Legacy)12+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView4.4.3+Samsung Internet?Opera Mobile?
MDN

ConstantSourceNode/ConstantSourceNode

In all current engines.

Firefox52+Safari14.1+Chrome56+
Opera?Edge79+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

ConstantSourceNode/offset

In all current engines.

Firefox52+Safari14.1+Chrome56+
Opera?Edge79+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

ConstantSourceNode

In all current engines.

Firefox52+Safari14.1+Chrome56+
Opera?Edge79+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

ConvolverNode/ConvolverNode

In all current engines.

Firefox53+Safari14.1+Chrome55+
Opera?Edge79+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

ConvolverNode/buffer

In all current engines.

Firefox25+Safari6+Chrome14+
Opera?Edge79+
Edge (Legacy)12+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView4.4.3+Samsung Internet?Opera Mobile?
MDN

ConvolverNode/normalize

In all current engines.

Firefox25+Safari6+Chrome18+
Opera?Edge79+
Edge (Legacy)12+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView4.4.3+Samsung Internet?Opera Mobile?
MDN

ConvolverNode

In all current engines.

Firefox25+Safari6+Chrome14+
Opera?Edge79+
Edge (Legacy)12+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView4.4.3+Samsung Internet?Opera Mobile?
MDN

DelayNode/DelayNode

In all current engines.

Firefox53+Safari14.1+Chrome55+
Opera?Edge79+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

DelayNode/delayTime

In all current engines.

Firefox25+Safari7+Chrome24+
Opera?Edge79+
Edge (Legacy)12+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView37+Samsung Internet?Opera Mobile?
MDN

DelayNode

In all current engines.

Firefox25+Safari7+Chrome24+
Opera?Edge79+
Edge (Legacy)12+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView37+Samsung Internet?Opera Mobile?
MDN

DynamicsCompressorNode/DynamicsCompressorNode

In all current engines.

Firefox53+Safari14.1+Chrome55+
Opera?Edge79+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

DynamicsCompressorNode/attack

In all current engines.

Firefox25+Safari6+Chrome19+
Opera?Edge79+
Edge (Legacy)12+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView37+Samsung Internet?Opera Mobile?
MDN

DynamicsCompressorNode/knee

In all current engines.

Firefox25+Safari6+Chrome19+
Opera?Edge79+
Edge (Legacy)12+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView37+Samsung Internet?Opera Mobile?
MDN

DynamicsCompressorNode/ratio

In all current engines.

Firefox25+Safari6+Chrome19+
Opera?Edge79+
Edge (Legacy)12+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView37+Samsung Internet?Opera Mobile?
MDN

DynamicsCompressorNode/reduction

In all current engines.

Firefox25+Safari6+Chrome19+
Opera15+Edge79+
Edge (Legacy)12+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView37+Samsung Internet1.0+Opera Mobile14+
MDN

DynamicsCompressorNode/release

In all current engines.

Firefox25+Safari6+Chrome20+
Opera?Edge79+
Edge (Legacy)12+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView37+Samsung Internet?Opera Mobile?
MDN

DynamicsCompressorNode/threshold

In all current engines.

Firefox25+Safari6+Chrome19+
Opera?Edge79+
Edge (Legacy)12+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView37+Samsung Internet?Opera Mobile?
MDN

DynamicsCompressorNode

In all current engines.

Firefox25+Safari6+Chrome14+
Opera?Edge79+
Edge (Legacy)12+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView4.4.3+Samsung Internet?Opera Mobile?
MDN

GainNode/GainNode

In all current engines.

Firefox53+Safari14.1+Chrome55+
Opera?Edge79+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

GainNode/gain

In all current engines.

Firefox25+Safari7+Chrome24+
Opera?Edge79+
Edge (Legacy)12+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView37+Samsung Internet?Opera Mobile?
MDN

GainNode

In all current engines.

Firefox25+Safari7+Chrome24+
Opera?Edge79+
Edge (Legacy)12+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView37+Samsung Internet?Opera Mobile?
MDN

IIRFilterNode/IIRFilterNode

In all current engines.

Firefox53+Safari14.1+Chrome55+
Opera?Edge79+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

IIRFilterNode/getFrequencyResponse

In all current engines.

Firefox50+Safari14.1+Chrome49+
Opera?Edge79+
Edge (Legacy)14+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

IIRFilterNode

In all current engines.

Firefox50+Safari14.1+Chrome49+
Opera?Edge79+
Edge (Legacy)14+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

MediaElementAudioSourceNode/MediaElementAudioSourceNode

In all current engines.

Firefox53+Safari14.1+Chrome55+
Opera?Edge79+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

MediaElementAudioSourceNode/mediaElement

In all current engines.

Firefox70+Safari6+Chrome15+
Opera?Edge79+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView37+Samsung Internet?Opera Mobile?
MDN

MediaElementAudioSourceNode

In all current engines.

Firefox25+Safari6+Chrome15+
Opera?Edge79+
Edge (Legacy)12+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView4.4.3+Samsung Internet?Opera Mobile?
MDN

MediaStreamAudioDestinationNode/MediaStreamAudioDestinationNode

In all current engines.

Firefox53+Safari14.1+Chrome57+
Opera?Edge79+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

MediaStreamAudioDestinationNode/stream

In all current engines.

Firefox25+Safari11+Chrome25+
Opera?Edge79+
Edge (Legacy)18IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView37+Samsung Internet?Opera Mobile?
MDN

MediaStreamAudioDestinationNode

In all current engines.

Firefox25+Safari11+Chrome25+
Opera?Edge79+
Edge (Legacy)18IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView37+Samsung Internet?Opera Mobile?
MDN

MediaStreamAudioSourceNode/MediaStreamAudioSourceNode

In all current engines.

Firefox53+Safari14.1+Chrome55+
Opera?Edge79+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

MediaStreamAudioSourceNode/mediaStream

In all current engines.

Firefox70+Safari11+Chrome22+
Opera?Edge79+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

MediaStreamAudioSourceNode

In all current engines.

Firefox25+Safari11+Chrome22+
Opera?Edge79+
Edge (Legacy)12+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

MediaStreamTrackAudioSourceNode/MediaStreamTrackAudioSourceNode

In only one current engine.

Firefox68+SafariNoneChromeNone
Opera?EdgeNone
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

MediaStreamTrackAudioSourceNode

In only one current engine.

Firefox68+SafariNoneChromeNone
Opera?EdgeNone
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

OfflineAudioCompletionEvent/OfflineAudioCompletionEvent

In all current engines.

Firefox53+Safari14+Chrome57+
Opera?Edge79+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

OfflineAudioCompletionEvent/renderedBuffer

In all current engines.

Firefox25+Safari6+Chrome14+
Opera?Edge79+
Edge (Legacy)12+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView37+Samsung Internet?Opera Mobile?
MDN

OfflineAudioCompletionEvent

In all current engines.

Firefox25+Safari6+Chrome14+
Opera?Edge79+
Edge (Legacy)12+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView37+Samsung Internet?Opera Mobile?

OfflineAudioContext/complete_event

In all current engines.

Firefox25+Safari7+Chrome25+
Opera?Edge79+
Edge (Legacy)12+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

OfflineAudioContext/OfflineAudioContext

In all current engines.

Firefox25+Safari14.1+Chrome35+
Opera?Edge79+
Edge (Legacy)12+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

OfflineAudioContext/complete_event

In all current engines.

Firefox25+Safari7+Chrome25+
Opera?Edge79+
Edge (Legacy)12+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

OfflineAudioContext/length

In all current engines.

Firefox49+Safari14.1+Chrome51+
Opera?Edge79+
Edge (Legacy)14+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

OfflineAudioContext/resume

In all current engines.

Firefox40+Safari9+Chrome41+
Opera?Edge79+
Edge (Legacy)14+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

OfflineAudioContext/startRendering

In all current engines.

Firefox25+Safari7+Chrome25+
Opera?Edge79+
Edge (Legacy)12+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

OfflineAudioContext/suspend

FirefoxNoneSafari9+Chrome41+
Opera?Edge79+
Edge (Legacy)14+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

OfflineAudioContext

In all current engines.

Firefox25+Safari14.1+Chrome35+
Opera?Edge79+
Edge (Legacy)12+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

OscillatorNode/OscillatorNode

In all current engines.

Firefox53+Safari14.1+Chrome55+
Opera?Edge79+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

OscillatorNode/detune

In all current engines.

Firefox25+Safari6+Chrome20+
Opera?Edge79+
Edge (Legacy)12+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

OscillatorNode/frequency

In all current engines.

Firefox25+Safari6+Chrome20+
Opera?Edge79+
Edge (Legacy)12+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

OscillatorNode/setPeriodicWave

In all current engines.

Firefox25+Safari8+Chrome30+
Opera?Edge79+
Edge (Legacy)12+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView37+Samsung Internet?Opera Mobile?
MDN

OscillatorNode/type

In all current engines.

Firefox25+Safari6+Chrome20+
Opera?Edge79+
Edge (Legacy)12+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

OscillatorNode

In all current engines.

Firefox25+Safari6+Chrome20+
Opera?Edge79+
Edge (Legacy)12+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

PannerNode/PannerNode

In all current engines.

Firefox53+Safari14.1+Chrome55+
Opera?Edge79+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

PannerNode/coneInnerAngle

In all current engines.

Firefox25+Safari6+Chrome14+
Opera?Edge79+
Edge (Legacy)12+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView4.4.3+Samsung Internet?Opera Mobile?
MDN

PannerNode/coneOuterAngle

In all current engines.

Firefox25+Safari6+Chrome14+
Opera?Edge79+
Edge (Legacy)12+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView4.4.3+Samsung Internet?Opera Mobile?
MDN

PannerNode/coneOuterGain

In all current engines.

Firefox25+Safari6+Chrome14+
Opera?Edge79+
Edge (Legacy)12+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView4.4.3+Samsung Internet?Opera Mobile?
MDN

PannerNode/distanceModel

In all current engines.

Firefox25+Safari6+Chrome14+
Opera?Edge79+
Edge (Legacy)12+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView4.4.3+Samsung Internet?Opera Mobile?
MDN

PannerNode/maxDistance

In all current engines.

Firefox25+Safari6+Chrome14+
Opera?Edge79+
Edge (Legacy)12+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView4.4.3+Samsung Internet?Opera Mobile?
MDN

PannerNode/orientationX

In all current engines.

Firefox50+Safari14.1+Chrome52+
Opera?Edge79+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

PannerNode/orientationY

In all current engines.

Firefox50+Safari14.1+Chrome52+
Opera?Edge79+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

PannerNode/orientationZ

In all current engines.

Firefox50+Safari14.1+Chrome52+
Opera?Edge79+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

PannerNode/panningModel

In all current engines.

Firefox25+Safari6+Chrome14+
Opera?Edge79+
Edge (Legacy)12+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView4.4.3+Samsung Internet?Opera Mobile?
MDN

PannerNode/positionX

In all current engines.

Firefox50+Safari14.1+Chrome52+
Opera?Edge79+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

PannerNode/positionY

In all current engines.

Firefox50+Safari14.1+Chrome52+
Opera?Edge79+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

PannerNode/positionZ

In all current engines.

Firefox50+Safari14.1+Chrome52+
Opera?Edge79+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

PannerNode/refDistance

In all current engines.

Firefox25+Safari6+Chrome14+
Opera?Edge79+
Edge (Legacy)12+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView4.4.3+Samsung Internet?Opera Mobile?
MDN

PannerNode/rolloffFactor

In all current engines.

Firefox25+Safari6+Chrome14+
Opera?Edge79+
Edge (Legacy)12+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView4.4.3+Samsung Internet?Opera Mobile?
MDN

PannerNode

In all current engines.

Firefox25+Safari6+Chrome14+
Opera?Edge79+
Edge (Legacy)12+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView4.4.3+Samsung Internet?Opera Mobile?
MDN

PeriodicWave/PeriodicWave

In all current engines.

Firefox53+Safari14.1+Chrome55+
Opera?Edge79+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

PeriodicWave

In all current engines.

Firefox25+Safari8+Chrome30+
Opera?Edge79+
Edge (Legacy)12+IENone
Firefox for Android26+iOS Safari?Chrome for Android?Android WebView37+Samsung Internet?Opera Mobile?
MDN

StereoPannerNode/StereoPannerNode

In all current engines.

Firefox53+Safari14.1+Chrome55+
Opera?Edge79+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

StereoPannerNode/pan

In all current engines.

Firefox37+Safari14.1+Chrome41+
Opera?Edge79+
Edge (Legacy)12+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

StereoPannerNode

In all current engines.

Firefox37+Safari14.1+Chrome41+
Opera?Edge79+
Edge (Legacy)12+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

WaveShaperNode/WaveShaperNode

In all current engines.

Firefox53+Safari14.1+Chrome55+
Opera?Edge79+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

WaveShaperNode/curve

In all current engines.

Firefox25+Safari6+Chrome15+
Opera?Edge79+
Edge (Legacy)12+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView4.4.3+Samsung Internet?Opera Mobile?
MDN

WaveShaperNode/oversample

In all current engines.

Firefox26+Safari6+Chrome29+
Opera?Edge79+
Edge (Legacy)12+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView37+Samsung Internet?Opera Mobile?
MDN

WaveShaperNode

In all current engines.

Firefox25+Safari6+Chrome15+
Opera?Edge79+
Edge (Legacy)12+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView4.4.3+Samsung Internet?Opera Mobile?