Web Audio API 1.1

W3C 作業草案,

この文書の詳細
このバージョン:
https://www.w3.org/TR/2026/WD-webaudio-1.1-20260922/
最新の公開バージョン:
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://wpt.fyi/results/webaudio?label=experimental&label=master&aligned
テストスイート:
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 アプリケーションでオーディオを処理および合成するための高水準 Web API について記述します。 主なパラダイムはオーディオルーティンググラフであり、 複数の AudioNode オブジェクトを相互に接続して、オーディオレンダリング全体を定義します。 実際の処理は主として基盤となる実装 (通常は最適化された Assembly / C / C++ コード)で行われますが、 スクリプトによる直接処理と合成もサポートされています。

はじめにの節では、この仕様の背景にある動機について説明します。

この API は、Web プラットフォーム上の他の API や要素と組み合わせて使用するように設計されており、特に以下が挙げられます: XMLHttpRequest [XHR] (responseType および response 属性を使用)。 ゲームや対話型アプリケーションでは、 canvas 2D [2dcontext] および WebGL [WEBGL] 3D グラフィックス API とともに使用されることが想定されています。

この文書のステータス

この節では、この文書の公開時点でのステータスについて説明します。現在の W3C 公開文書の一覧と、この技術報告書の最新改訂版は、W3C 標準および草案の索引で確認できます。

この文書は、 Web Audio ワーキンググループによって、 勧告 トラックを使用する作業草案として公開されました。この文書は W3C 勧告となることを意図しています。

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

作業草案としての公開は、 W3C およびそのメンバーによる承認を意味するものではありません。これは草案文書であり、いつでも 他の文書によって更新、置換、または 廃止される可能性があります。この文書を 作業中の文書以外のものとして引用することは適切ではありません。

この文書は、W3C 特許ポリシーの下で活動するグループによって作成されました。W3C は、グループの成果物に関連して行われた特許開示の公開一覧を管理しています。このページには、特許を開示するための手順も含まれています。必須クレームを含むと考えられる特許について実際に知識を有する個人は、W3C 特許ポリシーの第6節に従って その情報を開示しなければなりません。

この文書は、2025年8月18日版 W3C プロセス文書に準拠します。

はじめに

これまで Web 上のオーディオはかなり原始的であり、ごく 最近まで Flash や QuickTime などのプラグインを通じて提供する必要がありました。 HTML5 に audio 要素が導入されたことは 非常に重要であり、基本的なストリーミングオーディオ再生が可能になりました。しかし、 より複雑なオーディオアプリケーションを扱うには十分な機能がありません。 高度な Web ベースのゲームや対話型アプリケーションには、別の 解決策が必要です。この仕様の目標は、現代のゲームオーディオエンジンに見られる 機能に加えて、現代の デスクトップオーディオ制作アプリケーションに見られるミキシング、処理、フィルタリング処理の一部を 含めることです。

API は、さまざまなユースケース [webaudio-usecases] を念頭に置いて設計されています。理想的には、 スクリプトによって制御され、ブラウザーで実行される 最適化された C++ エンジンで合理的に実装可能な あらゆるユースケースをサポートできる必要があります。とはいえ、 現代のデスクトップオーディオソフトウェアは非常に高度な 機能を備えている場合があり、その一部はこのシステムで構築することが 困難または不可能です。Apple の Logic Audio はそのようなアプリケーションの一つであり、 外部 MIDI コントローラー、任意のプラグインオーディオエフェクト およびシンセサイザー、高度に最適化されたディスクへの直接オーディオファイル 読み書き、緊密に統合されたタイムストレッチなどをサポートしています。 それでも、提案されているシステムは、 音楽関連のものを含む、かなり複雑なゲームや対話型アプリケーションの 広い範囲を十分にサポートできます。また、 WebGL が提供するより高度なグラフィックス機能を非常によく補完できます。API は、 後からより高度な機能を追加できるように 設計されています。

機能

API は次の主要な機能をサポートします:

モジュール式ルーティング

モジュール式ルーティングでは、異なる AudioNode オブジェクト間を任意に接続できます。各ノードは 入力および/または 出力を持つことができます。 ソースノードは入力を持たず、 1 つの出力を持ちます。 デスティネーションノード は 1 つの入力を持ち、出力を持ちません。フィルターなどの他のノードは、 ソースノードとデスティネーションノードの間に配置できます。 2 つのオブジェクトを接続するとき、開発者は低水準のストリーム形式の 詳細を気にする必要はありません。 適切な処理が自動的に行われます。 たとえば、モノラルオーディオストリームを ステレオ入力に接続すると、左右のチャンネルへ 適切にミックスされます。

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

モジュール式ルーティング
モジュール式ルーティングの単純な例。

この単純なルーティングを示す、単一のサウンドを再生する簡単な例を次に示します:

const context = new AudioContext();

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

3 つのソースと、最終出力段にダイナミクスコンプレッサーを備えた 畳み込みリバーブセンドを使用する、より複雑な例を次に示します:

モジュール式ルーティング2
モジュール式ルーティングのより複雑な例。
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();    // エフェクトノードを作成する。    lowpassFilter = context.createBiquadFilter();    waveShaper = context.createWaveShaper();    panner = context.createPanner();    compressor = context.createDynamicsCompressor();    reverb = context.createConvolver();    // メインのウェットとドライを作成する。    mainDry = context.createGain();    mainWet = context.createGain();    // 最終コンプレッサーを最終デスティネーションに接続する。    compressor.connect(context.destination);    // メインのドライとウェットをコンプレッサーに接続する。    mainDry.connect(compressor);    mainWet.connect(compressor);    // リバーブをメインのウェットに接続する。    reverb.connect(mainWet);    // いくつかのソースを作成する。    source1 = context.createBufferSource();    source2 = context.createBufferSource();    source3 = context.createOscillator();    source1.buffer = manTalkingBuffer;    source2.buffer = footstepsBuffer;    source3.frequency.value = 440;    // source1 を接続する    dry1 = context.createGain();    wet1 = context.createGain();    source1.connect(lowpassFilter);    lowpassFilter.connect(dry1);    lowpassFilter.connect(wet1);    dry1.connect(mainDry);    wet1.connect(reverb);    // source2 を接続する    dry2 = context.createGain();    wet2 = context.createGain();    source2.connect(waveShaper);    waveShaper.connect(dry2);    waveShaper.connect(wet2);    dry2.connect(mainDry);    wet2.connect(reverb);    // source3 を接続する    dry3 = context.createGain();    wet3 = context.createGain();    source3.connect(panner);    panner.connect(dry3);    panner.connect(wet3);    dry3.connect(mainDry);    wet3.connect(reverb);    // ソースを今すぐ開始する。    source1.start(0);    source2.start(0);    source3.start(0);}

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

モジュール式ルーティング3
1 つのオシレーターが別のオシレーターの 周波数を変調するモジュール式ルーティング。
function setupRoutingGraph() {    const context = new AudioContext();    // 変調信号を供給する低周波オシレーターを作成する    const lfo = context.createOscillator();    lfo.frequency.value = 1.0;    // 変調される高周波オシレーターを作成する    const hfo = context.createOscillator();    hfo.frequency.value = 440.0;    // ゲインによって変調信号の振幅が決まるゲインノードを作成する    const modulationGain = context.createGain();    modulationGain.gain.value = 50;    // グラフを構成し、オシレーターを開始する    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 は、最初は空である Promise の順序付きリストである 内部スロット [[pending promises]] を持って作成されます。

各 BaseAudioContext は一意の メディア要素イベントタスクソースを持ちます。 さらに、BaseAudioContext は、AudioContextState の値を取り、どちらも最初は "suspended" に設定される、複数のプライベートスロット [[rendering thread state]] および [[control thread state]] と、 同じく AudioContextState の値を取り、最初は null に設定される [[state before interruption]] 、および符号なし整数であるプライベートスロット [[render quantum size]] を持ちます。

enum AudioContextState {
    "suspended",
    "running",
    "closed",
    "interrupted"
};
AudioContextState 列挙型の説明
列挙値 説明
"suspended" このコンテキストは現在一時停止中です(コンテキスト時間は 進行しておらず、オーディオハードウェアは電源を切られているか解放されている場合があります)。
"running" オーディオが処理されています。
"closed" このコンテキストは解放されており、オーディオの処理には これ以上使用できません。すべてのシステムオーディオリソースが解放されています。
"interrupted" このコンテキストは現在中断されており、中断が終了するまでオーディオを処理できません。
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、 読み取り専用

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

currentTime, 型は double、読み取り専用

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

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

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

BaseAudioContext が "running" 状態にある場合、この属性の値は単調増加し、 レンダリングスレッドによって一定の増分で更新されます。 これは 1 つのレンダー量子に対応します。したがって、実行中の コンテキストでは、システムがオーディオブロックを処理するにつれて currentTime は着実に増加し、 常に次に処理されるオーディオブロックの開始時刻を 表します。また、現在の状態でスケジュールされた変更が 効果を発揮し得る最も早い時刻でもあります。

currentTime は返される前に、制御スレッド上でアトミックに読み取られなければなりません。

destination, 型は AudioDestinationNode、読み取り専用

すべてのオーディオの最終デスティネーションを表す単一の入力を持つ AudioDestinationNode です。通常、これは実際のオーディオハードウェアを表します。 オーディオを実際にレンダリングしているすべての AudioNode は、直接または間接的に destination に接続されます。

listener, 型は AudioListener、 読み取り専用

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

onstatechange, 型は EventHandler

AudioContext の状態が変更されたとき(すなわち、 対応する Promise が解決されるとき)に BaseAudioContext へ配送されるイベントのイベントハンドラーを設定するために使用されるプロパティです。 このイベントハンドラーのイベント型は、 statechange です。 Event インターフェイスを使用するイベントがイベント ハンドラーへ配送され、ハンドラーは AudioContext の状態を直接照会できます。 新しく作成された AudioContext は常に suspended 状態から開始し、状態が別の状態へ変化するたびに 状態変更イベントが発火します。この イベントは complete イベントが発火する前に発火します。

sampleRate, 型は float、読み取り専用

BaseAudioContext がオーディオを扱うサンプルレート(1 秒あたりのサンプルフレーム数)です。 コンテキスト内のすべての AudioNode はこのレートで動作すると想定されます。この想定により、 リアルタイム処理ではサンプルレートコンバーターや "varispeed" プロセッサーは サポートされません。 ナイキスト周波数は、このサンプルレート値の半分です。

state, 型は AudioContextState、読み取り専用

BaseAudioContext の現在の状態を記述します。この 属性を取得すると、[[control thread state]] スロットの内容が返されます。

renderQuantumSize, 型は unsigned long、読み取り専用

この属性を取得すると、[[render quantum size]] スロットの値が返されます。

1.1.2. メソッド

createAnalyser()

AnalyserNode のファクトリーメソッドです。

パラメーターなし。
戻り値の型: AnalyserNode
createBiquadFilter()

複数の一般的なフィルター型のいずれかとして構成できる 2 次フィルターを表す BiquadFilterNode のファクトリーメソッドです。

パラメーターなし。
戻り値の型: BiquadFilterNode
createBuffer(numberOfChannels, length, sampleRate)

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

BaseAudioContext.createBuffer() メソッドの引数。
パラメーター 型 null 許容 省略可能 説明
numberOfChannels unsigned long ✘ ✘ バッファーが持つチャンネル数を決定します。実装は少なくとも 32 チャンネルをサポートしなければなりません。
length unsigned long ✘ ✘ バッファーのサイズをサンプルフレーム単位で決定します。これは少なくとも 1 でなければなりません。
sampleRate float ✘ ✘ バッファー内のリニア PCM オーディオデータのサンプルレートを、 1 秒あたりのサンプルフレーム数で記述します。必要なサポート範囲については、 § 2.4 サポートされるサンプルレートを参照してください。
戻り値の型: AudioBuffer
createBufferSource()

AudioBufferSourceNode のファクトリーメソッドです。

パラメーターなし。
戻り値の型: AudioBufferSourceNode
createChannelMerger(numberOfInputs)

チャンネルマージャーを表す ChannelMergerNode のファクトリーメソッドです。 numberOfInputs が 1 未満、またはサポートされるチャンネル数を超える場合、 IndexSizeError 例外を投げなければなりません。

BaseAudioContext.createChannelMerger(numberOfInputs) メソッドの引数。
パラメーター 型 null 許容 省略可能 説明
numberOfInputs unsigned long ✘ ✔ 入力数を決定します。32 までの値をサポートしなければなりません。指定されない場合、 6 が使用されます。
戻り値の型: ChannelMergerNode
createChannelSplitter(numberOfOutputs)

チャンネルスプリッターを表す ChannelSplitterNode のファクトリーメソッドです。 numberOfOutputs が 1 未満、またはサポートされるチャンネル数を超える場合、 IndexSizeError 例外を投げなければなりません。

BaseAudioContext.createChannelSplitter(numberOfOutputs) メソッドの引数。
パラメーター 型 null 許容 省略可能 説明
numberOfOutputs unsigned long ✘ ✔ 出力数です。32 までの値をサポートしなければなりません。指定されない場合、 6 が使用されます。
戻り値の型: ChannelSplitterNode
createConstantSource()

ConstantSourceNode のファクトリーメソッドです。

パラメーターなし。
戻り値の型: ConstantSourceNode
createConvolver()

ConvolverNode のファクトリーメソッドです。

パラメーターなし。
戻り値の型: ConvolverNode
createDelay(maxDelayTime)

DelayNode のファクトリーメソッドです。 初期の既定の 遅延時間は 0 秒です。

BaseAudioContext.createDelay(maxDelayTime) メソッドの引数。
パラメーター 型 null 許容 省略可能 説明
maxDelayTime double ✘ ✔ ディレイラインで許容される最大遅延時間を秒単位で指定します。指定する場合、この値は 0 より大きく 3 分未満でなければならず、 そうでなければ NotSupportedError 例外を投げなければなりません。 指定されない場合、1 が使用されます。
戻り値の型: DelayNode
createDynamicsCompressor()

DynamicsCompressorNode のファクトリーメソッドです。

パラメーターなし。
戻り値の型: DynamicsCompressorNode
createGain()

GainNode のファクトリーメソッドです。

パラメーターなし。
戻り値の型: GainNode
createIIRFilter(feedforward, feedback)
BaseAudioContext.createIIRFilter() メソッドの引数。
パラメーター 型 null 許容 省略可能 説明
feedforward sequence<double> ✘ ✘ IIR フィルターの伝達関数の フィードフォワード(分子)係数の配列です。この配列の最大長は 20 です。すべての値が 0 の場合、InvalidStateError を投げなければなりません。配列長が 0 または 20 より大きい場合、NotSupportedError を投げなければなりません。
feedback sequence<double> ✘ ✘ IIR フィルターの伝達関数のフィードバック(分母)係数の配列です。 この配列の最大長は 20 です。配列の最初の要素が 0 の場合、 InvalidStateError を投げなければなりません。配列長が 0 または 20 より大きい場合、NotSupportedError を投げなければなりません。
戻り値の型: IIRFilterNode
createOscillator()

OscillatorNode のファクトリーメソッドです。

パラメーターなし。
戻り値の型: OscillatorNode
createPanner()

PannerNode のファクトリーメソッドです。

パラメーターなし。
戻り値の型: PannerNode
createPeriodicWave(real, imag, constraints)

PeriodicWave を作成するファクトリーメソッドです。

このメソッドを呼び出すときは、 次の手順を実行します:
  1. real と imag の長さが同じでない場合、 IndexSizeError を投げなければなりません。

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

  3. このファクトリーメソッドに渡された real および imag パラメーターを、それぞれ o 上の 同名の属性に設定します。

  4. o の disableNormalization 属性を、 ファクトリーメソッドに渡された constraints 属性の disableNormalization 属性の値に設定します。

  5. 新しい PeriodicWave p を構築し、このファクトリー メソッドが呼び出された BaseAudioContext を第 1 引数として、さらに o を渡します。

  6. p を返します。

BaseAudioContext.createPeriodicWave() メソッドの引数。
パラメーター 型 null 許容 省略可能 説明
real sequence<float> ✘ ✘ 余弦パラメーターのシーケンスです。より詳しい説明については、 real コンストラクター引数を参照してください。
imag sequence<float> ✘ ✘ 正弦パラメーターのシーケンスです。より詳しい説明については、 imag コンストラクター引数を参照してください。
constraints PeriodicWaveConstraints ✘ ✔ 指定されない場合、波形は正規化されます。それ以外の場合、波形は constraints で指定された値に従って正規化されます。
戻り値の型: PeriodicWave
createScriptProcessor(bufferSize, numberOfInputChannels, numberOfOutputChannels)

ScriptProcessorNode のファクトリーメソッドです。 このメソッドは、AudioWorkletNode に置き換えられることを意図しているため、非推奨です。 スクリプトを使用してオーディオを直接処理するための ScriptProcessorNode を作成します。 bufferSize または numberOfInputChannels または numberOfOutputChannels が有効範囲外の場合、 IndexSizeError 例外を投げなければなりません。

numberOfInputChannels と numberOfOutputChannels の両方を 0 にすることは無効です。 この場合、IndexSizeError 例外を投げなければなりません。

BaseAudioContext.createScriptProcessor(bufferSize, numberOfInputChannels, numberOfOutputChannels) メソッドの引数。
パラメーター 型 null 許容 省略可能 説明
bufferSize unsigned long ✘ ✔ bufferSize パラメーターは、サンプルフレーム単位でバッファーサイズを決定します。渡されない場合、 または値が 0 の場合、実装は 指定された環境に最適なバッファーサイズを選択します。この値は ノードの存続期間を通じて一定の 2 の累乗になります。それ以外の場合、作者が明示的に bufferSize を指定するなら、 次のいずれかの値でなければなりません: 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 に含まれるオーディオファイルデータを非同期にデコードします。 ArrayBuffer は、たとえば responseType を "arraybuffer" に設定した後、 XMLHttpRequest の response 属性から読み込むことができます。オーディオ ファイルデータは、 audio 要素がサポートする任意の形式にできます。 decodeAudioData() に渡されるバッファーの content-type は、[mimesniff] に記述されているとおり、スニッフィングによって決定されます。

この関数とやり取りする主な方法は Promise の戻り値を介するものですが、コールバックパラメーターは レガシー上の理由で提供されています。

ファイルが破損している場合、実装が作者へ警告することが推奨されます。 これは破壊的変更になるため、例外を投げることはできません。

注: 圧縮オーディオデータのバイトストリームが破損しているものの、 デコード自体は続行できる場合、実装は たとえば開発者ツールを通じて作者へ警告することが推奨されます。
decodeAudioData が 呼び出されたとき、次の手順を制御 スレッド上で実行しなければなりません:
  1. this の関連するグローバルオブジェクトの関連付けられた Document が完全にアクティブでない場合、 "InvalidStateError" DOMException で拒否された Promiseを返します。

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

  3. audioData が切り離されていない場合、次の手順を実行します:

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

    2. audioData ArrayBuffer を切り離します。 この操作が例外を投げた場合、手順 4.1 へ移動します。

    3. 別のスレッドで実行するデコード操作をキューに入れます。

  4. それ以外の場合、次のエラー手順を実行します:

    1. error を DataCloneError とします。

    2. promise を error で拒否し、 [[pending promises]] から削除します。

    3. メディア要素タスクをキューに入れ、errorCallback を error とともに呼び出します。

  5. promise を返します。

別のスレッドで実行するデコード操作をキューに入れるとき、 次の手順は制御スレッド でもレンダリング スレッドでもないスレッド上で実行しなければならず、 これを デコードスレッド と呼びます。

注: 複数の デコードスレッドを 並列に実行して、 decodeAudioData の複数の呼び出しを処理できます。

  1. can decode を、最初は true に設定されたブーリアンフラグとします。

  2. audioData の MIME 型を、 MIME スニッフィング § 6.2 オーディオまたは動画型パターンへのマッチングを使用して 判定することを試みます。オーディオ または動画型パターンマッチングアルゴリズムが undefined を返した場合、can decode を false に設定します。

  3. can decode が true の場合、エンコードされた audioData をリニア PCMへ デコードすることを試みます。 失敗した場合、can decode を false に設定します。

    メディアバイトストリームに複数のオーディオトラックが含まれている場合、 最初のトラックだけをリニア PCMへデコードします。

    注: デコード処理をより細かく制御する必要がある 作者は、 [WEBCODECS] を使用できます。

  4. can decode が false の場合、 メディア要素タスクをキューに入れ、次の手順を実行します:

    1. error を、名前が EncodingError である DOMException とします。

      1. promise を error で拒否し、 [[pending promises]] から削除します。

    2. errorCallback が 欠けていない場合、errorCallback を error とともに呼び出します。

  5. それ以外の場合:

    1. デコードされたリニア PCM オーディオデータを表す結果を取得し、 そのサンプルレートが audioData のサンプルレートと異なる場合は、 BaseAudioContext のサンプルレートへリサンプリングします。

    2. メディア要素タスクをキューに入れ、次の手順を実行します:

      1. buffer を、 最終結果 (必要に応じてサンプルレート変換を実行した後)を含む AudioBuffer とします。

      2. promise を buffer で解決します。

      3. successCallback が欠けていない場合、 successCallback を buffer とともに呼び出します。

BaseAudioContext.decodeAudioData() メソッドの引数。
パラメーター 型 null 許容 省略可能 説明
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 は、コストの高いオブジェクトと見なすべきです。これらのオブジェクトの作成では、 優先度の高いスレッドの作成や、低レイテンシーの システムオーディオストリームの使用が伴う場合があり、どちらもエネルギー消費に影響します。 通常、1 つの文書内に複数の AudioContext を作成する必要はありません。

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

さらに、ユーザーエージェントは、実装で定義された AudioContext の最大数を持つことができ、それを超えて 新しい AudioContext を作成しようとすると失敗し、NotSupportedError を投げます。

suspend および close により、作者はスレッド、 プロセス、およびオーディオストリームを含むシステム リソースを解放できます。BaseAudioContext を一時停止すると、実装はそのリソースの一部を解放でき、 後で resume を呼び出すことによって動作を続けられます。 AudioContext を閉じると、実装はそのすべての リソースを解放でき、その後は再び使用または再開できなくなります。

注: たとえば、これには オーディオコールバックが定期的に 発火するのを待つことや、ハードウェアが 処理可能になるまで待つことが含まれる場合があります。

1.2. AudioContext インターフェイス

このインターフェイスは、その AudioDestinationNode が、ユーザーに向けた信号を生成するリアルタイムの 出力デバイスへルーティングされるオーディオグラフを表します。ほとんどの ユースケースでは、文書ごとに 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;
    attribute EventHandler onsinkchange;
    attribute EventHandler onerror;
    [SameObject] readonly attribute AudioPlaybackStats playbackStats;
    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 です。初期値は "" であり、これは既定のオーディオ出力 デバイスを意味します。

[[sink ID at construction]]

構築時に要求されたオーディオ出力デバイスの識別子または情報を それぞれ表す、DOMString または AudioSinkInfo です。初期値は "" であり、これは 既定のオーディオ出力デバイスを意味します。

[[pending resume promises]]

resume() によって作成された保留中の Promise を保存するための順序付きリストです。 最初は空です。

[[playback stats]]

AudioPlaybackStats のインスタンスが保存されるスロット。

1.2.1. コンストラクター

AudioContext(contextOptions)

現在の設定オブジェクトの関連するグローバルオブジェクトの 関連付けられた Document が完全にアクティブでない場合、 "InvalidStateError" を投げて、これらの手順を中止します。

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

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

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

  4. context の [[state before interruption]] を null に設定します。

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

  6. controlSidePort を messageChannel の port1 属性の値とします。

  7. renderingSidePort を messageChannel の port2 属性の値とします。

  8. serializedRenderingSidePort を StructuredSerializeWithTransfer(renderingSidePort, « renderingSidePort ») の結果とします。

  9. この audioWorklet の port を controlSidePort に設定します。

  10. serializedRenderingSidePort とともに、 AudioContextGlobalScope 上の MessagePort を設定するための 制御メッセージをキューに入れます。

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

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

      1. sinkId と [[sink ID]] の両方が DOMString 型で、 かつ互いに等しい場合、この サブ手順を中止します。

      2. sinkId が AudioSinkOptions 型で、 [[sink ID]] が AudioSinkInfo 型であり、 sinkId 内の type と [[sink ID]] 内の type が等しい場合、このサブ手順を中止します。

      3. sinkId が DOMString 型の場合、 [[sink ID at construction]] を sinkId に設定し、この サブ手順を中止します。

      4. sinkId が AudioSinkOptions 型の場合、 [[sink ID at construction]] を、sinkId の type の値で作成された新しい AudioSinkInfo インスタンスに設定します。

    2. context の内部レイテンシーを、 latencyHint で説明されているとおり、 contextOptions.latencyHint に従って設定します。

    3. contextOptions.sampleRate が指定されている場合、context の sampleRate をこの値に設定します。それ以外の場合、次のサブ手順に従います:

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

      2. sinkId が DOMString の場合、sinkId によって識別される 出力デバイスのサンプルレートを使用します。このサブ手順を中止します。

      contextOptions.sampleRate が出力デバイスのサンプルレートと異なる場合、ユーザーエージェントは オーディオ出力を出力デバイスのサンプルレートに一致するよう リサンプリングしなければなりません。

      注: リサンプリングが 必要な場合、context のレイテンシーが、 場合によっては大幅に影響を受ける可能性があります。

    4. context の [[render quantum size]] を、 contextOptions.renderSizeHint の値に基づいて設定します:

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

      2. それ以外で、値が "hardware" の場合、 [[render quantum size]] プライベートスロットを 0 に設定します。

      3. それ以外で、整数が渡されている場合、その値が § 2.5 サポートされるレンダー量子 サイズで指定された範囲外なら、 NotSupportedError を投げなければなりません。それ以外の場合、[[render quantum size]] プライベートスロットを渡された値に設定します。

  12. context が開始を許可されている場合、処理を開始するための 制御 メッセージを送信します。

  13. [[playback stats]] を新しい AudioPlaybackStats インスタンスに設定します。

  14. context を返します。

処理を開始するために制御 メッセージを送信するとは、 次の手順を実行することを意味します:
  1. validationResult を、[[sink ID at construction]] のシンク識別子の検証 の戻り値とします。

  2. validationResult が false の場合、次の手順を実行します:

    1. [[sink ID]] を空文字列に設定します。

    2. メディア要素タスクをキューに入れ、 error という名前のイベントを発火させ、 AudioContext に配送して、以降の手順を中止します。

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

  4. [[sink ID]] を [[sink ID at construction]] の値に設定します。

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

  6. メディア要素タスクをキューに入れ、 次の手順を実行します:

    1. AudioContext の [[render quantum size]] が 0 の場合、 リソース取得中に選択された実際のハードウェアレンダー量子サイズに 設定します。

    2. AudioContext の state 属性を "running" に設定します。

    3. statechange という名前のイベントを発火させ、 AudioContext に配送します。

注: AudioContext が引数なしで構築され、リソース 取得に失敗した場合、ユーザーエージェントは オーディオ出力デバイスをエミュレートする仕組みを使用して、オーディオグラフを黙ってレンダリングしようとします。

AudioWorkletGlobalScope 上の MessagePort を設定するために制御 メッセージを送信するとは、 AudioWorkletGlobalScope へ転送された serializedRenderingSidePort を使用して、 レンダリング スレッド上で次の手順を実行することを意味します:
  1. deserializedPort を StructuredDeserialize(serializedRenderingSidePort, 現在の Realm) の結果とします。

  2. port を deserializedPort に設定します。

AudioContext.constructor(contextOptions) メソッドの引数。
パラメーター 型 null 許容 省略可能 説明
contextOptions AudioContextOptions ✘ ✔ AudioContext をどのように構築するかを制御する、ユーザー指定のオプション。

1.2.2. 属性

baseLatency, 型は double、読み取り専用

これは、AudioContext がオーディオを AudioDestinationNode からオーディオサブシステムへ渡す際に発生する処理レイテンシーの秒数を表します。 AudioDestinationNode の出力とオーディオハードウェアの間の その他の処理によって発生し得る追加のレイテンシーは含まず、 特にオーディオグラフ自体で発生するレイテンシーは含みません。

たとえば、オーディオコンテキストが既定のレンダー 量子サイズで 44.1 kHz で動作し、AudioDestinationNode が内部的にダブルバッファリングを実装し、 各レンダー量子ごとにオーディオを処理して出力できる場合、 処理レイテンシーはおよそ \((2\cdot128)/44100 = 5.805 \mathrm{ ms}\) です。

outputLatency, 型は double、読み取り専用

オーディオ出力レイテンシーの秒単位の推定値、すなわち、 UA がホストシステムにバッファーの再生を要求した時刻と、 バッファー内の最初のサンプルが オーディオ出力デバイスによって実際に処理される時刻との間隔です。 音響信号を生成するスピーカーやヘッドホンなどの デバイスの場合、後者の時刻はサンプルの 音が生成される時刻を指します。

outputLatency 属性の値は、プラットフォームと 接続されているオーディオ出力デバイスのハードウェアに依存します。 outputLatency 属性の値は、コンテキストの実行中や 関連付けられたオーディオ出力デバイスが変更されたときに変化する可能性があります。 正確な同期が必要な場合、この値を頻繁に 照会すると有用です。

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

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

onsinkchange, 型は EventHandler

setSinkId() のイベントハンドラーです。 このイベントハンドラーのイベント型は sinkchange です。このイベントは、 出力デバイスの変更が完了したときに配送されます。

注: これは AudioContext の構築時に行われる最初の デバイス選択では配送されません。 最初の出力デバイスの準備状態を確認するには、 statechange イベントを使用できます。

onerror, 型は EventHandler

AudioContext から配送される Event のイベントハンドラーです。 このハンドラーのイベント 型は error であり、 ユーザーエージェントは 次の場合にこのイベントを配送できます:

  • 選択されたオーディオデバイスの初期化および有効化に失敗した場合。

  • AudioContext に関連付けられたオーディオ出力デバイスが、 コンテキストが running の間に切断された場合。

  • オペレーティングシステムがオーディオデバイスの故障を報告した場合。

playbackStats, 型は AudioPlaybackStats、読み取り専用

この AudioContext の AudioPlaybackStats インスタンス。 [[playback stats]] 内部スロットの値を返します。

1.2.3. メソッド

close()

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

close が呼び出されたとき、次の手順を実行します:
  1. this の関連するグローバルオブジェクトの関連付けられた Document が完全にアクティブでない場合、"InvalidStateError" DOMException で拒否された Promiseを返します。

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

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

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

  5. AudioContext を閉じるための制御メッセージをキューに入れます。

  6. promise を返します。

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

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

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

    この場合、制御スレッドへ通知する必要はありません。
  4. メディア要素タスクをキューに入れ、次の手順を実行します:

    1. promise を解決します。

    2. AudioContext の state 属性がまだ "closed" でない場合:

      1. AudioContext の state 属性を "closed" に設定します。

      2. メディア要素タスクをキューに入れ、statechange という名前のイベントを 発火させ、 AudioContext に配送します。

AudioContext が閉じられると、AudioContext に接続されていた MediaStream および HTMLMediaElement の出力は無視されます。つまり、これらはスピーカーやその他の出力デバイスに 何も出力しなくなります。動作をより柔軟にするには、 HTMLMediaElement.captureStream() の使用を検討してください。

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

パラメーターなし。
戻り値の型: Promise<undefined>
createMediaElementSource(mediaElement)

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

AudioContext.createMediaElementSource() メソッドの引数。
パラメーター 型 null 許容 省略可能 説明
mediaElement HTMLMediaElement ✘ ✘ 再ルーティングされるメディア要素。
戻り値の型: MediaElementAudioSourceNode
createMediaStreamDestination()

MediaStreamAudioDestinationNode を作成します。

パラメーターなし。
戻り値の型: MediaStreamAudioDestinationNode
createMediaStreamSource(mediaStream)

MediaStreamAudioSourceNode を作成します。

AudioContext.createMediaStreamSource() メソッドの引数。
パラメーター 型 null 許容 省略可能 説明
mediaStream MediaStream ✘ ✘ ソースとして機能するメディアストリーム。
戻り値の型: MediaStreamAudioSourceNode
createMediaStreamTrackSource(mediaStreamTrack)

MediaStreamTrackAudioSourceNode を作成します。

AudioContext.createMediaStreamTrackSource() メソッドの引数。
パラメーター 型 null 許容 省略可能 説明
mediaStreamTrack MediaStreamTrack ✘ ✘ ソースとして機能する MediaStreamTrack。 その kind 属性の値は "audio" と等しくなければならず、そうでなければ InvalidStateError 例外を投げなければなりません。
戻り値の型: MediaStreamTrackAudioSourceNode
getOutputTimestamp()

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

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

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

getOutputTimestamp メソッドから返される値を使用して、わずかに後の コンテキスト時刻値に対するパフォーマンス時刻の推定値を取得できます:
function outputPerformanceTime(contextTime) {
    const timestamp = context.getOutputTimestamp();
    const elapsedTime = contextTime - timestamp.contextTime;
    return timestamp.performanceTime + elapsedTime * 1000;
}

上の例では、推定の精度は 引数の値が現在の出力オーディオ ストリーム位置にどれだけ近いかによって決まります。指定された contextTime が timestamp.contextTime に近いほど、 得られる推定値の精度は高くなります。

注: コンテキストの currentTime と、getOutputTimestamp メソッド呼び出しから得られた contextTime の値の差は、 信頼できる出力レイテンシーの推定値とは見なせません。 currentTime は不均一な時間間隔で増加する可能性があるためです。その代わりに、 outputLatency 属性を使用するべきです。

パラメーターなし。
戻り値の型: AudioTimestamp
resume()

AudioContext が一時停止されている場合、その currentTime の進行を再開します。

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

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

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

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

  5. コンテキストの state 属性が "suspended" で、コンテキストの [[control thread state]] が "interrupted" の場合:

    1. メディア要素タスクをキューに入れ、 次の手順を実行します:

      1. AudioContext の state 属性を "interrupted" に設定します。

      2. [[state before interruption]] スロットを "running" に設定します。

      3. メディア要素 タスクをキューに入れ、statechange という名前のイベントを発火させ、 AudioContext に配送します。

    2. Promise を InvalidStateError で拒否し、これらの 手順を中止して promise を返します。

  6. コンテキストが開始を許可されていない場合、 promise を [[pending promises]] および [[pending resume promises]] に追加し、 これらの手順を中止して promise を返します。

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

  8. promise とともに AudioContext を再開するための制御メッセージをキューに入れます。

  9. promise を返します。

AudioContext を再開するための制御 メッセージを実行するとは、 レンダリング スレッド上で次の手順を実行することを意味します:
  1. promise を、このアルゴリズムに渡された Promise とします。

  2. システムリソースを取得することを試みます。

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

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

  5. 失敗した場合、 メディア要素タスクをキューに入れ、次の手順を実行します:

    1. [[pending resume promises]] のすべての Promise を順番に拒否し、その後 [[pending resume promises]] をクリアします。

    2. さらに、それらの Promise を [[pending promises]] から削除します。

  6. メディア要素タスクをキューに入れ、次の手順を実行します:

    1. AudioContext の [[render quantum size]] が 0 の場合、 リソース取得中に選択された実際のハードウェアレンダー量子サイズに 設定します。

    2. [[pending resume promises]] のすべての Promise を順番に解決します。

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

    4. promise を解決します。

    5. AudioContext の state 属性がまだ "running" でない場合:

      1. AudioContext の state 属性を "running" に設定します。

      2. メディア要素 タスクをキューに入れ、statechange という名前のイベントを発火させ、 AudioContext に配送します。

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

AudioContext の currentTime の進行を一時停止し、 すでに処理済みの現在のコンテキスト処理ブロックを デスティネーションで再生できるようにして、その後システムが オーディオハードウェアへの占有を解放できるようにします。これは通常、 アプリケーションがしばらく AudioContext を必要としないことが分かっており、 AudioContext に関連付けられたシステムリソースを一時的に解放 したい場合に有用です。 Promise は、フレームバッファーが空になったとき (ハードウェアへ渡されたとき)に解決されます。コンテキストがすでに suspended の場合は、即座に (その他の効果なしで)解決されます。コンテキストが閉じられている場合、 Promise は拒否されます。

suspend が呼び出されたとき、次の手順を実行します:
  1. this の関連するグローバルオブジェクトの関連付けられた Document が完全にアクティブでない場合、"InvalidStateError" DOMException で拒否された Promiseを返します。

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

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

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

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

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

  7. promise とともに AudioContext を一時停止するための制御メッセージをキューに入れます。

  8. promise を返します。

AudioContext を一時停止するための制御 メッセージを実行するとは、 レンダリング スレッド上で次の手順を実行することを意味します:
  1. promise を、このアルゴリズムに渡された Promise とします。

  2. システムリソースを 解放することを試みます。

  3. AudioContext 上の [[rendering thread state]] が "interrupted" の場合、メディア要素 タスクをキューに入れ、[[state before interruption]] スロットを "suspended" に設定します。

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

  5. メディア要素タスクをキューに入れ、 次の手順を実行します:

    1. promise を解決します。

    2. AudioContext の state 属性がまだ "suspended" でない場合:

      1. AudioContext の state 属性を "suspended" に設定します。

      2. メディア要素 タスクをキューに入れ、statechange という名前のイベントを発火させ、 AudioContext に配送します。

AudioContext が一時停止されている間、 MediaStream の出力は無視されます。つまり、 メディアストリームのリアルタイム性によりデータは失われます。 HTMLMediaElement も同様に、システムが再開されるまで出力が 無視されます。AudioWorkletNode および ScriptProcessorNode は、一時停止中は 処理ハンドラーが呼び出されなくなりますが、 コンテキストが再開されると再開します。 AnalyserNode のウィンドウ関数に関しては、データは 連続したストリームとして扱われます。つまり、 resume()/suspend() によって AnalyserNode のデータストリームに無音が現れることはありません。 特に、AudioContext が一時停止されているときに AnalyserNode 関数を繰り返し呼び出す場合、 同じデータを返さなければなりません。

パラメーターなし。
戻り値の型: Promise<undefined>
setSinkId((DOMString or AudioSinkOptions) sinkId)

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

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

  2. sinkId が [[sink ID]] と等しい場合、Promise を返し、 直ちに解決してこれらの手順を中止します。

  3. validationResult を、 sinkId の シンク識別子の検証 の戻り値とします。

  4. validationResult が false の場合、 名前が "NotAllowedError" である新しい DOMException で拒否された Promise を返します。 これらの手順を中止します。

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

  6. p および sinkId とともに、処理を開始するための 制御メッセージを送信します。

  7. p を返します。

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

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

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

  4. sinkId が AudioSinkOptions 型で、 [[sink ID]] が AudioSinkInfo 型であり、 sinkId 内の type と [[sink ID]] 内の type が等しい場合、 メディア要素タスクをキューに入れて p を解決し、これらの手順を中止します。

  5. wasRunning を true とします。

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

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

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

  9. wasRunning が true の場合:

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

    2. メディア要素タスクをキューに入れ、次の手順を実行します:

      1. AudioContext の state 属性がまだ "suspended" でない場合:

        1. AudioContext の state 属性を "suspended" に設定します。

        2. statechange という名前のイベントを発火させ、 関連付けられた AudioContext に配送します。

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

    • 空文字列の場合は既定のオーディオ出力デバイス。

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

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

  11. メディア要素タスクをキューに入れ、次の手順を実行します:

    1. sinkId が DOMString 型の場合、 [[sink ID]] を sinkId に設定します。これらの手順を中止します。

    2. sinkId が AudioSinkOptions 型で、 [[sink ID]] が DOMString 型の場合、[[sink ID]] を、sinkId の type の値で作成された新しい AudioSinkInfo インスタンスに設定します。

    3. sinkId が AudioSinkOptions 型で、 [[sink ID]] が AudioSinkInfo 型の場合、 [[sink ID]] の type を、 sinkId の type の値に設定します。

    4. p を解決します。

    5. sinkchange という名前のイベントを発火させ、 関連付けられた AudioContext に配送します。

  12. wasRunning が true の場合:

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

    2. メディア要素タスクをキューに入れ、次の手順を実行します:

      1. AudioContext の state 属性がまだ "running" でない場合:

        1. AudioContext の state 属性を "running" に設定します。

        2. statechange という名前のイベントを発火させ、 関連付けられた AudioContext に配送します。

1.2.4. sinkId の検証

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

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

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

  3. document が "speaker-selection" で識別される機能を使用することを許可されていない場合、 false を返します。

  4. sinkIdArg が DOMString 型でありながら、空文字列と等しくない、または enumerateDevices() によって提供される結果で識別されるどのオーディオ出力デバイスにも一致しない場合、 false を返します。

  5. true を返します。

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 で指定することもできます。その数値を適切に解釈するかどうかは ブラウザーの裁量に委ねられます。実際に使用されるレイテンシーは、 AudioContext の baseLatency 属性で示されます。

sampleRate, 型は float

作成される AudioContext の sampleRate をこの値に設定します。 必要なサポート範囲については、 § 2.4 サポートされるサンプルレートを参照してください。

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

sinkId, 型は (DOMString or AudioSinkOptions)

オーディオ出力デバイスの識別子または関連情報。 詳細については sinkId を参照してください。

renderSizeHint, 型は (AudioContextRenderSizeCategory or unsigned long)、既定値は "default"

整数が渡された場合は特定のレンダー量子サイズを要求できます。 何も渡されない場合または "default" が渡された場合は既定の 128 フレームを使用し、 "hardware" が指定された場合はユーザーエージェントに適切な レンダー量子 サイズを選択するよう要求します。

必要なサポート範囲については、§ 2.5 サポートされるレンダー量子サイズを参照してください。

これはヒントであり、尊重されない可能性があります。

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.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(optional unsigned long? chunkSize = null);
    Promise<undefined> resume();
    Promise<undefined> suspend(double suspendTime);
    Promise<undefined> close();
    readonly attribute unsigned long? length;
    attribute EventHandler oncomplete;
};

OfflineAudioContext は次の内部スロットを持ちます:

[[rendering started]]

レンダリングが開始されたかどうかを表すブーリアンフラグ。初期値は false です。

[[rendered buffers]]

レンダリング中の AudioBuffer の順序付きリスト。初期値は 空のリストです。

[[committed frames]]

OfflineAudioContext がレンダリングすることを確定した フレーム数を追跡します。初期値は 0 です。

[[rendered frames]]

レンダリング済みのフレーム数を追跡します。初期値は 0 です。

1.3.1. コンストラクター

OfflineAudioContext(contextOptions)

現在の設定オブジェクトの関連するグローバルオブジェクトの 関連付けられた Document が完全にアクティブでない場合、 InvalidStateError を投げて、これらの手順を中止します。

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

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

  3. c の sampleRate を、 contextOptions.sampleRate の値に基づいて設定します。

  4. c の [[render quantum size]] を、 contextOptions.renderSizeHint の値に基づいて決定します:

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

    2. それ以外で、整数が渡された場合、その値が § 2.5 サポートされるレンダー量子サイズ で指定された範囲外なら、NotSupportedError を投げなければなりません。 それ以外の場合、[[render quantum size]] プライベートスロットを渡された値に設定します。

  5. channelCount を contextOptions.numberOfChannels に設定した AudioDestinationNode を構築します。

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

  7. controlSidePort を messageChannel の port1 属性の値とします。

  8. renderingSidePort を messageChannel の port2 属性の値とします。

  9. serializedRenderingSidePort を StructuredSerializeWithTransfer(renderingSidePort, « renderingSidePort ») の結果とします。

  10. この audioWorklet の port を controlSidePort に設定します。

  11. serializedRenderingSidePort とともに、 AudioContextGlobalScope 上の MessagePort を設定するための制御メッセージをキューに入れます。

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

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

OfflineAudioContext は、代わりに

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

が呼び出されたかのように構築されます。

OfflineAudioContext.constructor(numberOfChannels, length, sampleRate) メソッドの引数。
パラメーター 型 null 許容 省略可能 説明
numberOfChannels unsigned long ✘ ✘ バッファーが持つチャンネル数を決定します。サポートされるチャンネル数については createBuffer() を参照してください。
length unsigned long ✘ ✘ オーディオレンダリングの合計サイズをサンプルフレーム単位で決定します。
sampleRate float ✘ ✘ バッファー内のリニア PCM オーディオデータのサンプルレートを、 1 秒あたりのサンプルフレーム数で記述します。必要なサポート範囲については § 2.4 サポートされるサンプルレートを参照してください。

1.3.2. 属性

length, 型は unsigned long、読み取り専用、null 許容

オーディオレンダリングの合計サイズ(サンプルフレーム単位)。これは コンストラクターの length パラメーターの値と同じです。

長さが未定義のレンダリングでは、この属性を null に設定するべきです。

oncomplete, 型は EventHandler

このイベントハンドラーのイベント型は complete です。イベント ハンドラーへ配送されるイベントは OfflineAudioCompletionEvent インターフェイスを使用します。これは OfflineAudioContext で最後に発火するイベントです。

1.3.3. メソッド

startRendering(chunkSize)

現在の接続とスケジュールされた変更に基づいて、 オーディオのレンダリングを開始します。

レンダリングされたオーディオデータを取得する主な方法は Promise の戻り値を介するものですが、レガシー上の理由からインスタンスは complete という名前のイベントも発火します。

startRendering が 呼び出されたとき、次の手順を制御 スレッド上で実行しなければなりません:
  1. this の関連するグローバルオブジェクトの関連付けられた Document が完全にアクティブでない場合、"InvalidStateError" DOMException で拒否された Promiseを返します。
  2. promise を新しい Promise とします。
  3. OfflineAudioContext 上の [[control thread state]] が closed の場合、 promise を InvalidStateError で拒否し、これらの 手順を中止します。
  4. OfflineAudioContext の length が null でなく、 [[committed frames]] が OfflineAudioContext の length 以上の場合、 promise を InvalidStateError で拒否し、これらの 手順を中止します。
  5. bufferLength を、 chunkSize の値で初期化された数値とします。
    1. OfflineAudioContext の length が null の場合:
      1. chunkSize が null の場合、bufferLength を レンダー量子サイズに設定します。
    2. それ以外で、OfflineAudioContext の length が null でない場合:
      1. chunkSize が null でなく、[[committed frames]] + chunkSize が OfflineAudioContext の length 未満の場合、bufferLength を chunkSize に設定します。
      2. それ以外の場合、bufferLength を length - [[committed frames]] に設定します。
  6. bufferLength が レンダー 量子サイズの倍数でない場合、次の レンダー量子サイズの倍数まで切り上げます。
  7. 新しい AudioBuffer buffer を作成します。チャンネル数と サンプルレートは、このインスタンスのコンストラクターへ contextOptions パラメーターで渡された numberOfChannels および sampleRate の値とそれぞれ等しくし、 長さは bufferLength と等しくします。
  8. 直前の AudioBuffer コンストラクター呼び出し中に例外が投げられた場合、 promise をこの例外で拒否し、promise を返します。
  9. [[rendering started]] を true に設定します。
  10. [[committed frames]] を、 [[committed frames]] と buffer の length の合計に設定します。
  11. buffer を [[rendered buffers]] に追加し、buffer の オフラインレンダリングを開始します。
  12. promise を [[pending promises]] に追加します。
  13. promise を返します。
AudioBuffer buffer のオフラインレンダリングを開始するには、 そのために作成されたレンダリング スレッド上で次の手順を実行しなければなりません。
  1. 現在の接続とスケジュールされた変更に基づいて、 buffer の length サンプルフレーム分のオーディオを buffer に レンダリングし始めます。
  2. 各レンダー 量子について確認し、必要なら レンダリングを suspend します。
  3. 一時停止されたコンテキストが再開された場合、 バッファーのレンダリングを続行します。
  4. レンダリングが完了したら、 メディア要素タスクをキューに入れ、次の手順を実行します:
    1. startRendering() によって作成された promise を buffer で解決します。
    2. promise を [[pending promises]] から削除します。
    3. buffer を [[rendered buffers]] から削除します。
    4. [[rendered frames]] を、 [[rendered frames]] と buffer の length の合計に設定します。
    5. length が null でない場合:
      1. [[rendered frames]] が length 以上の場合、 OfflineAudioContext を閉じるための制御メッセージを キューに入れます。
      2. メディア要素タスクをキューに入れ、 complete という名前のイベントを発火させ、 renderedBuffer プロパティが buffer に設定された OfflineAudioCompletionEvent を使用して OfflineAudioContext に配送します。
OfflineAudioContext.startRendering(chunkSize) メソッドの引数。
パラメーター 型 null 許容 省略可能 説明
chunkSize unsigned long? ✔ ✔ この呼び出し中にレンダリングするサンプルフレーム数。
戻り値の型: Promise<AudioBuffer>
resume()

OfflineAudioContext が一時停止されている場合、その currentTime の進行を再開します。

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

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

  3. 次のいずれかの条件が true の場合、これらの手順を中止し、 promise を InvalidStateError で拒否します:

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

  5. OfflineAudioContext を再開するための制御メッセージをキューに入れます。

  6. promise を返します。

OfflineAudioContext を再開するための制御 メッセージを実行するとは、 レンダリング スレッド上で次の手順を実行することを意味します:
  1. OfflineAudioContext 上の [[rendering thread state]] を running に設定します。

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

  3. 失敗した場合、 メディア要素タスクをキューに入れて promise を拒否し、残りの 手順を中止します。

  4. メディア要素タスクをキューに入れ、次の手順を実行します:

    1. promise を解決します。

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

      1. OfflineAudioContext の state 属性を "running" に設定します。

      2. メディア要素 タスクをキューに入れ、statechange という名前のイベントを発火させ、 OfflineAudioContext に配送します。

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

指定された時刻にオーディオ コンテキストの時間進行を一時停止するようスケジュールし、Promise を返します。これは通常、 OfflineAudioContext 上でオーディオグラフを同期的に操作するときに有用です。

一時停止の最大精度は レンダー量子 のサイズであり、指定された一時停止時刻は 最も近い次のレンダー量子 境界まで切り上げられることに注意してください。このため、 同じ量子化フレームに複数の一時停止をスケジュールすることは 許可されません。また、正確な一時停止を保証するため、 コンテキストが実行中でないときにスケジュールするべきです。

OfflineAudioContext.suspend() メソッドの引数。
パラメーター 型 null 許容 省略可能 説明
suspendTime double ✘ ✘ 指定された時刻にレンダリングを一時停止するようスケジュールします。この時刻は量子化され、 レンダー量子サイズまで切り上げられます。量子化されたフレーム番号が
  1. 負である、または
  2. 現在時刻以下である、または
  3. レンダリングの合計時間以上である、または
  4. 同じ時刻に別の suspend によってスケジュールされている、
場合、Promise は InvalidStateError で拒否されます。
戻り値の型: Promise<undefined>
close()

OfflineAudioContext を閉じます。 これにより、AudioContext によって作成されたすべての オブジェクトが自動的に解放されるわけではありませんが、 AudioContext の currentTime の進行を一時停止し、 オーディオデータの処理を停止します。

close が呼び出されたとき、次の手順を実行します:
  1. this の関連するグローバルオブジェクトの 関連付けられた Document が完全にアクティブでない場合、 "InvalidStateError" DOMException で拒否された Promiseを返します。

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

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

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

  5. OfflineAudioContext を閉じるための制御メッセージをキューに入れます。

  6. promise を返します。

OfflineAudioContext を閉じるための制御 メッセージを実行するとは、レンダリングスレッド上で次の手順を実行することを意味します:
  1. [[rendering thread state]] を suspended に設定します。

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

    この場合、制御スレッドへ通知する必要はありません。
  3. メディア要素タスクをキューに入れ、次の手順を実行します:

    1. promise を解決します。

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

      1. OfflineAudioContext の state 属性を "closed" に設定します。

      1. メディア要素タスクをキューに入れ、statechange という名前のイベントを発火させ、 OfflineAudioContext に配送します。

1.3.4. OfflineAudioContextOptions

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

dictionary OfflineAudioContextOptions {
    unsigned long numberOfChannels = 1;
    unsigned long? length = null;
    required float sampleRate;
    (AudioContextRenderSizeCategory or unsigned long) renderSizeHint = "default";
};
1.3.4.1. OfflineAudioContextOptions 辞書のメンバー
length, 型は unsigned long、null 許容、既定値は null

レンダリングされた AudioBuffer の長さ(サンプルフレーム単位)。

numberOfChannels, 型は unsigned long、既定値は 1

この OfflineAudioContext のチャンネル数。

sampleRate, 型は float

この OfflineAudioContext のサンプルレート。 必要なサポート範囲については § 2.4 サポートされるサンプルレートを参照してください。

renderSizeHint, 型は (AudioContextRenderSizeCategory or unsigned long)、既定値は "default"

この OfflineAudioContext のレンダー量子サイズのヒント。 必要なサポート範囲については§ 2.5 サポートされるレンダー量子サイズ を参照してください。

1.3.5. OfflineAudioCompletionEvent インターフェイス

これは、レガシー上の理由から OfflineAudioContext へ配送される Event オブジェクトです。

[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 つ以上の チャンネルを含むことができ、各チャンネルは公称範囲 \([-1,1]\) の 32 ビット浮動小数点 リニア PCM 値として扱われますが、 値はこの範囲に制限されません。通常、 PCM データの長さはかなり短い (通常は 1 分より多少短い)ことが想定されます。 音楽のサウンドトラックなど、より長い音声には、 audio 要素および MediaElementAudioSourceNode を使用したストリーミングを使用するべきです。

AudioBuffer は 1 つ以上の AudioContext で使用でき、 OfflineAudioContext と AudioContext の間で共有できます。

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. コンストラクターに渡された AudioBufferOptions の属性 numberOfChannels、 length、 sampleRate の値を、それぞれ内部スロット [[number of channels]]、 [[length]]、 [[sample rate]] に割り当てます。

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

    注: これにより、 基盤となるストレージが 0 で初期化されます。

  5. b を返します。

AudioBuffer.constructor() メソッドの引数。
パラメーター 型 null 許容 省略可能 説明
options AudioBufferOptions ✘ ✘ この AudioBuffer のプロパティを決定する AudioBufferOptions。

1.4.2. 属性

duration, 型は double、読み取り専用

PCM オーディオデータの継続時間(秒)。

これは、AudioBuffer の [[length]] を [[sample rate]] で除算することにより、 [[sample rate]] と [[length]] から計算されます。

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 配列へコピーします。

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

AudioBuffer.copyFromChannel() メソッドの引数。
パラメーター 型 null 許容 省略可能 説明
destination Float32Array ✘ ✘ チャンネルデータのコピー先となる配列。
channelNumber unsigned long ✘ ✘ データをコピーする元となるチャンネルのインデックス。channelNumber が AudioBuffer のチャンネル数以上の場合、 IndexSizeError を投げなければなりません。
bufferOffset unsigned long ✘ ✔ 省略可能なオフセットで、既定値は 0 です。AudioBuffer のこのオフセットから始まるデータが destination にコピーされます。
戻り値の型: undefined
copyToChannel(source, channelNumber, bufferOffset)

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

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

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

AudioBuffer.copyToChannel() メソッドの引数。
パラメーター 型 null 許容 省略可能 説明
source Float32Array ✘ ✘ チャンネルデータのコピー元となる配列。
channelNumber unsigned long ✘ ✘ データのコピー先となるチャンネルのインデックス。channelNumber が AudioBuffer のチャンネル数以上の場合、 IndexSizeError を投げなければなりません。
bufferOffset unsigned long ✘ ✔ 省略可能なオフセットで、既定値は 0 です。source のデータが、このオフセットから始まる AudioBuffer にコピーされます。
戻り値の型: undefined
getChannelData(channel)

内容を取得するで説明されている規則に従って、 新しい Float32Array 内で、[[internal data]] に格納されているバイトへの書き込みを許可するか、 またはそのバイトのコピーを取得します。

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

AudioBuffer.getChannelData() メソッドの引数。
パラメーター 型 null 許容 省略可能 説明
channel unsigned long ✘ ✘ このパラメーターは、データを取得する特定のチャンネルを表すインデックスです。インデックス 値 0 は最初のチャンネルを表します。このインデックス値は [[number of channels]] 未満でなければならず、そうでなければ IndexSizeError 例外を投げなければなりません。
戻り値の型: Float32Array

注: copyToChannel() および copyFromChannel() メソッドは、より大きな 配列へのビューである Float32Array を渡すことで、配列の一部を埋めるために使用できます。 AudioBuffer のチャンネルからデータを読み取り、 データをチャンク単位で処理できる場合、不要な メモリー割り当てやコピーを回避できる可能性があるため、getChannelData() を呼び出して結果の配列へアクセスするより、 copyFromChannel() を優先するべきです。

ある API 実装が AudioBuffer の内容を必要とするとき、内部操作 AudioBuffer の 内容を取得するが呼び出されます。この操作は呼び出し元へ 不変のチャンネルデータを返します。

AudioBuffer に対して内容を取得する 操作が行われるとき、次の手順を実行します:
  1. AudioBuffer の ArrayBuffer のいずれかが 切り離されている場合、true を返し、 これらの手順を中止して、 長さ 0 のチャンネルデータバッファーを呼び出し元へ返します。

  2. この AudioBuffer 上の getChannelData() によって以前に返された配列のすべての ArrayBuffer を切り離します。

    注: AudioBuffer は createBuffer() または AudioBuffer コンストラクターを介してのみ作成できるため、 これは例外を投げることができません。

  3. それらの ArrayBuffer から基盤となる [[internal data]] を保持し、それらへの参照を 呼び出し元へ返します。

  4. データのコピーを含む ArrayBuffer を AudioBuffer に関連付け、次回の getChannelData() 呼び出しで返されるようにします。

AudioBuffer の 内容を取得する操作は、次の場合に呼び出されます:

注: これは、copyToChannel() を使用して、 AudioBuffer の 内容を取得した AudioNode が現在使用している AudioBuffer の内容を変更することはできないことを意味します。 AudioNode は 以前に取得したデータを引き続き 使用するためです。

1.4.4. AudioBufferOptions

これは、AudioBuffer を構築するときに使用するオプションを指定します。 length および sampleRate メンバーは 必須です。

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)。必要なサポート範囲については § 2.4 サポートされるサンプルレートを参照してください。

1.5. AudioNode インターフェイス

AudioNode は AudioContext の構成要素です。このインターフェイスは、 オーディオソース、オーディオデスティネーション、および中間 処理モジュールを表します。これらのモジュールを相互に接続して、 オーディオハードウェアへオーディオをレンダリングするための 処理グラフを形成できます。 各ノードは入力および/または 出力を持つことができます。 ソースノードは入力を持たず、1 つの 出力を持ちます。フィルターなどのほとんどの処理ノードは 1 つの入力と 1 つの出力を持ちます。各種類の AudioNode は、オーディオをどのように処理または合成するかという 詳細が異なります。しかし一般に、 AudioNode は入力(存在する場合)を処理し、 出力(存在する場合)のためのオーディオを生成します。

各出力は 1 つ以上のチャンネルを持ちます。正確なチャンネル数は、 特定の AudioNode の詳細によって異なります。

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

各 AudioNode の入力は、任意の時点で特定の チャンネル数を持ちます。この数は、入力に対して行われた 接続によって変化する可能性があります。 入力に接続がない場合、無音の 1 チャンネルを持ちます。

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

AudioContext の時間に対して、AudioNode の入力処理と内部操作は、 ノードに接続された出力があるかどうか、 またそれらの出力が最終的に AudioContext の AudioDestinationNode に到達するかどうかにかかわらず、継続的に行われます。

[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 つの方法で作成できます。この特定のインターフェイスの コンストラクターを使用するか、 BaseAudioContext または AudioContext 上のファクトリーメソッドを使用します。

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

BaseAudioContext c 上で呼び出された ファクトリーメソッド を使用して、特定の型 n の新しい AudioNode を作成するには、次の手順を実行します:
  1. node を型 n の新しいオブジェクトとします。

  2. option を、このファクトリーメソッドに 関連付けられたインターフェイスに 関連付けられた型の辞書とします。

  3. ファクトリーメソッドへ渡された各パラメーターについて、 option 上の同名の辞書メンバーを このパラメーターの値に設定します。

  4. node 上で n のコンストラクターを、 c と option を引数として呼び出します。

  5. node を返します。

AudioNode を継承するオブジェクト o を初期化するとは、 このインターフェイスのコンストラクターへ渡された引数 context および dict を与えて、次の 手順を実行することを意味します。
  1. o に関連付けられた BaseAudioContext を context に設定します。

  2. numberOfInputs、 numberOfOutputs、 channelCount、 channelCountMode、 channelInterpretation の値を、それぞれの AudioNode の節で示されている、この 特定のインターフェイスの既定値に設定します。

  3. 渡された dict の各メンバーについて、 k をメンバーのキー、v をその値として、次の手順を実行します。 これらの手順の実行中に例外が投げられた場合、反復を中止し、 例外をアルゴリズム(コンストラクターまたは ファクトリーメソッド)の呼び出し元へ伝播します。

    1. k がこのインターフェイス上の AudioParam の名前である場合、この AudioParam の value 属性を v に設定します。

    2. それ以外で、k がこのインターフェイス上の属性名である場合、 この属性に関連付けられたオブジェクトを v に設定します。

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

AudioNode は、[DOM]で説明されている EventTarget です。 これは、他の EventTarget がイベントを受け取るのと同じ方法で、 AudioNode へイベントを配送できることを意味します。

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

ChannelCountMode は、ノードの channelCount および channelInterpretation の値と組み合わせて、 ノードへの入力をどのようにミキシングするかを制御する computedNumberOfChannels を決定するために使用されます。 computedNumberOfChannels は 以下に示すように決定されます。 ミキシングの方法の詳細については、§ 4 チャンネルのアップミックスと ダウンミックスを参照してください。

ChannelCountMode 列挙型の説明
列挙値 説明
"max" computedNumberOfChannels は、 1 つの入力へのすべての接続の チャンネル数の最大値です。このモードでは channelCount は無視されます。
"clamped-max" computedNumberOfChannels は "max" と同様に決定された後、指定された channelCount を最大値としてクランプされます。
"explicit" computedNumberOfChannels は、 channelCount で指定された正確な値です。
enum ChannelInterpretation {
    "speakers",
    "discrete"
};
ChannelInterpretation 列挙型の説明
列挙値 説明
"speakers" アップミックス式またはダウンミックス式を使用します。 チャンネル数がこれらの基本的なスピーカーレイアウトの いずれにも一致しない場合は、 "discrete" に戻します。
"discrete" アップミックスでは、チャンネルがなくなるまで順に埋め、 残りのチャンネルを 0 にします。ダウンミックスでは、可能な限り多くのチャンネルを 埋め、その後残りのチャンネルを破棄します。

1.5.2. AudioNode のテールタイム

AudioNode はテールタイムを持つことがあります。 これは、 AudioNode に無音が入力されている場合でも、出力が無音でない可能性があることを意味します。

AudioNode は、過去の入力が将来の出力に影響するような内部処理状態を 持つ場合、0 ではないテールタイムを持ちます。AudioNode は、入力が無音でない状態から無音へ遷移した後でも、 計算されたテールタイムの間、無音でない出力を生成し続ける場合があります。

1.5.3. AudioNode のライフタイム

AudioNode は、次のいずれかの条件を満たす場合、 レンダー量子の間、 アクティブに 処理中であることができます。

注: これには、 テールタイムを持つ AudioNode も考慮されます。

アクティブに 処理中でない AudioNode は、1 チャンネルの無音を出力します。

1.5.4. 属性

channelCount, 型は unsigned long

channelCount は、ノードへの任意の入力に対する接続を アップミックスおよびダウンミックスするときに使用されるチャンネル数です。 値が特別に決定される一部のノードを除き、既定値は 2 です。 この属性は、入力を持たないノードには影響しません。 この値が 0 または 実装の最大チャンネル数を超える値に設定された場合、実装は NotSupportedError 例外を投げなければなりません。

さらに、一部のノードには、チャンネル数として可能な値に関する追加の channelCount 制約があります:

AudioDestinationNode

動作は、デスティネーションノードが AudioContext または OfflineAudioContext のデスティネーションであるかどうかによって異なります:

AudioContext

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

OfflineAudioContext

チャンネル数は変更できません。値を変更しようとすると、 InvalidStateError 例外を投げなければなりません。

AudioWorkletNode

§ 1.32.4.3.2 AudioWorkletNodeOptions によるチャンネルの構成 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 制約があります:

AudioDestinationNode

AudioDestinationNode が OfflineAudioContext の destination ノードである場合、 チャンネルカウントモードは変更できません。値を変更しようとすると、 InvalidStateError 例外を投げなければなりません。

ChannelMergerNode

チャンネルカウントモードを "explicit" から変更することはできず、 値を変更しようとするとInvalidStateError 例外を投げなければなりません。

ChannelSplitterNode

チャンネルカウントモードを "explicit" から変更することはできず、 値を変更しようとするとInvalidStateError 例外を投げなければなりません。

ConvolverNode

チャンネルカウントモードを "max" に設定することはできず、 "max" に設定しようとすると NotSupportedError 例外を投げなければなりません。

DynamicsCompressorNode

チャンネルカウントモードを "max" に設定することはできず、 "max" に設定しようとすると NotSupportedError 例外を投げなければなりません。

PannerNode

チャンネルカウントモードを "max" に設定することはできず、 "max" に設定しようとすると NotSupportedError 例外を投げなければなりません。

ScriptProcessorNode

チャンネルカウントモードを "explicit" から変更することはできず、 値を変更しようとするとNotSupportedError 例外を投げなければなりません。

StereoPannerNode

チャンネルカウントモードを "max" に設定することはできず、 "max" に設定しようとすると NotSupportedError 例外を投げなければなりません。

この属性の詳細については、§ 4 チャンネルのアップミックスとダウンミックス の節を参照してください。

channelInterpretation, 型は ChannelInterpretation

channelInterpretation は、ノードへの任意の入力に対する接続をアップミックスおよびダウンミックスするときに、 個々のチャンネルをどのように扱うかを決定します。既定値は "speakers" です。 この属性は入力を持たないノードには 影響しません。

さらに、一部のノードには、チャンネル解釈として可能な 値に関する追加の channelInterpretation 制約があります:

ChannelSplitterNode

チャンネル解釈を "discrete" から変更することはできず、 値を変更しようとすると InvalidStateError 例外を投げなければなりません。

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

context, 型は BaseAudioContext、読み取り専用

この AudioNode を所有する BaseAudioContext。

numberOfInputs, 型は unsigned long、読み取り専用

AudioNode に入力される入力数。 ソースノードでは、これは 0 です。この属性は 多くの AudioNode 型で事前に決定されていますが、 ChannelMergerNode や AudioWorkletNode のような一部の AudioNode は可変数の入力を持ちます。

numberOfOutputs, 型は unsigned long、読み取り専用

AudioNode から出る出力数。この 属性は一部の AudioNode 型では事前に決定されていますが、 ChannelSplitterNode や AudioWorkletNode のように可変である場合もあります。

1.5.5. メソッド

connect(destinationNode, output, input)

ある特定のノードの指定された出力と、 別の特定のノードの指定された入力との間には、1 つの接続しか存在できません。 同じ終端を持つ複数の接続は無視されます。

たとえば:
nodeA.connect(nodeB);
nodeA.connect(nodeB);

は、次と同じ効果を持ちます

nodeA.connect(nodeB);

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

AudioNode.connect(destinationNode, output, input) メソッドの引数。
パラメーター 型 null 許容 省略可能 説明
destinationNode destination パラメーターは、接続先となる AudioNode です。destination パラメーターが、 別の AudioContext を使用して作成された AudioNode である場合、 InvalidAccessError を投げなければなりません。つまり、AudioNode を AudioContext 間で共有することはできません。 複数の AudioNode を同じ AudioNode へ接続できます。これについてはチャンネルのアップミックスと ダウンミックスの節で説明します。
output unsigned long ✘ ✔ output パラメーターは、AudioNode のどの出力から接続するかを表すインデックスです。このパラメーターが範囲外の場合、 IndexSizeError 例外を投げなければなりません。 connect() を複数回呼び出すことで、AudioNode の出力を複数の入力へ接続できます。したがって、"fan-out" がサポートされます。
input input パラメーターは、デスティネーション AudioNode のどの入力へ接続するかを表すインデックスです。このパラメーターが範囲外の場合、 IndexSizeError 例外を投げなければなりません。 AudioNode を別の AudioNode へ接続して、循環を作成できます。つまり、ある AudioNode が別の AudioNode へ接続され、それがさらに最初の AudioNode の入力または AudioParam へ接続される場合です。
戻り値の型: AudioNode
connect(destinationParam, output)

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

connect() を複数回呼び出すことで、 AudioNode の出力を複数の AudioParam へ接続できます。したがって、"fan-out" がサポートされます。

connect() を複数回呼び出すことで、複数の AudioNode の出力を 1 つの AudioParam へ接続できます。したがって、"fan-in" がサポートされます。

AudioParam は、それに接続された任意の AudioNode 出力からレンダリングされたオーディオデータを受け取り、 まだモノラルでない場合はダウンミックスによって モノラルに変換し、その後、 他のそのような出力とミックスし、最後に、 パラメーターにスケジュールされたタイムライン変更を含む 固有のパラメーター値(オーディオ接続がない場合に AudioParam が通常持つ value)とミックスします。

モノラルへのダウンミックスは、 channelCount = 1、 channelCountMode = "explicit"、 および channelInterpretation = "speakers" である AudioNode のダウンミックスと同等です。

ある特定のノードの指定された出力と、特定の AudioParam との間には、1 つの接続しか存在できません。 同じ終端を持つ複数の接続は無視されます。

たとえば:
nodeA.connect(param);
nodeA.connect(param);

は、次と同じ効果を持ちます

nodeA.connect(param);
AudioNode.connect(destinationParam, output) メソッドの引数。
パラメーター 型 null 許容 省略可能 説明
destinationParam AudioParam ✘ ✘ destination パラメーターは、接続先となる AudioParam です。このメソッドは destination の AudioParam オブジェクトを返しません。destinationParam が、このメソッドが呼び出された AudioNode を作成した BaseAudioContext とは異なる BaseAudioContext に属する AudioNode に属している場合、InvalidAccessError を投げなければなりません。
output unsigned long ✘ ✔ output パラメーターは、AudioNode のどの出力から接続するかを表すインデックスです。parameter が 範囲外の場合、IndexSizeError 例外を投げなければなりません。
戻り値の型: undefined
disconnect()

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

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

AudioNode の 1 つの出力を、それが接続されている他の任意の AudioNode または AudioParam オブジェクトから切断します。

AudioNode.disconnect(output) メソッドの引数。
パラメーター 型 null 許容 省略可能 説明
output unsigned long ✘ ✘ このパラメーターは、AudioNode のどの出力を切断するかを表すインデックスです。指定された出力から出るすべての接続を切断します。 このパラメーターが範囲外の場合、IndexSizeError 例外を投げなければなりません。
戻り値の型: undefined
disconnect(destinationNode)

AudioNode の、特定のデスティネーション AudioNode へ向かうすべての出力を切断します。

AudioNode.disconnect(destinationNode) メソッドの引数。
パラメーター 型 null 許容 省略可能 説明
destinationNode destinationNode パラメーターは、切断する AudioNode です。指定された destinationNode へ向かうすべての接続を切断します。 destinationNode への接続がない場合、InvalidAccessError 例外を投げなければなりません。
戻り値の型: undefined
disconnect(destinationNode, output)

AudioNode の特定の出力を、あるデスティネーション AudioNode の任意およびすべての入力から切断します。

AudioNode.disconnect(destinationNode, output) メソッドの引数。
パラメーター 型 null 許容 省略可能 説明
destinationNode destinationNode パラメーターは、切断する AudioNode です。指定された出力から destinationNode への接続がない場合、InvalidAccessError 例外を投げなければなりません。
output unsigned long ✘ ✘ output パラメーターは、AudioNode のどの出力から切断するかを表すインデックスです。このパラメーターが範囲外の場合、 IndexSizeError 例外を投げなければなりません。
戻り値の型: undefined
disconnect(destinationNode, output, input)

AudioNode の特定の出力を、ある デスティネーション AudioNode の特定の入力から切断します。

AudioNode.disconnect(destinationNode, output, input) メソッドの引数。
パラメーター 型 null 許容 省略可能 説明
destinationNode destinationNode パラメーターは、切断する AudioNode です。指定された出力から指定された入力への destinationNode との接続がない場合、InvalidAccessError 例外を投げなければなりません。
output unsigned long ✘ ✘ output パラメーターは、AudioNode のどの出力から切断するかを表すインデックスです。このパラメーターが範囲外の場合、 IndexSizeError 例外を投げなければなりません。
input input パラメーターは、デスティネーション AudioNode のどの入力を切断するかを表すインデックスです。このパラメーターが範囲外の場合、 IndexSizeError 例外を投げなければなりません。
戻り値の型: undefined
disconnect(destinationParam)

AudioNode の、特定のデスティネーション AudioParam へ向かうすべての出力を切断します。 この操作が有効になると、この AudioNode が計算済みパラメーター値へ寄与する値は 0 になります。固有の パラメーター値はこの操作の影響を受けません。

AudioNode.disconnect(destinationParam) メソッドの引数。
パラメーター 型 null 許容 省略可能 説明
destinationParam AudioParam ✘ ✘ destinationParam パラメーターは、切断する AudioParam です。destinationParam への接続がない場合、InvalidAccessError 例外を投げなければなりません。
戻り値の型: undefined
disconnect(destinationParam, output)

AudioNode の特定の出力を、特定のデスティネーション AudioParam から切断します。 この操作が有効になると、この AudioNode が計算済みパラメーター値へ寄与する値は 0 になります。固有の パラメーター値はこの操作の影響を受けません。

AudioNode.disconnect(destinationParam, output) メソッドの引数。
パラメーター 型 null 許容 省略可能 説明
destinationParam AudioParam ✘ ✘ destinationParam パラメーターは、切断する AudioParam です。destinationParam への接続がない場合、InvalidAccessError 例外を投げなければなりません。
output unsigned long ✘ ✘ output パラメーターは、AudioNode のどの出力から切断するかを表すインデックスです。parameter が 範囲外の場合、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 インターフェイス

AudioParam は、音量など、 AudioNode の機能の個々の側面を制御します。 パラメーターは、value 属性を使用して 特定の値へ即座に設定できます。または、エンベロープ、音量の フェード、LFO、フィルタースイープ、グレインウィンドウなどのために、 値の変更を非常に正確な時刻( AudioContext の currentTime 属性の時間座標系内)で発生するようスケジュールできます。このようにして、 任意のタイムラインベースのオートメーション曲線を任意の AudioParam に設定できます。さらに、 AudioNode の出力からのオーディオ信号を AudioParam に接続して、固有の パラメーター値に加算できます。

一部の合成および処理用 AudioNode は、値をオーディオサンプルごとに考慮しなければならない AudioParam を属性として持ちます。その他の AudioParam では、サンプル精度は重要ではなく、 値の変化をより粗い間隔でサンプリングできます。個々の AudioParam は、値をオーディオサンプルごとに考慮しなければならないことを意味する a-rate パラメーターであるか、 または k-rate パラメーターであるかを指定します。

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

各レンダー量子について、 k-rate パラメーターの値は 最初のサンプルフレームの時刻でサンプリングしなければならず、 その値をブロック全体で使用しなければなりません。 a-rate パラメーターは ブロックの各サンプルフレームについてサンプリングしなければなりません。 AudioParam によっては、そのレートを automationRate 属性を "a-rate" または "k-rate" のいずれかに設定することで制御できます。 詳細については、個々の AudioParam の説明を参照してください。

各 AudioParam には、パラメーターの単純な公称 範囲をともに形成する minValue および maxValue 属性があります。実質的に、 パラメーターの値は \([\mathrm{minValue}, \mathrm{maxValue}]\) の範囲にクランプされます。完全な詳細については § 1.6.3 値の計算を参照してください。

多くの AudioParam では、minValue および maxValue は、可能な最大範囲に設定することを意図しています。この場合、 maxValue は 3.4028235e38 である 最大正単精度浮動小数点値に設定するべきです。 (ただし、IEEE-754 倍精度 浮動小数点値のみをサポートする JavaScript では、これは 3.4028234663852886e38 と記述しなければなりません。) 同様に、minValue は、最大正単精度浮動小数点値の負の値である 最小負単精度浮動小数点値、すなわち -3.4028235e38 に設定するべきです。 (同様に、JavaScript では -3.4028234663852886e38 と記述しなければなりません。)

AudioParam は、0 個以上のオートメーションイベントのリストを保持します。各オートメーションイベントは、 AudioContext の currentTime 属性の時間座標系における、その オートメーションイベント時刻に関連して、 特定の時間範囲にわたるパラメーター値の変更を指定します。 オートメーションイベントのリストは、オートメーションイベント時刻の 昇順で保持されます。

特定のオートメーションイベントの動作は、 AudioContext の現在時刻、およびこのイベントとリスト内の隣接イベントの オートメーションイベント時刻の関数です。次の オートメーションメソッドは、メソッド固有の型の 新しいイベントをイベントリストへ追加することで、 イベントリストを変更します:

これらのメソッドを呼び出すとき、次の規則が適用されます:

注: AudioParam 属性は、value 属性を除き、読み取り専用です。

AudioParam のオートメーションレートは、 automationRate 属性を次の値のいずれかに設定することで選択できます。 ただし、一部の AudioParam には、オートメーションレートを変更できるかどうかに 制約があります。

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

各 AudioParam は内部スロット [[current value]] を持ち、 初期値として AudioParam の defaultValue が設定されます。

[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

AudioParam の playbackRate および detune は "k-rate" でなければなりません。 レートを "a-rate" に変更した場合、InvalidStateError を投げなければなりません。

DynamicsCompressorNode

AudioParam の threshold、 knee、 ratio、 attack、 および release は "k-rate" でなければなりません。 レートを "a-rate" に変更した場合、InvalidStateError を投げなければなりません。

PannerNode

panningModel が "HRTF" の場合、 PannerNode の任意の AudioParam に対する automationRate の設定は無視されます。 同様に、AudioListener の任意の AudioParam に対する automationRate の設定も無視されます。この 場合、AudioParam は automationRate が "k-rate" に設定されているかのように動作します。

defaultValue, 型は float、読み取り専用

value 属性の初期値。

maxValue, 型は float、読み取り専用

パラメーターが取り得る公称最大値。 minValue とともに、このパラメーターの公称範囲を形成します。

minValue, 型は float、読み取り専用

パラメーターが取り得る公称最小値。 maxValue とともに、このパラメーターの公称範囲を形成します。

value, 型は float

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

この属性を取得すると、 [[current value]] スロットの内容が返されます。返される値のアルゴリズムについては § 1.6.3 値の計算を参照してください。

この属性を設定すると、要求された値を [[current value]] スロットに割り当て、 現在の AudioContext の currentTime と [[current value]] を使用してsetValueAtTime() メソッドを呼び出したのと同じ効果があります。 setValueAtTime() によって投げられる例外は、 この属性の設定時にも投げられます。

1.6.2. メソッド

cancelAndHoldAtTime(cancelTime)

これは cancelScheduledValues() と同様に、cancelTime 以上の時刻を持つ、スケジュール済みのすべての パラメーター変更をキャンセルします。 ただしさらに、cancelTime で発生するはずだったオートメーション値が、 他のオートメーションイベントが導入されるまで、 その後のすべての時刻へ伝播されます。

オートメーションが実行中で、 cancelAndHoldAtTime() を呼び出した後、 cancelTime に到達する前の任意の時点で新しいオートメーションを導入できる場合の cancelAndHoldAtTime() に対するタイムラインの動作は非常に複雑です。そのため、 cancelAndHoldAtTime() の動作は次のアルゴリズムで指定します。

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

  2. \(E_2\) を、\(t_c \lt t_2\) を満たす最小の数 \(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\) において setTarget が持つはずの値を使用して、 時刻 \(t_c\) に setValueAtTime イベントを暗黙的に挿入します。 この時刻に 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() メソッドの引数。
パラメーター 型 null 許容 省略可能 説明
cancelTime double ✘ ✘ 以前にスケジュールされたパラメーター変更を、その時刻以降キャンセルする時刻。 これは AudioContext の currentTime 属性と同じ時間座標系の時刻です。cancelTime が負の場合、 RangeError 例外を投げなければなりません。cancelTime が currentTime 未満の場合、 currentTime にクランプされます。
戻り値の型: AudioParam
cancelScheduledValues(cancelTime)

cancelTime 以上の時刻を持つ、スケジュール済みのすべてのパラメーター変更を キャンセルします。スケジュール済みの パラメーター変更をキャンセルするとは、スケジュール済みイベントを イベントリストから削除することを意味します。オートメーションイベント時刻が cancelTime 未満である実行中のオートメーションもキャンセルされ、このような キャンセルでは元の値(そのオートメーションより前の値)が即座に 復元されるため、不連続が発生する可能性があります。 cancelAndHoldAtTime() によってスケジュールされた保持値も、保持時刻が cancelTime より後である場合は削除されます。

setValueCurveAtTime() について、このイベントに対応する startTime および duration をそれぞれ \(T_0\) および \(T_D\) とします。 次に、cancelTime が範囲 \([T_0, T_0 + T_D]\) 内にある場合、そのイベントは タイムラインから削除されます。

AudioParam.cancelScheduledValues() メソッドの引数。
パラメーター 型 null 許容 省略可能 説明
cancelTime double ✘ ✘ 以前にスケジュールされたパラメーター変更を、その時刻以降キャンセルする時刻。 これは AudioContext の currentTime 属性と同じ時間座標系の時刻です。cancelTime が負の場合、 RangeError 例外を投げなければなりません。 cancelTime が currentTime 未満の場合、 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\) が 0 の場合、 \(T_0 \le t \lt T_1\) について \(v(t) = V_0\) です。

これはまた、0 への指数ランプが不可能であることを意味します。 適切に選択された 時定数とともに setTargetAtTime() を使用することで、適切な近似を実現できます。

この ExponentialRampToValue イベントの後にイベントがない場合、\(t \geq T_1\) では \(v(t) = V_1\) です。

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

先行するイベントが SetTarget イベントの場合、\(T_0\) と \(V_0\) は SetTarget オートメーションの現在時刻と値から 選択されます。すなわち、 SetTarget イベントがまだ開始していない場合、\(T_0\) はイベントの 開始時刻、\(V_0\) は SetTarget イベントが開始する直前の値です。この場合、 ExponentialRampToValue イベントは実質的に SetTarget イベントを置き換えます。SetTarget イベントが すでに開始している場合、\(T_0\) は現在のコンテキスト時刻であり、 \(V_0\) は時刻 \(T_0\) における現在の SetTarget オートメーション値です。 どちらの場合も、オートメーション曲線は連続します。

AudioParam.exponentialRampToValueAtTime() メソッドの引数。
パラメーター 型 null 許容 省略可能 説明
value float ✘ ✘ 指定された時刻に、パラメーターが指数ランプで到達する値。この値が 0 と等しい場合、RangeError 例外を投げなければなりません。
endTime double ✘ ✘ 指数ランプが終了する時刻で、 AudioContext の currentTime 属性と同じ時間座標系の時刻です。endTime が負または 有限数でない場合、RangeError 例外を投げなければなりません。endTime が currentTime 未満の場合、 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 パラメーターです。

この LinearRampToValue イベントの後にイベントがない場合、 \(t \geq T_1\) では \(v(t) = V_1\) です。

このイベントに先行するイベントがない場合、線形ランプは、 属性の現在値を value、 linearRampToValueAtTime() が呼び出された時点のコンテキストの currentTime を currentTime として、 setValueAtTime(value, currentTime) が呼び出されたかのように動作します。

先行するイベントが SetTarget イベントの場合、\(T_0\) と \(V_0\) は SetTarget オートメーションの現在時刻と値から 選択されます。すなわち、 SetTarget イベントがまだ開始していない場合、\(T_0\) はイベントの 開始時刻、\(V_0\) は SetTarget イベントが開始する直前の値です。この場合、 LinearRampToValue イベントは実質的に SetTarget イベントを置き換えます。SetTarget イベントが すでに開始している場合、\(T_0\) は現在のコンテキスト時刻であり、 \(V_0\) は時刻 \(T_0\) における現在の SetTarget オートメーション値です。 どちらの場合も、オートメーション曲線は連続します。

AudioParam.linearRampToValueAtTime() メソッドの引数。
パラメーター 型 null 許容 省略可能 説明
value float ✘ ✘ 指定された時刻に、パラメーターが線形ランプで到達する値。
endTime double ✘ ✘ オートメーションが終了する時刻で、 AudioContext の currentTime 属性と同じ時間座標系の時刻です。endTime が負または 有限数でない場合、RangeError 例外を投げなければなりません。endTime が currentTime 未満の場合、 currentTime にクランプされます。
戻り値の型: AudioParam
setTargetAtTime(target, startTime, timeConstant)

指定された時刻に、指定された時定数を持つレートで ターゲット値へ指数的に近づき始めます。用途の 1 つとして、 ADSR エンベロープの「ディケイ」および「リリース」部分を実装するのに有用です。 パラメーター値は指定された時刻に即座にターゲット値へ 変化するのではなく、ターゲット値へ徐々に変化することに注意してください。

時間区間 \(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\)( startTime パラメーター)における初期値([[current value]] 属性)、 \(V_1\) は target パラメーターと等しく、 \(\tau\) は timeConstant パラメーターです。

このイベントの後に LinearRampToValue または ExponentialRampToValue イベントが続く場合、その動作はそれぞれ linearRampToValueAtTime() または exponentialRampToValueAtTime() で説明されています。その他すべてのイベントでは、SetTarget イベントは次のイベントの時刻に終了します。

AudioParam.setTargetAtTime() メソッドの引数。
パラメーター 型 null 許容 省略可能 説明
target float ✘ ✘ 指定された時刻に、パラメーターが変化を開始する先の値。
startTime double ✘ ✘ 指数的な接近を開始する時刻で、 AudioContext の currentTime 属性と同じ時間座標系の時刻です。start が負または 有限数でない場合、RangeError 例外を投げなければなりません。startTime が currentTime 未満の場合、 currentTime にクランプされます。
timeConstant float ✘ ✘ ターゲット値への一次フィルター(指数的)接近の時定数値。 この値が大きいほど、遷移は遅くなります。値は非負でなければならず、そうでなければ RangeError 例外を投げなければなりません。timeConstant が 0 の場合、 出力値は即座に最終値へジャンプします。より正確には、timeConstant は ステップ入力応答(値 0 から 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\) を持つ)が LinearRampToValue または ExponentialRampToValue 型でない場合、\(T_0 \leq t < T_1\) について:

$$
    v(t) = V
$$

言い換えると、この時間区間中、値は一定のままであり、 「ステップ」関数を作成できます。

この SetValue イベントの次のイベントが LinearRampToValue または ExponentialRampToValue 型の場合、それぞれ linearRampToValueAtTime() または exponentialRampToValueAtTime() を参照してください。

AudioParam.setValueAtTime() メソッドの引数。
パラメーター 型 null 許容 省略可能 説明
value float ✘ ✘ 指定された時刻にパラメーターが変化する先の値。
startTime double ✘ ✘ パラメーターが指定された値へ変化する時刻で、 BaseAudioContext の currentTime 属性と同じ時間座標系の時刻です。startTime が負または 有限数でない場合、RangeError 例外を投げなければなりません。startTime が currentTime 未満の場合、 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 &amp;= \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\))、 値は別のオートメーションイベント(存在する場合)が発生するまで、 曲線の最終値で一定のままです。

後続のオートメーションが setValueCurveAtTime() イベントの終了点から開始するように、 時刻 \(T_0 + T_D\)、値 \(V[N-1]\) で setValueAtTime() が暗黙的に呼び出されます。

AudioParam.setValueCurveAtTime() メソッドの引数。
パラメーター 型 null 許容 省略可能 説明
values sequence<float> ✘ ✘ パラメーター値曲線を表す float 値のシーケンス。これらの値は 指定された時刻から指定された継続時間にわたって適用されます。このメソッドが 呼び出されると、オートメーションのために曲線の内部コピーが作成されます。そのため、 渡された配列の内容を後で変更しても AudioParam には影響しません。 この属性が長さ 2 未満の sequence<float> オブジェクトである場合、InvalidStateError を投げなければなりません。
startTime double ✘ ✘ 値曲線の適用を開始する時刻で、 AudioContext の currentTime 属性と同じ時間座標系の開始時刻です。startTime が負または 有限数でない場合、RangeError 例外を投げなければなりません。startTime が currentTime 未満の場合、 currentTime にクランプされます。
duration double ✘ ✘ startTime パラメーターの後に、 values パラメーターに従って値が計算される時間(秒)。duration が厳密に正でない、または 有限数でない場合、RangeError 例外を投げなければなりません。
戻り値の型: AudioParam

1.6.3. 値の計算

AudioParam には 2 種類あり、 単純 パラメーターと複合パラメーターです。 単純パラメーター(既定)は、 AudioNode の最終オーディオ出力を計算するために単独で使用されます。 複合 パラメーターは、他の AudioParam とともに使用され、後で AudioNode の出力を計算する入力として使用される値を計算する AudioParam です。

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

AudioParam の値の計算は、2 つの部分で構成されます:

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

  1. paramIntrinsicValue は各時刻で計算されます。 これは value 属性に直接設定された値、または この時刻以前またはこの時刻と同じ時刻を持つ オートメーション イベントがある場合は、それらのイベントから計算された 値です。指定された時間範囲からオートメーション イベントが削除された場合、 paramIntrinsicValue 値は変更されず、 value 属性が直接設定されるか、 その時間範囲にオートメーションイベントが追加されるまで、 以前の値を保持します。

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

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

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

  5. computedValue を paramComputedValue に設定します。

computedValue の 公称範囲は、 このパラメーターが実質的に取り得る下限値と上限値です。 単純パラメーターでは、 computedValue は このパラメーターの単純な公称 範囲にクランプされます。複合 パラメーターでは、それを構成する異なる AudioParam 値から最終値を計算した後、 公称 範囲にクランプされます。

オートメーションメソッドを使用する場合も、クランプは適用されます。 ただし、オートメーション自体は、クランプがまったく存在しないかのように実行されます。 オートメーション値が出力に適用されるときにのみ、 上記の指定どおりクランプされます。

たとえば、公称範囲 \([0, 1]\) の AudioParam \(p\) を持つノード \(N\) と、 次のオートメーションシーケンスを考えます。
N.p.setValueAtTime(0, 0);
N.p.linearRampToValueAtTime(4, 1);
N.p.linearRampToValueAtTime(0, 2);

曲線の初期傾斜は 4 で、最大値 1 に達するまで続き、 その時点で出力は一定に保持されます。最後に、 時刻 2 付近で曲線の傾斜は -4 になります。これは下のグラフに示されており、 破線はクリッピングがなければ生じていたものを示し、 実線は公称範囲へのクリッピングによる audioparam の 実際に期待される動作を示します。

公称範囲への AudioParam オートメーションのクリッピング
AudioParam オートメーションを公称範囲へクリッピングする例。

1.6.4. AudioParam オートメーションの例

AudioParam オートメーション
パラメーターオートメーションの例。
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 の位置を計算して、// 後続の指数変化を正しい位置から開始し、// ジャンプによる不連続が生じないようにする。仕様より、次を得る。// 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 インターフェイス

このインターフェイスは、 AudioBufferSourceNode、 ConstantSourceNode、 および OscillatorNode などのソースノードに共通する機能を表します。

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

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

AudioScheduledSourceNode は、関連付けられた BaseAudioContext の currentTime が、AudioScheduledSourceNode が開始するよう設定された時刻以上であり、 停止するよう設定された時刻未満であるとき、 再生中であると言います。

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

AudioScheduledSourceNode ノード型へ配送される ended イベント型のイベントハンドラーを設定するために使用されるプロパティ。 ソースノードの再生が停止したとき(具体的なノードによって決定される)、 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 である。

    注: これにより、現在 開始を許可されているものの、 以前は開始を妨げられていた AudioContext を start() が開始できる場合があります。

AudioScheduledSourceNode.start(when) メソッドの引数。
パラメーター 型 null 許容 省略可能 説明
when double ✘ ✔ when パラメーターは、サウンドの再生を開始する時刻(秒)を表します。これは AudioContext の currentTime 属性と同じ時間座標系です。AudioScheduledSourceNode が出力する信号がサウンドの開始時刻に依存する場合、 when の正確な値は常に、最も近いサンプルフレームへ丸めることなく使用されます。 この値に 0 が渡された場合、または値が currentTime 未満の場合、サウンドの再生は直ちに開始されます。when が負の場合、 RangeError 例外を投げなければなりません。
戻り値の型: undefined
stop(when)

正確な時刻にサウンドの再生を停止するようスケジュールします。 stop がすでに呼び出された後に再び呼び出された場合、 最後の呼び出しだけが適用されます。後続の呼び出しより前に バッファーがすでに停止している場合を除き、以前の呼び出しで設定された停止時刻は 適用されません。バッファーがすでに停止している場合、 それ以降の stop 呼び出しは効果を持ちません。 スケジュールされた開始時刻より前に停止時刻へ到達した場合、 サウンドは再生されません。

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

  2. 以下に説明するパラメーター制約により投げなければならない エラーがないか確認します。

  3. パラメーター値をメッセージに含めて、 AudioScheduledSourceNode を停止するための制御メッセージをキューに入れます。

ノードが AudioBufferSourceNode の場合、 AudioBufferSourceNode を停止するための制御 メッセージを実行するとは、 再生 アルゴリズム内の handleStop() 関数を呼び出すことを意味します。
AudioScheduledSourceNode.stop(when) メソッドの引数。
パラメーター 型 null 許容 省略可能 説明
when double ✘ ✔ when パラメーターは、ソースの再生を停止する時刻(秒)を表します。これは AudioContext の currentTime 属性と同じ時間座標系です。この値に 0 が渡された場合、または値が currentTime 未満の場合、サウンドの再生は直ちに停止します。when が負の場合、 RangeError 例外を投げなければなりません。
戻り値の型: undefined

1.8. AnalyserNode インターフェイス

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

プロパティ 値 注記
numberOfInputs 1
numberOfOutputs 1 この出力は未接続のままにできます。
channelCount 2
channelCountMode "max"
channelInterpretation "speakers"
テールタイム なし
[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 で呼び出されたとき、ユーザーエージェントは context と options を引数として、 this の AudioNode を初期化しなければなりません。

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

1.8.2. 属性

fftSize, 型は unsigned long

周波数領域解析に使用する FFT のサイズ(サンプルフレーム単位)。 これは 32 から 32768 の範囲の 2 の累乗でなければならず、そうでなければ IndexSizeError 例外を投げなければなりません。既定値は 2048 です。 大きな FFT サイズは計算コストが高くなる場合があることに注意してください。

fftSize が別の値へ変更された場合、 周波数データの平滑化に関連するすべての状態 (getByteFrequencyData() および getFloatFrequencyData() 用)が リセットされます。つまり、時間方向の平滑化 に使用される前のブロック \(\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() の別の呼び出しが、直前の呼び出しと同じ レンダー量子内で発生した場合、 現在の 周波数データは同じデータで更新されません。代わりに、 以前に計算されたデータが返されます。

符号なしバイト配列に格納される値は、 次の方法で計算されます。現在の周波数 データを FFT の窓関数処理と 平滑化で説明される \(Y[k]\) とします。このときバイト値 \(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 の範囲外にある場合、 \(b[k]\) はその範囲内に収まるようクリップされます。

AnalyserNode.getByteFrequencyData() メソッドの引数。
パラメーター 型 null 許容 省略可能 説明
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 の範囲外にある場合、 \(b[k]\) はその範囲内に収まるようクリップされます。

AnalyserNode.getByteTimeDomainData() メソッドの引数。
パラメーター 型 null 許容 省略可能 説明
array Uint8Array ✘ ✘ 時間領域のサンプルデータのコピー先となるパラメーター。
戻り値の型: undefined
getFloatFrequencyData(array)

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

getFloatFrequencyData() または getByteFrequencyData() の別の呼び出しが、直前の呼び出しと同じ レンダー量子内で発生した場合、 現在の 周波数データは同じデータで更新されません。代わりに、 以前に計算されたデータが返されます。

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

AnalyserNode.getFloatFrequencyData() メソッドの引数。
パラメーター 型 null 許容 省略可能 説明
array Float32Array ✘ ✘ 周波数領域解析データのコピー先となるパラメーター。
戻り値の型: undefined
getFloatTimeDomainData(array)

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

AnalyserNode.getFloatTimeDomainData() メソッドの引数。
パラメーター 型 null 許容 省略可能 説明
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\) をこの AnalyserNode の fftSize 属性の値とします。

Blackman 窓を適用するとは、 入力時間領域データに対して次の操作を行うことです。 \(n = 0, \ldots, N - 1\) に対する \(x[n]\) を時間領域データとします。 Blackman 窓は次のように定義されます:
$$
\begin{align*}
    \alpha &amp;= \mbox{0.16} \\ a_0 &amp;= \frac{1-\alpha}{2} \\
    a_1 &amp;= \frac{1}{2} \\
    a_2 &amp;= \frac{\alpha}{2} \\
    w[n] &amp;= 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"
テールタイム なし

出力のチャンネル数は、 buffer 属性に割り当てられた AudioBuffer のチャンネル数と等しく、 buffer が null の場合は、無音の 1 チャンネルです。

さらに、バッファーが複数のチャンネルを持つ場合、 AudioBufferSourceNode の出力は、次のいずれかの条件が成立する時刻の後にある レンダー量子の開始時点で、無音の 1 チャンネルへ 変更しなければなりません:

AudioBufferSourceNode の再生ヘッド位置は、 バッファー内の最初のサンプルフレームの時間座標に対する、 秒単位の時間オフセットを表す任意の量として定義されます。 このような値は、ノードの playbackRate および detune パラメーターとは独立して考慮されます。 一般に、再生ヘッド位置はサブサンプル精度を持つことができ、 正確なサンプルフレーム位置を参照する必要はありません。0 から バッファーの継続時間までの有効な値を取ることができます。

playbackRate および detune 属性は 複合パラメーター を形成します。 これらは、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 で呼び出されたとき、ユーザーエージェントは context と options を引数として、 this の AudioNode を初期化しなければなりません。

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

1.9.2. 属性

buffer, 型は AudioBuffer、 null 許容

再生するオーディオ資産を表します。

buffer 属性を設定するには、次の手順を実行します:
  1. new buffer を、 buffer に割り当てる AudioBuffer または null 値とします。

  2. new buffer が null でなく、 [[buffer set]] が true の場合、 InvalidStateError を投げて、これらの手順を中止します。

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

  4. new buffer を buffer 属性に割り当てます。

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

detune, 型は AudioParam、 読み取り専用

オーディオストリームがレンダリングされる速度を変調するための、 セント単位の追加パラメーター。このパラメーターは playbackRate とともに computedPlaybackRate を形成する複合 パラメーターです。

loop, 型は boolean

loopStart と loopEnd で指定されたオーディオデータ領域を、 ループで連続的に再生するかどうかを示します。 既定値は false です。

loopEnd, 型は double

loop 属性が true の場合にループを終了する、省略可能な 再生ヘッド 位置。その値はループ内容に含まれません。 既定の value は 0 であり、0 からバッファーの継続時間までの 任意の値に設定すると有用です。 loopEnd が 0 以下である場合、または loopEnd がバッファーの継続時間より大きい場合、 ループはバッファーの終端で終了します。

loopStart, 型は double

loop 属性が true の場合にループを開始する、省略可能な 再生ヘッド位置。 既定の value は 0 であり、0 からバッファーの継続時間までの 任意の値に設定すると有用です。 loopStart が 0 未満の場合、ループは 0 から開始します。 loopStart がバッファーの継続時間より大きい場合、ループは バッファーの終端から開始します。

playbackRate, 型は AudioParam、 読み取り専用

オーディオストリームをレンダリングする速度。これは detune とともに computedPlaybackRate を形成する複合 パラメーターです。

1.9.3. メソッド

start(when, offset, duration)

正確な時刻にサウンドを再生するようスケジュールします。

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

  2. 以下に説明するパラメーター制約により投げなければならない エラーがないか確認します。この手順中に 例外が投げられた場合、 これらの手順を中止します。

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

  4. パラメーター値をメッセージに含めて、 AudioBufferSourceNode を開始するための制御 メッセージをキューに入れます。

  5. buffer が設定されている場合、 buffer の内容を取得します。

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

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

    2. コンテキストが開始を許可されている。

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

    注: これにより、現在 開始を許可されているものの、 以前は開始を妨げられていた AudioContext を start() が開始できる場合があります。

AudioBufferSourceNode を開始するための制御 メッセージを実行するとは、 後述する再生アルゴリズム内の handleStart() 関数を呼び出すことを意味します。
AudioBufferSourceNode.start(when, offset, duration) メソッドの引数。
パラメーター 型 null 許容 省略可能 説明
when double ✘ ✔ when パラメーターは、サウンドの再生を開始する時刻(秒)を 表します。これは AudioContext の currentTime 属性と同じ時間座標系です。この値に 0 が渡された場合、または値が currentTime 未満の場合、サウンドの再生は直ちに開始されます。 when が負の場合、 RangeError 例外を投げなければなりません。
offset double ✘ ✔ offset パラメーターは、再生を開始する 再生ヘッド位置 を指定します。この値に 0 が渡された場合、再生は バッファーの先頭から開始します。offset が負の場合、 RangeError 例外を投げなければなりません。 offset が loopEnd より大きく、 playbackRate が正または 0 で、loop が true の場合、再生は loopEnd から開始します。 offset が loopStart より大きく、 playbackRate が負で、loop が true の場合、再生は loopStart から開始します。 startTime に到達したとき、 offset は暗黙的に [0, duration] にクランプされます。 ここで duration は、この AudioBufferSourceNode の buffer 属性に設定された AudioBuffer の duration 属性の値です。
duration double ✘ ✔ duration パラメーターは再生するサウンドの継続時間を表し、 完全または部分的なループ反復を含む、出力するバッファー内容の合計秒数として表されます。 duration の単位は、 playbackRate の効果とは独立しています。 たとえば、再生レート 0.5 で duration が 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、 null 許容

再生するオーディオ資産。これは buffer を AudioBufferSourceNode の buffer 属性へ割り当てることと同等です。

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 に設定すると、ループ領域のいずれかの部分が 一度再生された後、 loopStart および loopEnd の端点によって定義されるバッファー領域の再生が 無期限に継続します。 loop が true のままである間、 ループ再生は次のいずれかが発生するまで継続します:

ループ本体は、 loopStart から loopEnd まで(ただし loopEnd は含まない)の領域を占めると見なされます。 ループ領域の再生方向は、ノードの再生レートの符号に従います。 正の再生レートでは、 loopStart から loopEnd へループし、負のレートでは loopEnd から loopStart へループします。

ループは、 start() の offset 引数の解釈には影響しません。 再生は常に要求されたオフセットから開始し、 ループは再生中にループ本体へ到達したときにのみ開始します。

有効なループ開始点および終了点は、以下のアルゴリズムで指定されるように、 0 からバッファーの継続時間までの範囲内にある必要があります。 loopEnd にはさらに、loopStart 以上でなければならないという制約があります。 これらの制約のいずれかに違反した場合、 ループはバッファーの内容全体を含むものと見なされます。

ループ端点はサブサンプル精度を持ちます。端点が正確な サンプルフレームオフセット上にない場合、または再生レートが 1 と等しくない場合、ループの再生は、 ループされたオーディオがバッファー内の連続した非ループ領域に存在する場合と同様に、 ループの開始点と終了点を接続するよう補間されます。

ループ関連のプロパティはバッファーの再生中に変更でき、 一般には次のレンダー量子から有効になります。 正確な結果は、後述する規範的な再生アルゴリズムによって 定義されます。

loopStart および loopEnd 属性の既定値はいずれも 0 です。 loopEnd の値 0 はバッファーの長さと等価であるため、 既定の端点ではバッファー全体がループに含まれます。

ループ端点の値はバッファーのサンプルレートに基づく 時間オフセットとして表されることに注意してください。つまり、 これらの値は、再生中に動的に変化できるノードの playbackRate パラメーターとは独立しています。

1.9.6. AudioBuffer 内容の再生

この規範的な節では、次の要因が組み合わさって 再生に影響することを考慮しながら、 バッファー内容の再生を指定します:

AudioBufferSourceNode から出力を生成するために内部で従うアルゴリズムは、 次の原則に従います:

アルゴリズムの説明は次のとおりです:

let buffer; // AudioBuffer employed by this nodelet context; // AudioContext employed by this node// The following variables capture attribute and AudioParam values for the node.// They are updated on a k-rate basis, prior to each invocation of process().let loop;let detune;let loopStart;let loopEnd;let playbackRate;// Variables for the node's playback parameterslet start = 0, offset = 0, duration = Infinity; // Set by start()let stop = Infinity; // Set by stop()// Variables for tracking node's playback statelet bufferTime = 0, started = false, enteredLoop = false;let bufferTimeElapsed = 0;let dt = 1 / context.sampleRate;// Handle invocation of start method callfunction handleStart(when, pos, dur) {    if (arguments.length >= 1) {        start = when;    }    offset = pos;    if (arguments.length >= 3) {        duration = dur;    }}// Handle invocation of stop method callfunction handleStop(when) {    if (arguments.length >= 1) {        stop = when;    } else {        stop = context.currentTime;    }}// Interpolate a multi-channel signal value for some sample frame.// Returns an array of signal values.function playbackSignal(position) {    /*        This function provides the playback signal function for buffer, which is a        function that maps from a playhead position to a set of output signal        values, one for each output channel. If |position| corresponds to the        location of an exact sample frame in the buffer, this function returns        that frame. Otherwise, its return value is determined by a UA-supplied        algorithm that interpolates sample frames in the neighborhood of        |position|.        If |position| is greater than or equal to |loopEnd| and there is no subsequent        sample frame in buffer, then interpolation should be based on the sequence        of subsequent frames beginning at |loopStart|.     */     ...}// Generate a single render quantum of audio to be placed// in the channel arrays defined by output. Returns an array// of |numberOfFrames| sample frames to be output.function process(numberOfFrames) {    let currentTime = context.currentTime; // context time of next rendered frame    const output = []; // accumulates rendered sample frames    // Combine the two k-rate parameters affecting playback rate    const computedPlaybackRate = playbackRate * Math.pow(2, detune / 1200);    // Determine loop endpoints as applicable    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 {        // If the loop flag is false, remove any record of the loop having been entered        enteredLoop = false;    }    // Handle null buffer case    if (buffer == null) {        stop = currentTime; // force zero output for all time    }    // Render each sample frame in the quantum    for (let index = 0; index < numberOfFrames; index++) {        // Check that currentTime and bufferTimeElapsed are        // within allowable range for playback        if (currentTime < start || currentTime >= stop || bufferTimeElapsed >= duration) {            output.push(0); // this sample frame is silent            currentTime += dt;            continue;        }        if (!started) {            // Take note that buffer has started playing and get initial            // playhead position.            if (loop && computedPlaybackRate >= 0 && offset >= actualLoopEnd) {                offset = actualLoopEnd;            }            if (computedPlaybackRate < 0 && loop && offset < actualLoopStart) {                offset = actualLoopStart;            }            bufferTime = offset;            started = true;        }        // Handle loop-related calculations        if (loop) {            // Determine if looped portion has been entered for the first time            if (!enteredLoop) {                if (offset < actualLoopEnd && bufferTime >= actualLoopStart) {                    // playback began before or within loop, and playhead is                    // now past loop start                    enteredLoop = true;                }                if (offset >= actualLoopEnd && bufferTime < actualLoopEnd) {                    // playback began after loop, and playhead is now prior                    // to the loop end                    enteredLoop = true;                }            }            // Wrap loop iterations as needed. Note that enteredLoop            // may become true inside the preceding conditional.            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); // past end of buffer, so output silent frame        }        bufferTime += dt * computedPlaybackRate;        bufferTimeElapsed += dt * computedPlaybackRate;        currentTime += dt;    } // End of render quantum loop    if (currentTime >= stop) {        // End playback state of this node.  No further invocations of process()        // will occur.  Schedule a change to set the number of output channels to 1.    }    return output;}

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

この図は、バッファーの基本的な再生を示しており、 バッファー内の最後のサンプルフレームの後で終了する単純なループを使用しています:

AudioBufferSourceNode の基本的な再生
AudioBufferSourceNode の基本的な再生

この図は playbackRate の補間を示しており、 バッファー内容を半分の速度で再生し、出力サンプルフレームの 1 つおきが補間されます。特に注目すべきなのは、 ループ出力の最後のサンプルフレームで、これは ループ開始点を使用して補間されます:

AudioBufferSourceNode の playbackRate 補間
AudioBufferSourceNode の playbackRate 補間

この図はサンプルレート補間を示しており、 サンプルレートがコンテキストのサンプルレートの 50% であるバッファーを再生し、 バッファーとコンテキストのサンプルレートの差を補正する 計算済み再生レート 0.5 になります。 結果として得られる出力は前の例と同じですが、 理由は異なります。

AudioBufferSourceNode のサンプルレート補間
AudioBufferSourceNode のサンプルレート補間。

この図はサブサンプルオフセット再生を示しており、 バッファー内のオフセットがサンプルフレームのちょうど半分の位置から始まります。 その結果、すべての出力フレームが補間されます:

AudioBufferSourceNode のサブサンプルオフセット再生
AudioBufferSourceNode のサブサンプルオフセット再生

この図はサブサンプルループ再生を示しており、 ループ端点の小数フレームオフセットが、 それらのオフセットを正確なサンプルフレームへの参照であるかのように尊重する バッファー内の補間されたデータ点へどのように対応するかを示します:

AudioBufferSourceNode のサブサンプルループ再生
AudioBufferSourceNode のサブサンプルループ再生

1.10. AudioDestinationNode インターフェイス

これは最終的なオーディオ デスティネーションを表す AudioNode であり、最終的にユーザーが聞くものです。多くの場合、 スピーカーに接続されたオーディオ出力デバイスと見なすことができます。 聞こえるようにレンダリングされたすべてのオーディオは、 AudioContext のルーティング グラフにおける「終端」ノードであるこのノードへルーティングされます。 各 AudioContext には AudioDestinationNode が 1 つだけ存在し、 AudioContext の destination 属性を通じて提供されます。

AudioDestinationNode の出力は 入力を合計することで生成され、 たとえば MediaStreamAudioDestinationNode や MediaRecorder([mediastream-recording]で説明されています)へ、 AudioContext の出力をキャプチャできます。

AudioDestinationNode は、 AudioContext または OfflineAudioContext のデスティネーションにすることができ、 チャンネル プロパティはコンテキストが何であるかによって異なります。

AudioContext の場合、既定値は次のとおりです

プロパティ 値 注記
numberOfInputs 1
numberOfOutputs 1
channelCount 2
channelCountMode "explicit"
channelInterpretation "speakers"
テールタイム いいえ

channelCount は、maxChannelCount 以下の任意の 値に設定できます。 この値が有効範囲内でない場合、 IndexSizeError 例外を投げなければなりません。 具体的な 例として、オーディオハードウェアが 8 チャンネル出力をサポートしている場合、 channelCount を 8 に設定し、8 チャンネルの出力をレンダリングできます。

OfflineAudioContext の場合、既定値は次のとおりです

プロパティ 値 注記
numberOfInputs 1
numberOfOutputs 1
channelCount numberOfChannels
channelCountMode "explicit"
channelInterpretation "speakers"
テールタイム いいえ

ここで numberOfChannels は、 OfflineAudioContext を構築するときに指定されたチャンネル数です。 この 値は変更できません。channelCount が異なる値へ変更された場合、 NotSupportedError 例外を投げなければなりません。

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

1.10.1. 属性

maxChannelCount, 型は unsigned long、読み取り専用

channelCount 属性に設定できる チャンネルの最大数。オーディオ ハードウェアのエンドポイントを表す AudioDestinationNode (通常の場合)は、オーディオハードウェアが マルチチャンネルであれば、2 チャンネルを超えるオーディオを出力できる可能性があります。maxChannelCount は、このハードウェアがサポート可能な チャンネルの最大数です。

1.11. AudioListener インターフェイス

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

positionX、 positionY、 および positionZ パラメーターは、 3D デカルト座標空間におけるリスナーの位置を表します。 PannerNode オブジェクトは、個々のオーディオソースに対するこの相対位置を 空間化に使用します。

forwardX、 forwardY、 および forwardZ パラメーターは、 3D 空間内の方向ベクトルを表します。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、 読み取り専用

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

forwardY, 型は AudioParam、 読み取り専用

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

forwardZ, 型は AudioParam、 読み取り専用

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

positionX, 型は AudioParam、 読み取り専用

3D デカルト座標空間におけるオーディオリスナーの x 座標位置を設定します。

positionY, 型は AudioParam、 読み取り専用

3D デカルト座標空間におけるオーディオリスナーの y 座標位置を設定します。

positionZ, 型は AudioParam、 読み取り専用

3D デカルト座標空間におけるオーディオリスナーの z 座標位置を設定します。

upX, 型は AudioParam、 読み取り専用

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

upY, 型は AudioParam、 読み取り専用

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

upZ, 型は AudioParam、 読み取り専用

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

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 の値に直接設定することと等価です。

したがって、このメソッドが呼び出された時点で、forwardX、 forwardY、 forwardZ、 upX、 upY および upZ AudioParam のいずれかに setValueCurveAtTime() を使用してオートメーションカーブが設定されている場合、 NotSupportedError を 投げなければなりません。

setOrientation() は、3D デカルト座標空間でリスナーがどの方向を向いているかを記述します。前方ベクトルと 上方ベクトルの両方が 提供されます。人間にとって分かりやすく言えば、 前方ベクトルは、人の 鼻がどの方向を向いているかを表します。上方ベクトルは、 人の頭頂部が向いている方向を表します。これら 2 つのベクトルは 線形独立であることが期待されます。これらの値をどのように解釈するかに関する 規範的要件については、§ 6 空間化/パンニングを参照してください。

x、 y、 および z パラメーターは、3D 空間内の前方 方向ベクトルを表し、既定値は (0,0,-1) です。

xUp、 yUp、 および zUp パラメーターは、 3D 空間内の上方方向 ベクトルを表し、既定値は (0,1,0) です。

AudioListener.setOrientation() メソッドの引数。
パラメーター 型 null 許容 省略可能 説明
x float ✘ ✘ AudioListener の前方 x 方向
y float ✘ ✘ AudioListener の前方 y 方向
z float ✘ ✘ AudioListener の前方 z 方向
xUp float ✘ ✘ AudioListener の上方 x 方向
yUp float ✘ ✘ AudioListener の上方 y 方向
zUp float ✘ ✘ AudioListener の上方 z 方向
戻り値の型: undefined
setPosition(x, y, z)

このメソッドは非推奨です。これは、 positionX.value、 positionY.value、 および positionZ.value を、それぞれ指定された x、y、および z の値に直接設定することと等価です。

したがって、この AudioListener の positionX、 positionY、 および positionZ AudioParam のいずれかに、 このメソッドが呼び出された時点で setValueCurveAtTime() を使用してオートメーションカーブが設定されている場合、 NotSupportedError を 投げなければなりません。

setPosition() は、3D デカルト座標 空間内でリスナーの位置を設定します。PannerNode オブジェクトは、個々のオーディオソースに対するこの相対位置を 空間化に使用します。

x、 y、 および z パラメーターは、3D 空間内の座標を 表します。

既定値は (0,0,0) です。

AudioListener.setPosition() メソッドの引数。
パラメーター 型 null 許容 省略可能 説明
x float ✘ ✘ AudioListener の位置の x 座標
y float ✘ ✘ AudioListener の位置の y 座標
z float ✘ ✘ AudioListener の位置の z 座標

1.11.3. 処理

AudioListener の パラメーターは AudioNode と接続でき、 また同じグラフ内の PannerNode の 出力にも影響を与えられるため、ノード 順序付けアルゴリズムは処理順序を 計算するときに AudioListener を考慮するべきです。このため、 グラフ内のすべての PannerNode は AudioListener を入力として持ちます。

1.12. AudioProcessingEvent インターフェイス - 非推奨

これは ScriptProcessorNode ノードへ配送される Event オブジェクトです。代替となる AudioWorkletNode は異なるアプローチを使用するため、 ScriptProcessorNode が削除されるときにこれも削除されます。

イベントハンドラーは、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 イベントハンドラー関数のスコープ内のスクリプトコードは、 この AudioBuffer 内のチャンネルデータを表す Float32Array 配列を 変更することが期待されます。このスコープ外でこの AudioBuffer に対して行われた スクリプトによる変更は、可聴効果を 生じません。

playbackTime, 型は double、読み取り専用

AudioContext の currentTime と同じ時間座標系において、オーディオが再生される時刻。

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" です。

frequency と detune はどちらも 複合パラメーター を形成し、どちらも a-rate です。これらは computedFrequency 値を決定するために 一緒に使用されます:

computedFrequency(t) = frequency(t) * pow(2, detune(t) / 1200)
        

この複合パラメーターの 公称範囲は [0, ナイキスト周波数] です。

プロパティ 値 注記
numberOfInputs 1
numberOfOutputs 1
channelCount 2
channelCountMode "max"
channelInterpretation "speakers"
テールタイム あり 入力が 0 でも無音ではないオーディオを出力し続けます。これは IIR フィルターであるため、 フィルターは永続的に 0 でない出力を生成しますが、実際には、出力が十分に 0 に近づいた有限時間後に制限できます。実際の時間は フィルター係数に依存します。

出力のチャンネル数は常に 入力のチャンネル数と等しくなります。

enum BiquadFilterType {
    "lowpass",
    "highpass",
    "bandpass",
    "lowshelf",
    "highshelf",
    "peaking",
    "notch",
    "allpass"
};
        
BiquadFilterType 列挙型の説明
列挙値 説明
"lowpass" ローパス フィルターは、カットオフ周波数より低い周波数を 通過させ、カットオフより高い周波数を減衰させます。 12dB/オクターブのロールオフを持つ標準的な 2 次共振ローパスフィルターを実装します。
frequency

カットオフ周波数

Q

カットオフ周波数で応答がどの程度ピークを持つかを制御します。 大きな値ほど応答のピークが大きくなります。

gain

このフィルター型では使用されません

"highpass" ハイパス フィルターはローパスフィルターの逆です。カットオフ周波数 より高い周波数は通過しますが、カットオフ より低い周波数は減衰します。12dB/オクターブのロールオフを持つ 標準的な 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-rate の AudioParam です。

[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 を指定して呼び出されたとき、ユーザーエージェントは context と options を引数として、 this の AudioNode を初期化 しなければなりません。

BiquadFilterNode.constructor() メソッドの引数。
パラメーター 型 null 許容 省略可能 説明
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\) です。

bandpass、 notch、 allpass、 および peaking フィルターでは、この値は 線形値です。この値はフィルターの帯域幅に 関係するため、正の値であるべきです。 公称範囲は \([0, 3.4028235e38]\) で、上限は 最も正の単精度浮動小数点数です。

これは lowshelf および highshelf フィルターでは使用されません。

パラメーター 値 注記
defaultValue 1
minValue 最も負の単精度浮動小数点数 約 -3.4028235e38。ただし、フィルターごとの実際の制限については上記を 参照してください
maxValue 最も正の単精度浮動小数点数 約 3.4028235e38。ただし、フィルターごとの実際の制限については上記を 参照してください
automationRate "a-rate"
detune, 型は AudioParam、 読み取り専用

周波数に対するセント単位のデチューン値。これは 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 単位です。ゲインは lowshelf、 highshelf、 および peaking フィルターでのみ使用されます。

パラメーター 値 注記
defaultValue 0
minValue 最も負の単精度浮動小数点数 約 -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() メソッドの引数。
パラメーター 型 null 許容 省略可能 説明
frequencyHz Float32Array ✘ ✘ このパラメーターは、応答値を計算する周波数の配列を Hz 単位で指定します。
magResponse Float32Array ✘ ✘ このパラメーターは、線形振幅応答値を受け取る出力配列を指定します。 frequencyHz パラメーター内の値が [0, sampleRate/2] の範囲内でない場合、 ここで sampleRate は sampleRate プロパティの値であり、その AudioContext に対応する magResponse 配列の同じインデックスの値は NaN でなければなりません。
phaseResponse Float32Array ✘ ✘ このパラメーターは、ラジアン単位の位相応答値を受け取る出力配列を指定します。 frequencyHz パラメーター内の値が [0; sampleRate/2] の範囲内でない場合、 ここで sampleRate は sampleRate プロパティの値であり、その AudioContext に対応する phaseResponse 配列の同じインデックスの値は NaN でなければなりません。
戻り値の型: 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 値が発生したことを ユーザーに通知する警告を生成してもかまいません。これは通常、不安定なフィルターを示しています。

上記の伝達関数の係数は、 ノード型ごとに異なります。これらを計算するには、 BiquadFilterNode の AudioParam の computedValue に基づいて、 次の中間変数が必要です。

各フィルター型の 6 つの係数 (\(b_0, b_1, b_2, a_0, a_1, a_2\))は次のとおりです:

"lowpass"
$$
    \begin{align*}
        b_0 &amp;= \frac{1 - \cos\omega_0}{2} \\
        b_1 &amp;= 1 - \cos\omega_0 \\
        b_2 &amp;= \frac{1 - \cos\omega_0}{2} \\
        a_0 &amp;= 1 + \alpha_{Q_{dB}} \\
        a_1 &amp;= -2 \cos\omega_0 \\
        a_2 &amp;= 1 - \alpha_{Q_{dB}}
    \end{align*}
$$
                
"highpass"
$$
    \begin{align*}
        b_0 &amp;= \frac{1 + \cos\omega_0}{2} \\
        b_1 &amp;= -(1 + \cos\omega_0) \\
        b_2 &amp;= \frac{1 + \cos\omega_0}{2} \\
        a_0 &amp;= 1 + \alpha_{Q_{dB}} \\
        a_1 &amp;= -2 \cos\omega_0 \\
        a_2 &amp;= 1 - \alpha_{Q_{dB}}
    \end{align*}
$$
                
"bandpass"
$$
    \begin{align*}
        b_0 &amp;= \alpha_Q \\
        b_1 &amp;= 0 \\
        b_2 &amp;= -\alpha_Q \\
        a_0 &amp;= 1 + \alpha_Q \\
        a_1 &amp;= -2 \cos\omega_0 \\
        a_2 &amp;= 1 - \alpha_Q
    \end{align*}
$$
                
"notch"
$$
    \begin{align*}
        b_0 &amp;= 1 \\
        b_1 &amp;= -2\cos\omega_0 \\
        b_2 &amp;= 1 \\
        a_0 &amp;= 1 + \alpha_Q \\
        a_1 &amp;= -2 \cos\omega_0 \\
        a_2 &amp;= 1 - \alpha_Q
    \end{align*}
$$
                
"allpass"
$$
    \begin{align*}
        b_0 &amp;= 1 - \alpha_Q \\
        b_1 &amp;= -2\cos\omega_0 \\
        b_2 &amp;= 1 + \alpha_Q \\
        a_0 &amp;= 1 + \alpha_Q \\
        a_1 &amp;= -2 \cos\omega_0 \\
        a_2 &amp;= 1 - \alpha_Q
    \end{align*}
$$
                
"peaking"
$$
    \begin{align*}
        b_0 &amp;= 1 + \alpha_Q\, A \\
        b_1 &amp;= -2\cos\omega_0 \\
        b_2 &amp;= 1 - \alpha_Q\,A \\
        a_0 &amp;= 1 + \frac{\alpha_Q}{A} \\
        a_1 &amp;= -2 \cos\omega_0 \\
        a_2 &amp;= 1 - \frac{\alpha_Q}{A}
    \end{align*}
$$
                
"lowshelf"
$$
    \begin{align*}
        b_0 &amp;= A \left[ (A+1) - (A-1) \cos\omega_0 + 2 \alpha_S \sqrt{A})\right] \\
        b_1 &amp;= 2 A \left[ (A-1) - (A+1) \cos\omega_0 )\right] \\
        b_2 &amp;= A \left[ (A+1) - (A-1) \cos\omega_0 - 2 \alpha_S \sqrt{A}) \right] \\
        a_0 &amp;= (A+1) + (A-1) \cos\omega_0 + 2 \alpha_S \sqrt{A} \\
        a_1 &amp;= -2 \left[ (A-1) + (A+1) \cos\omega_0\right] \\
        a_2 &amp;= (A+1) + (A-1) \cos\omega_0 - 2 \alpha_S \sqrt{A})
    \end{align*}
$$
                
"highshelf"
$$
    \begin{align*}
        b_0 &amp;= A\left[ (A+1) + (A-1)\cos\omega_0 + 2\alpha_S\sqrt{A} )\right] \\
        b_1 &amp;= -2A\left[ (A-1) + (A+1)\cos\omega_0 )\right] \\
        b_2 &amp;= A\left[ (A+1) + (A-1)\cos\omega_0 - 2\alpha_S\sqrt{A} )\right] \\
        a_0 &amp;= (A+1) - (A-1)\cos\omega_0 + 2\alpha_S\sqrt{A} \\
        a_1 &amp;= 2\left[ (A-1) - (A+1)\cos\omega_0\right] \\
        a_2 &amp;= (A+1) - (A-1)\cos\omega_0 - 2\alpha_S\sqrt{A}
    \end{align*}
$$
                

1.14. ChannelMergerNode インターフェイス

ChannelMergerNode は、より高度な アプリケーションで使用するためのもので、多くの場合 ChannelSplitterNode と組み合わせて使用されます。

プロパティ 値 注記
numberOfInputs 注記を参照 既定値は 6 ですが、ChannelMergerOptions の numberOfInputs または createChannelMerger で指定された値によって決定されます。
numberOfOutputs 1
channelCount 1 channelCount 制約があります
channelCountMode "explicit" channelCountMode 制約があります
channelInterpretation "speakers"
テールタイム なし

このインターフェイスは、複数のオーディオストリームのチャンネルを 単一のオーディオストリームへ結合するための AudioNode を表します。入力数は可変(既定値は 6)ですが、 すべてを接続する必要はありません。出力は 1 つで、 いずれかの入力がアクティブに処理中の場合、 そのオーディオストリームのチャンネル数は入力数と等しくなります。 どの入力もアクティブに 処理中でない場合、出力は 1 チャンネルの無音です。

複数の入力を 1 つのストリームへ結合するため、 各入力は指定されたミキシング規則に基づいて 1 チャンネル(モノラル)へダウンミックスされます。 未接続の入力も、出力では1 つの無音チャンネルとして数えられます。 入力ストリームを変更しても、出力チャンネルの順序には 影響しません。

たとえば、既定の ChannelMergerNode に 2 つの接続されたステレオ入力がある場合、第 1 および第 2 入力は 結合前にそれぞれモノラルへダウンミックスされます。出力は 6 チャンネルストリームとなり、最初の 2 チャンネルには 最初の 2 つの(ダウンミックスされた)入力が入り、残りのチャンネルは無音になります。

また、ChannelMergerNode は、5.1 サラウンド構成などのマルチチャンネル スピーカー配列向けに、複数のオーディオストリームを特定の順序で 配置するためにも使用できます。マージャーは チャンネルの意味(左、右など)を解釈せず、 入力された順序で単純にチャンネルを結合します。

チャンネルマージャー
ChannelMerger の図
[Exposed=Window]
interface ChannelMergerNode : AudioNode {
    constructor (BaseAudioContext context, optional ChannelMergerOptions options = {});
};
        

1.14.1. コンストラクター

ChannelMergerNode(context, options)

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

ChannelMergerNode.constructor() メソッドの引数。
パラメーター 型 null 許容 省略可能 説明
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.numberOfOutputs または createChannelSplitter で指定された値、あるいは numberOfOutputs メンバーを持つ ChannelSplitterOptions 辞書の constructor によって決定されます。
channelCount numberOfOutputs channelCount 制約があります
channelCountMode "explicit" channelCountMode 制約があります
channelInterpretation "discrete" channelInterpretation 制約があります
テールタイム なし

このインターフェイスは、ルーティンググラフ内の オーディオストリームの個々のチャンネルへアクセスするための AudioNode を表します。入力は 1 つで、「アクティブ」な出力数は 入力オーディオストリームのチャンネル数と等しくなります。たとえば、 ステレオ入力が ChannelSplitterNode に接続されている場合、アクティブな 出力数は 2(左チャンネルから 1 つ、右チャンネルから 1 つ)になります。常に合計 N 個の出力が存在し( AudioContext の createChannelSplitter() メソッドに渡される numberOfOutputs パラメーターによって決定されます)、 この値が指定されない場合の既定数は 6 です。「アクティブ」でない出力は 無音を出力し、通常は 何にも接続されません。

チャンネルスプリッター
ChannelSplitter の図

この例では、スプリッターはチャンネルの意味 (左、右など)を解釈せず、 入力された順序で単純にチャンネルを分割することに注意してください。

ChannelSplitterNode の用途の 1 つは、 各チャンネルの個別のゲイン制御が必要な「マトリックスミキシング」です。

[Exposed=Window]
interface ChannelSplitterNode : AudioNode {
    constructor (BaseAudioContext context, optional ChannelSplitterOptions options = {});
};
        

1.15.1. コンストラクター

ChannelSplitterNode(context, options)

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

ChannelSplitterNode.constructor() メソッドの引数。
パラメーター 型 null 許容 省略可能 説明
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 インターフェイス

このインターフェイスは、出力が 公称的に一定値である定値オーディオソースを表します。一般的な定値ソースノードとして 有用であり、その offset を自動化するか、別のノードを接続することで、構築可能な AudioParam であるかのように使用できます。

このノードの単一の出力は 1 チャンネル(モノラル)で構成されます。

プロパティ 値 注記
numberOfInputs 0
numberOfOutputs 1
channelCount 2
channelCountMode "max"
channelInterpretation "speakers"
テールタイム なし
[Exposed=Window]
interface ConstantSourceNode : AudioScheduledSourceNode {
    constructor (BaseAudioContext context, optional ConstantSourceOptions options = {});
    readonly attribute AudioParam offset;
};
        

1.16.1. コンストラクター

ConstantSourceNode(context, options)

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

ConstantSourceNode.constructor() メソッドの引数。
パラメーター 型 null 許容 省略可能 説明
context BaseAudioContext ✘ ✘ この新しい ConstantSourceNode が関連付けられる BaseAudioContext。
options ConstantSourceOptions ✘ ✔ この ConstantSourceNode の省略可能な初期パラメーター値。

1.16.2. 属性

offset, 型は AudioParam、 読み取り専用

ソースの定値。

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"
テールタイム あり buffer の長さの間、入力が 0 でも無音ではないオーディオを出力し続けます。

このノードの入力はモノラル(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 属性をその値に設定します。

    注: これは、バッファーが normalize 属性の値に従って正規化されることを意味します。

  3. o を新しい AudioNodeOptions 辞書とします。

  4. options 内に channelCount が存在する場合、 o 上の channelCount を同じ値に設定します。

  5. options 内に channelCountMode が存在する場合、 o 上の channelCountMode を同じ値に設定します。

  6. options 内に channelInterpretation が存在する場合、 o 上の channelInterpretation を同じ値に設定します。

  7. c と o を引数として、 this の AudioNode を 初期化します。

ConvolverNode.constructor() メソッドの引数。
パラメーター 型 null 許容 省略可能 説明
context BaseAudioContext ✘ ✘ この新しい ConvolverNode が関連付けられる BaseAudioContext。
options ConvolverOptions ✘ ✔ この ConvolverNode の省略可能な初期パラメーター値。

1.17.2. 属性

buffer, 型は AudioBuffer、 null 許容

この属性が設定された時点で、buffer と normalize 属性の状態を使用して、 指定された正規化を適用したこのインパルス応答で ConvolverNode を構成します。この属性の初期値は null です。

buffer attribute を設定するとき、次の 手順を同期的に実行します:
  1. バッファーの number of channels が 1、2、4 のいずれでもない場合、または バッファーの sample-rate が、それに関連付けられた BaseAudioContext の sample-rate と同じでない場合、 NotSupportedError を投げなければなりません。

  2. AudioBuffer の内容を取得します。

注: buffer が新しいバッファーに設定されると、 オーディオにグリッチが発生する可能性があります。これが望ましくない場合は、 古いものを置き換える新しい ConvolverNode を作成し、 必要に応じて 2 つの間でクロスフェードすることが推奨されます。

注: ConvolverNode がモノラル出力を生成するのは、 入力チャンネルが 1 つで、 1 チャンネルの buffer がある場合だけです。 それ以外のすべての場合、 出力はステレオです。特に、buffer が 4 チャンネルで入力が 2 チャンネルの場合、 ConvolverNode はマトリックス「トゥルー」ステレオ 畳み込みを実行します。規範的な情報については、 チャンネル 構成図を参照してください。

normalize, 型は boolean

buffer 属性が設定されたときに、バッファーからのインパルス応答を 等電力正規化によってスケーリングするかどうかを制御します。 多様なインパルス応答を読み込んだときにコンボルバーから より均一な出力レベルを得るため、既定値は true です。normalize が false に設定された場合、畳み込みは インパルス応答を前処理/スケーリングせずにレンダリングされます。 この値への変更は、次に buffer 属性が設定されるまで有効になりません。

buffer 属性が設定されたとき、 normalize 属性が false の場合、 ConvolverNode は buffer 内に含まれる正確なインパルス応答を使用して 線形畳み込みを実行します。

それ以外で、buffer 属性が設定されたとき、 normalize 属性が true の場合、 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、 null 許容

ConvolverNode に望ましいバッファー。 このバッファーは disableNormalization の値に従って正規化されます。

disableNormalization, 型は boolean、既定値は false

ConvolverNode の normalize 属性に対する望ましい初期値の反対値。

1.17.4. 入力、インパルス応答、および出力のチャンネル構成

実装は、1 または 2 チャンネルの入力でさまざまなリバーブ効果を 実現するため、ConvolverNode における次の許容されるインパルス応答チャンネル構成を サポートしなければなりません。

下の図に示すように、単一チャンネル畳み込みは モノラルオーディオ入力に対して動作し、モノラルインパルス応答を使用して、 モノラル出力を生成します。図の残りの 画像は、入力のチャンネル数が 1 または 2 で、 buffer のチャンネル数が 1、2、または 4 の場合にサポートされる モノラルおよびステレオ再生のケースを示しています。 より複雑で任意のマトリックス処理を必要とする開発者は、 ChannelSplitterNode、 複数の単一チャンネル ConvolverNode および ChannelMergerNode を使用できます。

このノードがアクティブに処理中でない場合、出力は 1 チャンネルの無音です。

注: 下の図は、アクティブに 処理中の場合の出力を示しています。

リバーブのマトリックス処理
ConvolverNode を使用するときにサポートされる入力および出力チャンネル数の 組み合わせを図示したもの。

1.18. DelayNode インターフェイス

ディレイラインはオーディオアプリケーションにおける基本的な構成要素です。 このインターフェイスは、1 つの 入力と 1 つの出力を持つ AudioNode です。

プロパティ 値 注記
numberOfInputs 1
numberOfOutputs 1
channelCount 2
channelCountMode "max"
channelInterpretation "speakers"
テールタイム あり ノードの maxDelayTime まで、入力が 0 でも無音ではないオーディオを出力し続けます。

出力のチャンネル数は常に 入力のチャンネル数と等しくなります。

入力オーディオ信号を一定量遅延させます。 具体的には、各時刻 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 を指定して呼び出されたとき、ユーザーエージェントは context と options を引数として、 this の AudioNode を初期化 しなければなりません。

DelayNode.constructor() メソッドの引数。
パラメーター 型 null 許容 省略可能 説明
context BaseAudioContext ✘ ✘ この新しい DelayNode が関連付けられる BaseAudioContext。
options DelayOptions ✘ ✔ この DelayNode の省略可能な初期パラメーター値。

1.18.2. 属性

delayTime, 型は AudioParam、 読み取り専用

適用する遅延量(秒)を表す AudioParam オブジェクトです。既定の value は 0(遅延なし)です。最小値は 0 で、 最大値は AudioContext の createDelay() メソッドへの maxDelayTime 引数、またはコンストラクター用のDelayOptions 辞書の maxDelayTime メンバーによって決定されます。

DelayNode が循環の一部である場合、 delayTime 属性の値は、最小で 1 レンダー量子にクランプされます。

パラメーター 値 注記
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 から作成されます。

DelayNode に対して DelayWriter を作成するとは、 AudioNode と同じインターフェイスを持ち、 入力オーディオを DelayNode の内部バッファーへ書き込むオブジェクトを作成することを意味します。 これは、作成元の DelayNode と同じ入力接続を持ちます。

DelayNode に対して DelayReader を作成するとは、 AudioNode と同じインターフェイスを持ち、 DelayNode の内部バッファーからオーディオデータを読み取れるオブジェクトを作成することを意味します。 これは、作成元の DelayNode と同じ AudioNode に接続されます。DelayReader は ソースノードです。

入力バッファーを処理するとき、DelayWriter はオーディオを DelayNode の内部バッファーへ書き込まなければなりません。

出力バッファーを生成するとき、DelayReader は、 対応する DelayWriter に delayTime 秒前に書き込まれたオーディオを正確に生成しなければなりません。

注: これは、チャンネル数の変更が 遅延時間の経過後に 反映されることを意味します。

1.19. DynamicsCompressorNode インターフェイス

DynamicsCompressorNode は、ダイナミクス 圧縮エフェクトを実装する AudioNode プロセッサーです。

ダイナミクス圧縮は、音楽制作や ゲームオーディオで非常によく使用されます。信号の最も大きい部分の音量を下げ、 最も小さい部分の音量を上げます。全体として、より大きく、 豊かで、厚みのある音を実現できます。特に、 多数の個別のサウンドを同時に再生するゲームや音楽アプリケーションで、 全体の信号レベルを制御し、 スピーカーへのオーディオ出力のクリッピング(歪み)を避けるために 重要です。

プロパティ 値 注記
numberOfInputs 1
numberOfOutputs 1
channelCount 2 channelCount 制約があります
channelCountMode "clamped-max" channelCountMode 制約があります
channelInterpretation "speakers"
テールタイム あり このノードには、ルックアヘッド遅延により、 入力が 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;
};
        

1.19.1. コンストラクター

DynamicsCompressorNode(context, options)

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

[[internal reduction]] を this 上のプライベートスロットとし、 デシベル単位の浮動小数点数を保持します。[[internal reduction]] を 0.0 に設定します。

DynamicsCompressorNode.constructor() メソッドの引数。
パラメーター 型 null 許容 省略可能 説明
context BaseAudioContext ✘ ✘ この新しい DynamicsCompressorNode が関連付けられる BaseAudioContext。
options DynamicsCompressorOptions ✘ ✔ この DynamicsCompressorNode の省略可能な初期パラメーター値。

1.19.2. 属性

attack, 型は AudioParam、 読み取り専用

ゲインを 10dB 減少させるのにかかる時間(秒)。

パラメーター 値 注記
defaultValue .003
minValue 0
maxValue 1
automationRate "k-rate" オートメーションレート 制約があります
knee, 型は AudioParam、読み取り専用

しきい値を超えて、カーブが「ratio」部分へ 滑らかに遷移する範囲を表すデシベル値。

パラメーター 値 注記
defaultValue 30
minValue 0
maxValue 40
automationRate "k-rate" オートメーションレート 制約があります
ratio, 型は AudioParam、 読み取り専用

出力が 1 dB 変化するために必要な入力の dB 変化量。

パラメーター 値 注記
defaultValue 12
minValue 1
maxValue 20
automationRate "k-rate" オートメーションレート 制約があります
reduction, 型は float、読み取り専用

メータリング用途の読み取り専用デシベル値で、 コンプレッサーが現在信号に適用している ゲインリダクション量を表します。信号が入力されていない場合、 値は 0(ゲインリダクションなし)になります。この属性を読み取ると、 プライベートスロット [[internal reduction]] の値を返します。

release, 型は AudioParam、 読み取り専用

ゲインを 10dB 増加させるのにかかる時間(秒)。

パラメーター 値 注記
defaultValue .25
minValue 0
maxValue 1
automationRate "k-rate" オートメーションレート 制約があります
threshold, 型は AudioParam、 読み取り専用

これを超えると圧縮が効果を発揮し始めるデシベル値。

パラメーター 値 注記
defaultValue -24
minValue -100
maxValue 0
automationRate "k-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 グラフが内部で使用されます。 input と output はそれぞれ入力および出力の AudioNode、 context はこの 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 つのスロットを持ちます。これらの値はこのアルゴリズムの呼び出し間でも保持されます。

次のアルゴリズムにより、オーディオの 1 レンダー 量子について、入力の各サンプルごとの reduction gain の値を決定できます。
  1. attack と release を、それぞれ処理時に サンプリングされた attack と release の値(これらは k-rate パラメーターです)に、この DynamicsCompressorNode が関連付けられている BaseAudioContext のサンプルレートを乗算した値とします。

  2. detector average をスロット [[detector average]] の値とします。

  3. compressor gain をスロット [[compressor gain]] の値とします。

  4. 処理するレンダー量子の各入力サンプル input について、 次の手順を実行します:

    1. input の絶対値が 0.0001 未満の場合、attenuation を 1.0 とします。それ以外の場合、 shaped input を input の絶対値に圧縮カーブを適用した値とします。 attenuation を shaped input を input の絶対値で除算した値とします。

    2. attenuation が compressor gain より大きい場合は releasing を true、 それ以外の場合は false とします。

    3. detector rate を、 attenuation に 検出カーブを適用した結果とします。

    4. attenuation から detector average を減算し、その結果に detector rate を乗算します。この新しい結果を detector average に加算します。

    5. detector average を最大 1.0 にクランプします。

    6. envelope rate を、attack と release の値に基づいて エンベロープレートを計算した結果とします。

    7. releasing が true の場合、 compressor gain を compressor gain と envelope rate の積に設定し、 最大 1.0 にクランプします。

    8. それ以外で、releasing が false の場合、 gain increment を detector average から compressor gain を引いた値とします。gain increment に envelope rate を乗算し、その結果を compressor gain に加算します。

    9. reduction gain を、compressor gain と メイクアップ ゲインを計算した戻り値との積として計算します。

    10. metering gain を、reduction gain をデシベルへ 変換した値として計算します。

  5. [[compressor gain]] を compressor gain に設定します。

  6. [[detector average]] を detector average に設定します。

  7. 内部スロット [[internal reduction]] を metering gain の値にアトミックに設定します。

    注: この手順により、メータリングゲインは ブロック処理の最後に、ブロックごとに 1 回 更新されます。

メイクアップゲインは、コンプレッサーのレシオ、 ニー、およびしきい値パラメーターにのみ依存し、 入力信号には依存しない固定ゲイン段です。ここでの目的は、 コンプレッサーの出力レベルを上げて、 入力レベルと同程度にすることです。

メイクアップ ゲインを計算するとは、次の手順を実行することを意味します:
  1. full range gain を、値 1.0 に 圧縮カーブを適用して返された値とします。

  2. full range makeup gain を full range gain の逆数とします。

  3. full range makeup gain の 0.6 乗を取った結果を返します。

エンベロープ レートを計算するには、 compressor gain と detector average の比に 関数を適用します。ユーザーエージェントは エンベロープ関数の形状を選択できます。ただし、この 関数は次の制約を満たさなければなりません:

この操作は、この関数を compressor gain と detector average の比に適用して計算した値を返します。

アタックまたはリリース時の変化率に 検出 カーブを適用することで、 アダプティブリリースを実装できます。これは次の 制約を満たさなければならない関数です:

注: たとえば、 圧縮が強いほど速くリリースする アダプティブリリースを行うコンプレッサーや、 アタックとリリースで異なる形状のカーブを持つコンプレッサーも 許可されます。

値に 圧縮 カーブを適用するとは、 このサンプルを関数に渡したときの値を計算し、 計算された値を返すことを意味します。この関数は次の 特性を満たさなければなりません:
  1. threshold と knee を、 それぞれ threshold と knee の値を線形 単位へ変換し、このブロックの処理時に (k-rate パラメーターとして)サンプリングした値とします。

  2. threshold と knee の合計も、このブロックの処理時に (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 つの入力と 1 つの出力を持つ AudioNode です:

プロパティ 値 注記
numberOfInputs 1
numberOfOutputs 1
channelCount 2
channelCountMode "max"
channelInterpretation "speakers"
テールタイム なし

GainNode の入力データの各チャンネルの各サンプルには、 gain AudioParam の computedValue を 乗算しなければなりません。

[Exposed=Window]
interface GainNode : AudioNode {
    constructor (BaseAudioContext context, optional GainOptions options = {});
    readonly attribute AudioParam gain;
};
        

1.20.1. コンストラクター

GainNode(context, options)

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

GainNode.constructor() メソッドの引数。
パラメーター 型 null 許容 省略可能 説明
context BaseAudioContext ✘ ✘ この新しい GainNode が関連付けられる BaseAudioContext。
options GainOptions ✘ ✔ この GainNode の省略可能な初期パラメーター値。

1.20.2. 属性

gain, 型は AudioParam、読み取り専用

適用するゲイン量を表します。

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 フィルターが 適切なことがあります。

作成後は、IIR フィルターの係数を変更できません。

プロパティ 値 注記
numberOfInputs 1
numberOfOutputs 1
channelCount 2
channelCountMode "max"
channelInterpretation "speakers"
テールタイム あり 入力が 0 でも無音ではないオーディオを出力し続けます。これは IIR フィルターであるため、 フィルターは永続的に 0 でない出力を生成しますが、実際には、出力が十分に 0 に近くなる有限時間後に制限できます。実際の時間は フィルター係数に依存します。

出力のチャンネル数は常に 入力のチャンネル数と等しくなります。

[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 を指定して呼び出されたとき、ユーザーエージェントは context と options を引数として、 this の AudioNode を初期化 しなければなりません。

IIRFilterNode.constructor() メソッドの引数。
パラメーター 型 null 許容 省略可能 説明
context BaseAudioContext ✘ ✘ この新しい IIRFilterNode が関連付けられる BaseAudioContext。
options IIRFilterOptions ✘ ✘ この IIRFilterNode の初期パラメーター値。

1.21.2. メソッド

getFrequencyResponse(frequencyHz, magResponse, phaseResponse)

現在のフィルターパラメーター 設定が与えられると、指定された周波数について 周波数応答を同期的に計算します。3 つのパラメーターは 同じ長さの Float32Array でなければならず、そうでない場合は InvalidAccessError を投げなければなりません。

IIRFilterNode.getFrequencyResponse() メソッドの引数。
パラメーター 型 null 許容 省略可能 説明
frequencyHz Float32Array ✘ ✘ このパラメーターは、応答値を計算する周波数の配列を Hz 単位で指定します。
magResponse Float32Array ✘ ✘ このパラメーターは、線形振幅応答値を受け取る出力配列を指定します。 frequencyHz パラメーター内の値が [0, sampleRate/2] の範囲内でない場合、 ここで sampleRate は sampleRate プロパティの値であり、その AudioContext に対応する magResponse 配列の同じインデックスの値は NaN でなければなりません。
phaseResponse Float32Array ✘ ✘ このパラメーターは、ラジアン単位の位相応答値を受け取る出力配列を指定します。 frequencyHz パラメーター内の値が [0; sampleRate/2] の範囲内でない場合、 ここで sampleRate は sampleRate プロパティの値であり、その AudioContext に対応する phaseResponse 配列の同じインデックスの値は NaN でなければなりません。
戻り値の型: 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 のフィードフォワード係数。 このメンバーは必須です。その他の制約については createIIRFilter() の feedforward 引数を参照してください。

feedback, 型は sequence<double>

IIRFilterNode のフィードバック係数。 このメンバーは必須です。その他の制約については createIIRFilter() の feedback 引数を参照してください。

1.21.4. フィルター定義

\(b_m\) を feedforward 係数、 \(a_n\) を createIIRFilter() または IIRFilterOptions 辞書で constructor に指定された feedback 係数とします。 このとき、一般的な 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 であってはなりません(createIIRFilter() の feedback parameter を参照してください)。 \(b_m\) の少なくとも 1 つは 0 以外でなければなりません(createIIRFilter() の feedforward parameter を参照してください)。

同等に、時間領域方程式は次のとおりです:

$$
    \sum_{k=0}^{N} a_k y(n-k) = \sum_{k=0}^{M} b_k x(n-k)
$$
        

フィルターの初期状態は全要素が 0 の状態です。

注: UA は、フィルター状態で NaN 値が発生したことを ユーザーに通知する警告を生成してもかまいません。これは通常、不安定なフィルターを示しています。

1.22. MediaElementAudioSourceNode インターフェイス

このインターフェイスは、 audio または video 要素からのオーディオソースを表します。

プロパティ 値 注記
numberOfInputs 0
numberOfOutputs 1
テールタイム参照 なし

出力のチャンネル数は、 HTMLMediaElement が参照するメディアのチャンネル数に対応します。 したがって、メディア要素の src 属性を変更すると、このノードが出力するチャンネル数が 変化する可能性があります。

HTMLMediaElement のサンプルレートが、関連付けられた AudioContext のサンプルレートと異なる場合、 HTMLMediaElement からの出力は、コンテキストの sample rate に一致するようリサンプリングしなければなりません。

MediaElementAudioSourceNode は、AudioContext の createMediaElementSource() メソッド、または MediaElementAudioSourceOptions 辞書の mediaElement メンバーを constructor に使用して、指定された HTMLMediaElement から作成されます。

単一出力のチャンネル数は、 createMediaElementSource() の引数として渡された HTMLMediaElement が参照するオーディオのチャンネル数と等しく、 HTMLMediaElement にオーディオがない場合は 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. context と options を引数として、 this の AudioNode を 初期化します。

MediaElementAudioSourceNode.constructor() メソッドの引数。
パラメーター 型 null 許容 省略可能 説明
context AudioContext ✘ ✘ この新しい MediaElementAudioSourceNode が関連付けられる AudioContext。
options MediaElementAudioSourceOptions ✘ ✘ この MediaElementAudioSourceNode の初期パラメーター値。

1.22.2. 属性

mediaElement, 型は HTMLMediaElement、読み取り専用

この MediaElementAudioSourceNode を構築するときに使用された HTMLMediaElement。

1.22.3. MediaElementAudioSourceOptions

これは MediaElementAudioSourceNode を構築するときに使用するオプションを指定します。

dictionary MediaElementAudioSourceOptions {
    required HTMLMediaElement mediaElement;
};
        
1.22.3.1. MediaElementAudioSourceOptions 辞書のメンバー
mediaElement, 型は HTMLMediaElement

再ルーティングされるメディア要素。これは指定しなければなりません。

1.22.4. MediaElementAudioSourceNode とクロスオリジンリソースのセキュリティ

HTMLMediaElement はクロスオリジン リソースの再生を可能にします。Web Audio ではリソースの内容を 検査できるため(たとえば MediaElementAudioSourceNode と AudioWorkletNode または ScriptProcessorNode を使用してサンプルを読み取るなど)、ある オリジンのスクリプトが 別の オリジンのリソースの内容を 検査すると、情報漏えいが発生する可能性があります。

これを防ぐため、MediaElementAudioSourceNode は、 fetch アルゴリズム [FETCH] の実行によって リソースが CORS-cross-origin とラベル付けされた HTMLMediaElement を使用して作成されている場合、 HTMLMediaElement の通常の出力の代わりに無音を出力しなければなりません。

1.23. MediaStreamAudioDestinationNode インターフェイス

このインターフェイスは、kind が "audio" である 単一の MediaStreamTrack を持つ MediaStream を表すオーディオデスティネーションです。この MediaStream はノードの作成時に作成され、 stream 属性を介してアクセスできます。このストリームは、 getUserMedia() を介して取得された MediaStream と同様の方法で使用でき、たとえば RTCPeerConnection( [webrtc]で説明されています)の addStream() メソッドを使用して リモートピアへ送信できます。

プロパティ 値 注記
numberOfInputs 1
numberOfOutputs 0
channelCount 2
channelCountMode "explicit"
channelInterpretation "speakers"
テールタイム なし

入力のチャンネル数は既定では 2(ステレオ)です。

[Exposed=Window]
interface MediaStreamAudioDestinationNode : AudioNode {
    constructor (AudioContext context, optional AudioNodeOptions options = {});
    readonly attribute MediaStream stream;
};
        

1.23.1. コンストラクター

MediaStreamAudioDestinationNode(context, options)
  1. context と options を引数として、 this の AudioNode を 初期化します。

MediaStreamAudioDestinationNode.constructor() メソッドの引数。
パラメーター 型 null 許容 省略可能 説明
context AudioContext ✘ ✘ この新しい MediaStreamAudioDestinationNode が関連付けられる BaseAudioContext。
options AudioNodeOptions ✘ ✔ この MediaStreamAudioDestinationNode の省略可能な初期パラメーター値。

1.23.2. 属性

stream, 型は MediaStream、読み取り専用

ノード自体と同じ チャンネル数を持ち、kind 属性の値が "audio" である 単一の MediaStreamTrack を含む MediaStream。

1.24. MediaStreamAudioSourceNode インターフェイス

このインターフェイスは、 MediaStream からのオーディオソースを表します。

プロパティ 値 注記
numberOfInputs 0
numberOfOutputs 1
テールタイム参照 なし

出力のチャンネル数は、 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. options の mediaStream メンバーが、 kind 属性の値が "audio" である MediaStreamTrack を少なくとも 1 つ持つ MediaStream を参照していない場合、 InvalidStateError を投げてこれらの手順を中止します。それ以外の場合、 このストリームを inputStream とします。

  2. tracks を、 inputStream のすべての MediaStreamTrack のうち、kind が "audio" であるもののリストとします。

  3. tracks 内の要素を、その id 属性に基づいて、コード単位 値のシーケンス上の順序を使用して並べ替えます。

  4. context と options を引数として、 this の AudioNode を 初期化します。

  5. この MediaStreamAudioSourceNode 上の内部スロット [[input track]] を tracks の最初の要素に設定します。 これがこの MediaStreamAudioSourceNode の入力オーディオとして使用されるトラックです。

構築後、コンストラクターへ渡された MediaStream に変更があっても、この AudioNode の基盤となる出力には影響しません。

スロット [[input track]] は、MediaStreamTrack への参照を保持するためだけに使用されます。

注: これは、 このコンストラクターへ渡された MediaStream から、MediaStreamAudioSourceNode のコンストラクターによって選択されたトラックを削除しても、 MediaStreamAudioSourceNode は引き続き同じトラックから 入力を取得することを意味します。

注: 出力するトラックを選択する動作は、 レガシー上の理由から任意です。入力として使用するトラックを明示するには、 代わりに MediaStreamTrackAudioSourceNode を使用できます。

MediaStreamAudioSourceNode.constructor() メソッドの引数。
パラメーター 型 null 許容 省略可能 説明
context AudioContext ✘ ✘ この新しい MediaStreamAudioSourceNode が関連付けられる AudioContext。
options MediaStreamAudioSourceOptions ✘ ✘ この MediaStreamAudioSourceNode の初期パラメーター値。

1.24.2. 属性

mediaStream, 型は MediaStream、読み取り専用

この MediaStreamAudioSourceNode を構築するときに使用された MediaStream。

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
テールタイム参照 なし

出力のチャンネル数は、 mediaStreamTrack のチャンネル数に対応します。

MediaStreamTrack のサンプルレートが、関連付けられた AudioContext のサンプルレートと異なる場合、 mediaStreamTrack の出力は、 コンテキストの sample rate に一致するようリサンプリングされます。

[Exposed=Window]
interface MediaStreamTrackAudioSourceNode : AudioNode {
    constructor (AudioContext context, MediaStreamTrackAudioSourceOptions options);
};
        

1.25.1. コンストラクター

MediaStreamTrackAudioSourceNode(context, options)
  1. mediaStreamTrack の kind 属性が "audio" でない場合、 InvalidStateError を投げてこれらの手順を中止します。

  2. context と options を引数として、 this の AudioNode を 初期化します。

MediaStreamTrackAudioSourceNode.constructor() メソッドの引数。
パラメーター 型 null 許容 省略可能 説明
context AudioContext ✘ ✘ この新しい MediaStreamTrackAudioSourceNode が関連付けられる AudioContext。
options MediaStreamTrackAudioSourceOptions ✘ ✘ この MediaStreamTrackAudioSourceNode の初期パラメーター値。

1.25.2. MediaStreamTrackAudioSourceOptions

これは MediaStreamTrackAudioSourceNode を構築するためのオプションを指定します。これは 必須です。

dictionary MediaStreamTrackAudioSourceOptions {
    required MediaStreamTrack mediaStreamTrack;
};
        
1.25.2.1. MediaStreamTrackAudioSourceOptions 辞書のメンバー
mediaStreamTrack, 型は MediaStreamTrack

ソースとして機能するメディアストリームトラック。この MediaStreamTrack の kind 属性が "audio" でない場合、InvalidStateError を投げなければなりません。

1.26. OscillatorNode インターフェイス

OscillatorNode は周期波形を生成するオーディオソースを 表します。一般的に使用されるいくつかの波形に設定できます。 さらに、PeriodicWave オブジェクトを使用して、任意の周期 波形に設定できます。

オシレーターは、オーディオ 合成における一般的な基本構成要素です。OscillatorNode は、 start() メソッドで指定された時刻に音を出し始めます。

数学的に言えば、連続時間周期波形は、 周波数領域で考えると非常に高い(または無限に高い)周波数情報を 持つことがあります。この波形を特定のサンプルレートで 離散時間デジタルオーディオ信号としてサンプリングする場合、 波形をデジタル形式へ変換する前に、 ナイキスト周波数より高い高周波 情報を破棄(フィルタリング)するよう注意しなければなりません。 これを行わない場合、エイリアシングにより、 ナイキスト 周波数より高い周波数が鏡像として折り返され、 ナイキスト 周波数より低い周波数に現れます。多くの場合、これにより 聴感上好ましくないアーティファクトが発生します。これはオーディオ DSP の 基本的でよく理解された原則です。

実装がこのエイリアシングを回避するために採用できる 実用的なアプローチはいくつかあります。アプローチにかかわらず、 理想化された離散時間デジタルオーディオ信号は数学的に 明確に定義されています。実装にとってのトレードオフは、 実装コスト(CPU 使用量の観点)と、この理想を 実現する忠実度との間の問題です。

実装はこの理想を達成するために一定の配慮を行うことが 期待されますが、低性能なハードウェアでは、より低品質で コストの低いアプローチを検討することも合理的です。

frequency と detune はどちらも a-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"
テールタイム なし
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 を指定して呼び出されたとき、ユーザーエージェントは context と options を引数として、 this の AudioNode を初期化 しなければなりません。

OscillatorNode.constructor() メソッドの引数。
パラメーター 型 null 許容 省略可能 説明
context BaseAudioContext ✘ ✘ この新しい OscillatorNode が関連付けられる BaseAudioContext。
options OscillatorOptions ✘ ✔ この OscillatorNode の省略可能な初期パラメーター値。

1.26.2. 属性

detune, 型は AudioParam、 読み取り専用

frequency を指定された量だけオフセットする デチューン値(セント単位)です。既定の value は 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、 読み取り専用

周期波形の周波数(ヘルツ単位)。既定の value は 440 です。このパラメーターは a-rate です。 detune と 複合パラメーターを形成し、 computedOscFrequency を形成します。その 公称範囲 は [-ナイキスト 周波数, ナイキスト周波数] です。

type, 型は OscillatorType

周期波形の形状です。これは、"custom" を除く 任意の型定数値に直接設定できます。 そうすると、 InvalidStateError 例外を投げなければなりません。 setPeriodicWave() メソッドを 使用してカスタム波形を設定でき、その結果、この属性は "custom" に設定されます。 既定値は "sine" です。 この 属性が設定されるとき、オシレーターの位相は保持されなければなりません。

1.26.3. メソッド

setPeriodicWave(periodicWave)

PeriodicWave を指定して、任意のカスタム周期波形を設定します。

OscillatorNode.setPeriodicWave() メソッドの引数。
パラメーター 型 null 許容 省略可能 説明
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 の初期 detune 値。

frequency, 型は float、既定値は 440

OscillatorNode の初期周波数。

periodicWave, 型は PeriodicWave

OscillatorNode のための PeriodicWave。 これが指定された場合、 type の有効な値はすべて無視され、 "custom" が指定されたものとして扱われます。

type, 型は OscillatorType、既定値は "sine"

構築するオシレーターの型。periodicWave も指定せずにこれを "custom" に設定した場合、 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 インターフェイス

このインターフェイスは、入力オーディオ ストリームを 3 次元空間内で配置 / 空間化する処理ノードを表します。 空間化は、BaseAudioContext の AudioListener (listener 属性)に対して行われます。

プロパティ 値 注記
numberOfInputs 1
numberOfOutputs 1
channelCount 2 channelCount 制約があります
channelCountMode "clamped-max" channelCountMode 制約があります
channelInterpretation "speakers"
テールタイム 場合による panningModel が "HRTF" に設定されている場合、頭部応答に固有の処理により、 ノードは無音入力に対して無音でない出力を生成します。それ以外の場合、テールタイムは 0 です。

このノードの入力はモノラル(1 チャンネル)またはステレオ(2 チャンネル)のいずれかであり、増やすことはできません。チャンネル数が少ない または多いノードからの接続は適切にアップミックスまたはダウンミックス されます。

ノードがアクティブに処理中の場合、このノードの出力は ステレオ(2 チャンネル)に固定され、構成できません。ノードが アクティブに 処理中でない場合、出力は 1 チャンネルの 無音です。

PanningModelType 列挙型は、オーディオを 3D 空間内に配置するために使用する 空間化アルゴリズムを決定します。既定値は "equalpower" です。

enum PanningModelType {
        "equalpower",
        "HRTF"
};
        
PanningModelType 列挙型の説明
列挙値 説明
"equalpower" 等電力パンニングを使用する、単純で効率的な 空間化アルゴリズム。

注: このパンニングモデルを 使用する場合、このノードの出力を計算するために使用されるすべての AudioParam は a-rate です。

"HRTF" 人間の被験者から測定したインパルス応答との畳み込みを 使用する、より高品質な空間化アルゴリズム。このパンニング 手法はステレオ出力をレンダリングします。

注:このパンニングモデルを 使用する場合、このノードの出力を計算するために使用されるすべての AudioParam は k-rate です。

PannerNode の AudioParam の 有効 オートメーションレートは、 panningModel と AudioParamの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)\) にクランプされます。\(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)\) にクランプされます。\(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 を指定して呼び出されたとき、ユーザーエージェントは context と options を引数として、 this の AudioNode を初期化 しなければなりません。

PannerNode.constructor() メソッドの引数。
パラメーター 型 null 許容 省略可能 説明
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] の線形値(dB ではありません)です。パラメーターが この範囲外の場合、 InvalidStateError を投げなければなりません。

distanceModel, 型は DistanceModelType

この PannerNode が使用する距離モデルを指定します。 既定値は "inverse" です。

maxDistance, 型は double

ソースとリスナーの間の最大距離であり、これを超えると 音量はそれ以上低下しません。既定値は 10000 です。 これが正でない値に設定された場合、 RangeError 例外を投げなければなりません。

orientationX, 型は AudioParam、 読み取り専用

3D デカルト座標空間において オーディオソースが向いている方向ベクトルの \(x\) 成分を表します。

orientationY, 型は AudioParam、 読み取り専用

3D デカルト座標空間において オーディオソースが向いている方向ベクトルの \(y\) 成分を表します。

orientationZ, 型は AudioParam、 読み取り専用

3D デカルト座標空間において オーディオソースが向いている方向ベクトルの \(z\) 成分を表します。

panningModel, 型は PanningModelType

この PannerNode が使用するパンニングモデルを指定します。 既定値は "equalpower" です。

positionX, 型は AudioParam、 読み取り専用

3D デカルト座標系におけるオーディオソースの \(x\) 座標位置を設定します。

positionY, 型は AudioParam、 読み取り専用

3D デカルト座標系におけるオーディオソースの \(y\) 座標位置を設定します。

positionZ, 型は AudioParam、 読み取り専用

3D デカルト座標系におけるオーディオソースの \(z\) 座標位置を設定します。

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.value、 orientationY.value、 および orientationZ.value 属性を、それぞれ x、y、 z パラメーターで直接設定することと等価です。

したがって、このメソッドが呼び出された時点で、 orientationX、 orientationY、 および orientationZ AudioParam のいずれかに setValueCurveAtTime() を使用してオートメーションカーブが設定されている場合、 NotSupportedError を 投げなければなりません。

3D デカルト座標空間でオーディオソースが どの方向を向いているかを記述します。音の指向性の程度 (cone 属性によって制御されます)に応じて、 リスナーとは反対方向を向いている音は非常に小さくなるか、完全に 無音になる可能性があります。

x, y, z パラメーターは、3D 空間内の 方向ベクトルを表します。

既定値は (1,0,0) です。

PannerNode.setOrientation() メソッドの引数。
パラメーター 型 null 許容 省略可能 説明
x float ✘ ✘
y float ✘ ✘
z float ✘ ✘
戻り値の型: undefined
setPosition(x, y, z)

このメソッドは非推奨です。これは、 positionX.value、 positionY.value、 および positionZ.value 属性を、それぞれ x、y、 z パラメーターで直接設定することと等価です。

したがって、このメソッドが呼び出された時点で、 positionX、 positionY、 および positionZ AudioParam のいずれかに setValueCurveAtTime() を使用してオートメーション カーブが設定されている場合、 NotSupportedError を 投げなければなりません。

listener 属性に対するオーディオソースの位置を設定します。 3D デカルト 座標系を使用します。

x, y, z パラメーターは、3D 空間内の座標を 表します。

既定値は (0,0,0) です。

PannerNode.setPosition() メソッドの引数。
パラメーター 型 null 許容 省略可能 説明
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 で使用する任意の周期波形を表します。

適合実装は、少なくとも 8192 要素までの PeriodicWave をサポートしなければなりません。

[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.real と options.imag の両方が存在する場合

      1. options.real と options.imag の長さが異なる場合、またはいずれかの長さが 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]] のすべての要素を 0 に設定します。

    3. options.imag のみが存在する場合

      1. options.imag の長さが 2 未満の場合、IndexSizeError を投げ、このアルゴリズムを中止します。

      2. [[real]] と [[imag]] を、options.imag と同じ長さの配列に設定します。

      3. options.imag を [[imag]] へコピーし、[[real]] のすべての要素を 0 に設定します。

    4. それ以外の場合

      1. [[real]] と [[imag]] を、長さ 2 の 0 で埋められた配列に設定します。

      2. [[imag]] のインデックス 1 の要素を 1 に設定します。

      注: この PeriodicWave を OscillatorNode に設定する場合、 これは組み込み型 "sine" を使用することと等価です。

  3. [[real]] と [[imag]] の両方について、インデックス 0 の要素を 0 に設定します。(これにより DC 成分が 0 に設定されます。)

  4. [[normalize]] を、PeriodicWaveOptions 上の PeriodicWaveConstraints の disableNormalization 属性の反転値で初期化します。

  5. p を返します。

PeriodicWave.constructor() メソッドの引数。
パラメーター 型 null 許容 省略可能 説明
context BaseAudioContext ✘ ✘ この新しい PeriodicWave が関連付けられる BaseAudioContext。AudioBuffer とは異なり、PeriodicWave は AudioContext または OfflineAudioContext 間で共有できません。 特定の BaseAudioContext に関連付けられます。
options PeriodicWaveOptions ✘ ✔ この PeriodicWave の省略可能な初期パラメーター値。

1.28.2. PeriodicWaveConstraints

PeriodicWaveConstraints 辞書は、波形をどのように正規化するかを 指定するために使用されます。

dictionary PeriodicWaveConstraints {
    boolean disableNormalization = false;
};
        
1.28.2.1. PeriodicWaveConstraints 辞書のメンバー
disableNormalization, 型は boolean、既定値は false

周期波を正規化するかどうかを制御します。 true の場合、波形は正規化されません。それ以外の場合、 波形は正規化されます。

1.28.3. PeriodicWaveOptions

PeriodicWaveOptions 辞書は、 波形をどのように構築するかを指定するために使用されます。real または imag の一方だけが指定された場合、もう一方は 以下の辞書メンバーの 説明で指定されているように、同じ長さですべて 0 の配列であるかのように扱われます。どちらも指定されない場合、 PeriodicWave が作成され、それは OscillatorNode の type が "sine" である場合と等価でなければなりません。 両方が指定された場合、シーケンスは同じ長さでなければならず、そうでない場合は NotSupportedError 型のエラーを投げなければなりません。

dictionary PeriodicWaveOptions : PeriodicWaveConstraints {
    sequence<float> real;
    sequence<float> imag;
};
        
1.28.3.1. PeriodicWaveOptions 辞書のメンバー
imag, 型は sequence<float>

imag パラメーターは、 sine 項の配列を表します。最初の要素(インデックス 0)は フーリエ級数には存在しません。2 番目の要素 (インデックス 1)は基本周波数を表します。 3 番目は第 1 倍音を表し、以降も同様です。

real, 型は sequence<float>

real パラメーターは、 cosine 項の配列を表します。最初の要素(インデックス 0)は 周期波形の DC オフセットです。2 番目の要素 (インデックス 1)は基本周波数を表します。 3 番目は第 1 倍音を表し、以降も同様です。

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 の係数を ここに示します。これは、組み込み型を使用したいが 既定の正規化を適用したくない場合に便利です。

以下の説明では、\(a\) を実数 係数の配列、\(b\) を createPeriodicWave() の虚数係数の配列とします。 すべての場合で、波形は奇関数であるため、すべての \(n\) について \(a[n] = 0\) です。 また、すべての場合で \(b[0] = 0\) です。したがって、以下では \(n \ge 1\) の \(b[n]\) のみを指定します。

"sine"
$$
    b[n] = \begin{cases}
                     1 &amp; \mbox{for } n = 1 \\
                     0 &amp; \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"
テールタイム なし

ScriptProcessorNode は、次の値のいずれかでなければならない bufferSize を指定して構築されます: 256、 512、1024、2048、4096、8192、16384。この値は、 audioprocess イベントがどのくらいの頻度で配送されるか、および 各呼び出しで処理する必要があるサンプルフレーム数を制御します。audioprocess イベントは、 ScriptProcessorNode に少なくとも 1 つの入力または 1 つの出力が接続されている場合にのみ配送されます。bufferSize の値が小さいほど レイテンシーは低く(良好に)なります。値が大きいほど、 オーディオの途切れやグリッチを回避するために必要になります。この値は、 createScriptProcessor() への bufferSize 引数が渡されない場合、または 0 に設定されている場合、 実装によって選択されます。

numberOfInputChannels と numberOfOutputChannels は、入力および出力チャンネル数を決定します。 numberOfInputChannels と numberOfOutputChannels の両方を 0 にすることは無効です。

[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

ScriptProcessorNode ノード型へ配送される audioprocess イベント型の イベントハンドラーを設定するために使用されるプロパティです。 イベント ハンドラーへ配送されるイベントは AudioProcessingEvent インターフェイスを使用します。

1.30. StereoPannerNode インターフェイス

このインターフェイスは、低コストのパンニング アルゴリズムを使用して、入力オーディオストリームを ステレオイメージ内に配置する処理ノードを表します。このパンニング効果は、 ステレオストリーム内でオーディオ要素を配置する際によく使用されます。

プロパティ 値 注記
numberOfInputs 1
numberOfOutputs 1
channelCount 2 channelCount 制約があります
channelCountMode "clamped-max" channelCountMode 制約があります
channelInterpretation "speakers"
テールタイム なし

このノードの入力はステレオ(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 を指定して呼び出されたとき、ユーザーエージェントは context と options を引数として、 this の AudioNode を初期化 しなければなりません。

StereoPannerNode.constructor() メソッドの引数。
パラメーター 型 null 許容 省略可能 説明
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 インターフェイス

WaveShaperNode は、非線形 ディストーションエフェクトを実装する AudioNode プロセッサーです。

非線形ウェーブシェーピングディストーションは、微妙な 非線形の暖かみを加える場合にも、より明瞭なディストーション効果にも一般的に使用されます。 任意の非線形シェーピングカーブを指定できます。

プロパティ 値 注記
numberOfInputs 1
numberOfOutputs 1
channelCount 2
channelCountMode "max"
channelInterpretation "speakers"
テールタイム 場合による oversample 属性が "2x" または "4x" に設定されている場合にのみ、テールタイムがあります。 このテールタイムの実際の長さは実装に依存します。

出力のチャンネル数は常に 入力のチャンネル数と等しくなります。

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 を指定して呼び出されたとき、ユーザーエージェントは context と options を引数として、 this の AudioNode を初期化 しなければなりません。

また、[[curve set]] を、この WaveShaperNode の内部 スロットとします。 このスロットを false に初期化します。options が指定され、curve が指定されている場合、 [[curve set]] を true に設定します。

WaveShaperNode.constructor() メソッドの引数。
パラメーター 型 null 許容 省略可能 説明
context BaseAudioContext ✘ ✘ この新しい WaveShaperNode が関連付けられる BaseAudioContext。
options WaveShaperOptions ✘ ✔ この WaveShaperNode の省略可能な初期パラメーター値。

1.31.2. 属性

curve, 型は Float32Array、null 許容

ウェーブシェーピング効果に使用するシェーピングカーブ。入力 信号は公称上 [-1, 1] の範囲内です。この範囲内の各入力サンプルは シェーピングカーブをインデックスし、配列の要素数が奇数の場合、 信号レベル 0 はカーブ配列の中央の値に対応し、 配列の要素数が偶数の場合は 中央の 2 つの値の間で補間されます。 -1 より小さいサンプル値は、カーブ配列の最初の値に対応します。 +1 より大きいサンプル値は、 カーブ配列の最後の値に対応します。

実装は、カーブ内の隣接する点の間で 線形補間を行わなければなりません。初期状態では curve 属性は null であり、これは WaveShaperNode が入力を 変更せずに出力へ渡すことを意味します。

カーブの値は [-1; 1] の範囲内に等間隔で配置されます。これは、 偶数個の値を持つ curve には、信号レベル 0 に対応する値がなく、 奇数個の値を持つ curve には、信号レベル 0 に対応する値があることを意味します。 出力は次のアルゴリズムによって決定されます。

  1. \(x\) を入力サンプル、\(y\) を 対応するノードの出力、 \(c_k\) を curve の \(k\) 番目の要素、\(N\) を curve の長さとします。

  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*}
    $$
                                

この 属性に、length が 2 未満の Float32Array が設定された場合、 InvalidStateError を投げなければなりません。

この属性が設定されると、カーブの内部コピーが WaveShaperNode によって作成されます。したがって、 属性の設定に使用した配列の内容を後から変更しても 影響はありません。

curve 属性を設定するには、次の手順を実行します:
  1. new curve を、Float32Array または null とし、curve に割り当てるものとします。 .

  2. new curve が null ではなく、 [[curve set]] が true の場合、 InvalidStateError を投げ、これらの手順を中止します。

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

  4. new curve を curve 属性に割り当てます。

注: 入力値が 0 のときに 0 以外の 出力値を生成するカーブを使用すると、このノードに 入力が接続されていなくても DC 信号が 生成されます。これは、 ノードが下流のノードから切断されるまで継続します。

oversample, 型は OverSampleType

シェーピングカーブを適用するときに、 どの種類のオーバーサンプリング(存在する場合)を使用するかを指定します。既定値は "none" であり、これはカーブが入力 サンプルへ直接適用されることを意味します。"2x" または "4x" の値は、一部のエイリアシングを回避することで 処理品質を向上させることができ、"4x" の値が 最も高い品質をもたらします。一部の用途では、非常に精密な シェーピングカーブを得るために、オーバーサンプリングを使用しない方が 適しています。

"2x" または "4x" の値は、次の手順を 実行しなければならないことを意味します:
  1. 入力サンプルを、 AudioContext のサンプルレートの 2 倍または 4 倍へアップサンプリングします。 したがって、各 レンダー 量子について、2 倍の場合は 2 倍、4 倍の場合は 4 倍のサンプルを生成します。

  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、読み取り専用

AudioWorkletGlobalScope 上のポートに接続された MessagePort。

注: この port の "message" イベントにイベントリスナーを登録する作者は、 リソースを回収できるようにするため、 MessageChannel のどちらか一方の端 (AudioWorklet 側または AudioWorkletGlobalScope 側)で close を呼び出すべきです。

1.32.2. 概念

AudioWorklet オブジェクトは、開発者が レンダリングスレッド上でオーディオを処理するためのスクリプト (JavaScript や WebAssembly コードなど)を提供できるようにし、 カスタム AudioNode をサポートします。この 処理機構により、スクリプトコードはオーディオ グラフ内の他の組み込み AudioNode と同期して実行されることが保証されます。

この機構を実現するため、関連付けられた 2 つのオブジェクト、 AudioWorkletNode と AudioWorkletProcessor を定義しなければなりません。 前者は他の AudioNode オブジェクトと同様にメイングローバルスコープの インターフェイスを表し、後者は AudioWorkletGlobalScope という特別なスコープ内で内部オーディオ処理を 実装します。

AudioWorklet の概念
AudioWorkletNode と AudioWorkletProcessor

各 BaseAudioContext は正確に 1 つの AudioWorklet を持ちます。

AudioWorklet の worklet グローバルスコープ型は AudioWorkletGlobalScope です。

AudioWorklet の worklet デスティネーション型は "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 がインスタンス化されると、対応する AudioWorkletProcessor も AudioWorkletGlobalScope 内で作成されます。これら 2 つのオブジェクトは、 § 2 処理モデルで説明されている非同期メッセージパッシングを介して 通信します。

1.32.3. AudioWorkletGlobalScope インターフェイス

この特別な実行コンテキストは、オーディオ レンダリングスレッド内のスクリプトを直接使用して、 オーディオデータの生成、処理、および解析を可能にするよう設計されています。ユーザーが提供した スクリプトコードは、このスコープ内で評価され、1 つ以上の AudioWorkletProcessor サブクラスを定義し、それらはさらに メインスコープ内の AudioWorkletNode と 1:1 で関連付けられた AudioWorkletProcessor のインスタンス化に使用されます。

1 つ以上の AudioWorkletNode を含む各 AudioContext には、正確に 1 つの AudioWorkletGlobalScope が存在します。 インポートされたスクリプトの実行は、 [HTML] で定義されているように UA によって行われます。 [HTML] で指定された既定値を上書きし、 AudioWorkletGlobalScope はユーザーエージェントによって任意に 終了されてはなりません。

AudioWorkletGlobalScope には次の内部スロットがあります:

注: AudioWorkletGlobalScope には、これらのインスタンス間で共有するその他のデータや コードを含めることもできます。たとえば、複数の プロセッサーがウェーブテーブルまたは インパルス応答を定義する ArrayBuffer を共有することがあります。

注: AudioWorkletGlobalScope は単一の 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、読み取り専用

処理中のオーディオブロックの現在のフレーム。 これは、 BaseAudioContext の [[current frame]] 内部スロットの値と等しくなければなりません。

currentTime, 型は double、読み取り専用

処理中のオーディオブロックのコンテキスト時刻。これは BaseAudioContext の currentTime 属性の値と等しくなければなりません。

sampleRate, 型は float、読み取り専用

関連付けられた BaseAudioContext のサンプルレート。

renderQuantumSize, 型は unsigned long、読み取り専用

関連付けられた BaseAudioContext のプライベートスロット レンダー量子サイズの値。

port, 型は MessagePort、読み取り専用

AudioWorklet 上のポートに接続された MessagePort。

注: この port の "message" イベントにイベントリスナーを登録する作者は、 リソースを回収できるようにするため、 MessageChannel のどちらか一方の端 (AudioWorklet 側または AudioWorkletGlobalScope 側)で close を呼び出すべきです。

1.32.3.2. メソッド
registerProcessor(name, processorCtor)

AudioWorkletProcessor から派生したクラスコンストラクターを登録します。

registerProcessor(name, processorCtor) メソッドが呼び出されたとき、次の手順を実行します。いずれかの 手順で例外が投げられた場合、残りの 手順を中止します。
  1. name が空文字列の場合、 NotSupportedError を投げます。

  2. name がすでに ノード名からプロセッサー コンストラクターへのマップのキーとして存在する場合、 NotSupportedError を投げます。

  3. IsConstructor(argument=processorCtor) の結果が false の場合、 TypeError を投げます。

  4. prototype を Get(O=processorCtor, P="prototype") の結果とします。

  5. Type(argument=prototype) の結果が Object でない場合、 TypeError を投げます。

  6. parameterDescriptorsValue を、 Get(O=processorCtor, P="parameterDescriptors") の結果とします。

  7. parameterDescriptorsValue が undefined でない場合、次の手順を実行します:

    1. parameterDescriptorSequence を、 parameterDescriptorsValue から sequence<AudioParamDescriptor> 型の IDL 値への 変換の結果とします。

    2. paramNames を空の Array とします。

    3. parameterDescriptorSequence の各 descriptor について:
      1. paramName を、 descriptor 内のメンバー name の値とします。paramNames がすでに paramName 値を含む場合、 NotSupportedError を投げます。

      2. paramName を paramNames 配列へ追加します。

      3. defaultValue を、 descriptor 内の メンバー defaultValue の値とします。

      4. minValue を、 descriptor 内の メンバー minValue の値とします。

      5. maxValue を、 descriptor 内の メンバー maxValue の値とします。

      6. 式 minValue <= defaultValue <= maxValue が false の場合、 InvalidStateError を投げます。

  8. キーと値のペア name → processorCtor を、関連付けられた AudioWorkletGlobalScope の ノード名からプロセッサー コンストラクターへのマップ に追加します。

  9. メディア要素タスクをキューに入れ、キーと値のペア name → parameterDescriptorSequence を、関連付けられた BaseAudioContext の ノード名からパラメーター記述子への マップに追加します。

注: クラスコンストラクターは 1 回だけ 検索されるべきであり、そのため 登録後に動的に変更される機会はありません。

AudioWorkletGlobalScope.registerProcessor(name, processorCtor) メソッドの引数。
パラメーター 型 null 許容 省略可能 説明
name DOMString ✘ ✘ 登録するクラスコンストラクターを表す文字列キー。このキーは、 AudioWorkletNode の構築中に AudioWorkletProcessor のコンストラクターを検索するために使用されます。
processorCtor AudioWorkletProcessorConstructor ✘ ✘ AudioWorkletProcessor から拡張されたクラスコンストラクター。
戻り値の型: undefined
1.32.3.3. AudioWorkletProcessor のインスタンス化

AudioWorkletNode の構築の終了時に、 スレッド間転送のために、 プロセッサー 構築データ という名前の 構造体 が準備されます。この 構造体 には次の 項目が含まれます:

転送されたデータが AudioWorkletGlobalScope に到着すると、 レンダリングスレッド は次のアルゴリズムを呼び出します:

  1. constructionData を、 制御スレッドから転送された プロセッサー構築データとします。

  2. processorName、nodeReference、および serializedPort を、それぞれ constructionData の name、 node、および port とします。

  3. serializedOptions を constructionData の options とします。

  4. deserializedPort を、 StructuredDeserialize(serializedPort, 現在の Realm) の結果とします。

  5. deserializedOptions を、 StructuredDeserialize(serializedOptions, 現在の Realm) の結果とします。

  6. processorCtor を、 AudioWorkletGlobalScope の ノード名からプロセッサーコンストラクターへの マップで processorName を検索した結果とします。

  7. nodeReference と deserializedPort を、それぞれこの AudioWorkletGlobalScope の 保留中のプロセッサー構築データ の ノード参照 と 転送されたポート に格納します。

  8. processorCtor から、 deserializedOptions を引数として コールバック関数を構築します。コールバックで例外が投げられた場合、 制御スレッドへ タスクをキューに入れ、nodeReference で processorerror という名前のイベントを、ErrorEvent を使用して発火します。

  9. 保留中のプロセッサー構築データ スロットを空にします。

1.32.4. AudioWorkletNode インターフェイス

このインターフェイスは、 制御スレッド上に存在する、 ユーザー定義の AudioNode を表します。ユーザーは BaseAudioContext から AudioWorkletNode を作成でき、そのような ノードを他の組み込み AudioNode と接続して オーディオグラフを形成できます。

プロパティ 値 注記
numberOfInputs 1
numberOfOutputs 1
channelCount 2
channelCountMode "max"
channelInterpretation "speakers"
テールタイム 注記を参照 あらゆる テールタイムは ノード自体によって処理されます

各 AudioWorkletProcessor には、初期値が true の アクティブ ソースフラグが関連付けられています。このフラグにより、 入力が接続されていない場合でも、ノードはメモリ内に保持され、 オーディオ処理を実行します。

AudioWorkletNode から送信されるすべてのタスクは、 関連付けられた BaseAudioContext のタスクキューへ送信されます。

[Exposed=Window]
interface AudioParamMap {
    readonly maplike<DOMString, AudioParam>;
};
        

このインターフェイスには、readonly maplike によってもたらされる "entries"、"forEach"、"get"、"has"、"keys"、 "values"、@@iterator メソッド、および "size" getter があります。

[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() メソッドの引数。
パラメーター 型 null 許容 省略可能 説明
context BaseAudioContext ✘ ✘ この新しい AudioWorkletNode が関連付けられる BaseAudioContext。
name DOMString ✘ ✘ BaseAudioContext の ノード名からパラメーター 記述子へのマップのキーとなる文字列。
options AudioWorkletNodeOptions ✘ ✔ この AudioWorkletNode の省略可能な初期パラメーター値。

コンストラクターが呼び出されたとき、ユーザーエージェントは 制御スレッド上で次の手順を実行しなければなりません:

AudioWorkletNode コンストラクターが context、nodeName、options を指定して呼び出されたとき:
  1. nodeName が BaseAudioContext の ノード名からパラメーター 記述子へのマップのキーとして存在しない場合、 InvalidStateError 例外を投げ、これらの手順を中止します。

  2. node を this 値とします。

  3. context と options を 引数として、node の AudioNode を初期化します。

  4. options を使用して、node の 入力、出力、および出力チャンネルを構成します。 例外が投げられた場合、残りの手順を 中止します。

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

  6. nodePort を、 messageChannel の port1 属性の値とします。

  7. processorPortOnThisSide を、 messageChannel の port2 属性の値とします。

  8. serializedProcessorPort を、 StructuredSerializeWithTransfer(processorPortOnThisSide, « processorPortOnThisSide ») の結果とします。

  9. options 辞書を optionsObject に 変換します。

  10. serializedOptions を、 StructuredSerialize(optionsObject) の結果とします。

  11. node の port を nodePort に設定します。

  12. parameterDescriptors を、 ノード名からパラメーター 記述子へのマップから nodeName を取得した結果とします:

    1. audioParamMap を新しい AudioParamMap オブジェクトとします。

    2. parameterDescriptors の各 descriptor について:

      1. paramName を、 descriptor 内の name メンバーの値とします。

      2. audioParam を新しい AudioParam インスタンスとし、 automationRate、 defaultValue、 minValue、 および maxValue の値を、 descriptor 上の対応するメンバーの値と 等しくします。

      3. キーと値のペア paramName → audioParam を audioParamMap の エントリーへ追加します。

    3. options 上に parameterData が 存在する場合、次の手順を 実行します:

      1. parameterData を parameterData の値とします。

      2. parameterData の各 paramName → paramValue について:

        1. audioParamMap に キー paramName を持つマップエントリーが 存在する場合、そのエントリーを audioParamInMap とします。

        2. audioParamInMap の value プロパティを paramValue に設定します。

    4. node の parameters を audioParamMap に設定します。

  13. 制御 メッセージをキューに入れ、 対応する AudioWorkletProcessor の constructor を、次の要素からなる プロセッサー構築データを使用して 呼び出します: nodeName、 node、 serializedOptions、および serializedProcessorPort。

1.32.4.2. 属性
onprocessorerror, 型は EventHandler

プロセッサーの constructor、process メソッド、 またはユーザー定義のクラスメソッドから未処理の例外が投げられた場合、プロセッサーは メディア要素タスクをキューに入れ、イベントを発火して、processorerror という名前のイベントを、関連付けられた AudioWorkletNode に対して ErrorEvent を使用して発火します。

ErrorEvent は制御スレッド上で、その message、 filename、lineno、colno 属性を適切に指定して作成および初期化されます。

未処理の例外が一度投げられると、プロセッサーは そのライフタイム全体にわたって無音を出力することに注意してください。

parameters, 型は AudioParamMap、 読み取り専用

parameters 属性は、関連付けられた名前を持つ AudioParam オブジェクトのコレクションです。この maplike オブジェクトは、インスタンス化時に AudioWorkletProcessor クラスコンストラクター内の AudioParamDescriptor のリストから設定されます。

port, 型は MessagePort、読み取り専用

各 AudioWorkletNode には、MessagePort である関連付けられた port があります。 これは、対応する AudioWorkletProcessor オブジェクト上のポートに接続され、 AudioWorkletNode とその AudioWorkletProcessor の間の双方向通信を可能にします。

注: この port の "message" イベントにイベントリスナーを登録する作者は、リソースを回収できるようにするため、 MessageChannel のどちらか一方の端( AudioWorkletProcessor 側または AudioWorkletNode 側)で close を呼び出すべきです。

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

これは、AudioNode の numberOfInputs 属性の値を初期化するために使用されます。

numberOfOutputs, 型は unsigned long、既定値は 1

これは、AudioNode の numberOfOutputs 属性の値を初期化するために使用されます。

outputChannelCount, 型は sequence<unsigned long>

この配列は、各出力のチャンネル数を 構成するために使用されます。

parameterData, 型は record<DOMString, double>

これは、AudioWorkletNode 内で名前が一致する AudioParam の初期 value を設定するために使用される、ユーザー定義のキーと値のペアのリストです。

processorOptions, 型は object

これは、AudioWorkletNode に関連付けられた AudioWorkletProcessor インスタンス内のカスタムプロパティを初期化するために使用できる 任意のユーザー定義データを保持します。

1.32.4.3.2. AudioWorkletNodeOptions によるチャンネルの構成

次のアルゴリズムは、AudioWorkletNodeOptions を使用して さまざまなチャンネル構成を設定する方法を説明します。

  1. node を、このアルゴリズムに 与えられた AudioWorkletNode インスタンスとします。

  2. numberOfInputs と numberOfOutputs の両方が 0 の場合、 NotSupportedError を投げ、残りの手順を中止します。

  3. outputChannelCount が存在する場合、

    1. outputChannelCount 内のいずれかの値が 0 であるか、 実装がサポートする最大チャンネル数を 超える場合、NotSupportedError を投げ、 残りの手順を中止します。

    2. outputChannelCount の長さが numberOfOutputs と等しくない場合、 IndexSizeError を投げ、残りの 手順を中止します。

    3. numberOfInputs と numberOfOutputs の両方が 1 の場合、 node の出力のチャンネル数を outputChannelCount 内の唯一の値に設定します。

    4. それ以外の場合、node の k 番目の出力の チャンネル数を、outputChannelCount シーケンスの k 番目の要素に設定し、戻ります。

  4. outputChannelCount が存在しない場合、

    1. numberOfInputs と numberOfOutputs の両方が 1 の場合、 node の出力の初期チャンネル数を 1 に設定し、戻ります。

      注: この場合、出力の チャンネル数は、実行時の入力と channelCountMode に基づいて computedNumberOfChannels へ動的に 変更されます。

    2. それ以外の場合、node の各出力のチャンネル数を 1 に設定し、戻ります。

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 を、現在の AudioWorkletGlobalScope の 保留中のプロセッサー構築 データ上の ノード参照 を検索した結果とします。 スロットが空の場合、TypeError 例外を投げます。

  2. processor を this 値とします。

  3. processor の [[node reference]] を nodeReference に設定します。

  4. processor の [[callable process]] を true に設定します。

  5. deserializedPort を、 保留中のプロセッサー構築 データから 転送された ポート を検索した結果とします。

  6. processor の port を deserializedPort に設定します。

  7. 保留中のプロセッサー構築 データ スロットを空にします。

1.32.5.2. 属性
port, 型は MessagePort、読み取り専用

各 AudioWorkletProcessor には、MessagePort である関連付けられた port があります。 これは対応する AudioWorkletNode オブジェクト上のポートに接続され、 AudioWorkletNode とその AudioWorkletProcessor の間の双方向通信を可能にします。

注: この port の "message" イベントにイベントリスナーを登録する作者は、リソースを回収できるようにするため、 MessageChannel のどちらか一方の端( AudioWorkletProcessor 側または AudioWorkletNode 側)で close を呼び出すべきです。

1.32.5.3. コールバック AudioWorkletProcessCallback

ユーザーは AudioWorkletProcessor を拡張することで、カスタムオーディオプロセッサーを定義できます。 サブクラスは、オーディオ処理 アルゴリズムを実装する process() という名前の AudioWorkletProcessCallback を定義しなければならず、 parameterDescriptors という名前の静的プロパティを持つことができます。これは AudioParamDescriptor の iterable です。

process() コールバック関数は、 グラフをレンダリングするときに指定されているように処理されます。

このコールバックの戻り値は、 AudioWorkletProcessor に関連付けられた AudioWorkletNode のライフタイムを制御します。

このライフタイムポリシーは、次のような 組み込みノードに見られるさまざまな手法をサポートできます:

前述の定義は、process() の実装から戻り値が提供されない場合、 false を返すことと同一の効果になることを意味する点に注意してください (有効な戻り値は falsy 値である undefined であるためです)。 これは、アクティブな入力がある場合のみ アクティブになる AudioWorkletProcessor にとって妥当な動作です。

以下の例は、AudioWorkletProcessor 内で AudioParam を定義して使用する方法を示します。

class MyProcessor extends AudioWorkletProcessor {
  static get parameterDescriptors() {
    return [{
      name: 'myParam',
      defaultValue: 0.5,
      minValue: 0,
      maxValue: 1,
      automationRate: "k-rate"
    }];
  }

  process(inputs, outputs, parameters) {
    // 最初の入力と出力を取得する。
    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 の配列は、メモリ割り当てが行われないよう、 呼び出し間で再利用されます。ただし、たとえば入力または 出力のチャンネル数が変わるなど、トポロジーが変更された場合は、 新しい配列が再割り当てされます。inputs または outputs 配列のいずれかの部分が 転送された場合も、新しい配列が再割り当てされます。

inputs, 型は FrozenArray<FrozenArray<Float32Array>>

ユーザーエージェントによって提供される、入力接続からの入力オーディオバッファー。inputs[n][m] は、第 \(n\) 入力の第 \(m\) チャンネルのオーディオサンプルを含む Float32Array です。入力数は構築時に固定されますが、チャンネル数は computedNumberOfChannels に基づいて動的に変更できます。

現在のレンダー量子について、AudioWorkletNode の第 \(n\) 入力に接続されたアクティブに処理中の AudioNode が存在しない場合、inputs[n] の内容は空の配列となり、 利用可能な入力チャンネルが 0 であることを示します。これは inputs[n] の要素数が 0 になり得る唯一の状況です。

outputs, 型は FrozenArray<FrozenArray<Float32Array>>

ユーザーエージェントによって使用される出力オーディオバッファー。outputs[n][m] は、第 \(n\) 出力の第 \(m\) チャンネルの オーディオサンプルを含む Float32Array オブジェクトです。各 Float32Array は 0 で埋められています。出力のチャンネル数が computedNumberOfChannels と一致するのは、 ノードが単一の出力を持つ場合だけです。

parameters, 型は object

name → parameterValues の順序付きマップ。 parameters["name"] は parameterValues を返します。これは name AudioParam のオートメーション値を持つ FrozenArray<Float32Array> です。

各配列について、配列にはレンダー量子内のすべてのフレームについてのパラメーターの computedValue が含まれます。 ただし、このレンダー量子中にオートメーションがスケジュールされていない場合、 配列は長さ 1 でもよく、その配列要素は レンダー 量子に対する AudioParam の定数値です。

このオブジェクトは、次の手順に従って凍結されます

  1. parameter を、名前とパラメーター値の順序付き マップとします。

  2. SetIntegrityLevel(parameter, frozen)

アルゴリズムで計算された、この凍結された順序付きマップが、 parameters 引数へ渡されます。

注: これはオブジェクトを変更できないことを意味し、 したがって、配列の長さが変化しない限り、 連続する呼び出しで同じオブジェクトを使用できます。

1.32.5.4. AudioParamDescriptor

AudioParamDescriptor 辞書は、 AudioWorkletNode で使用される AudioParam オブジェクトのプロパティを指定するために使用されます。

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 つです。

  1. AudioContext が作成されます。

  2. メインスコープで、context.audioWorklet にスクリプトモジュールの追加を要求します。

  3. まだ存在しないため、新しい AudioWorkletGlobalScope がコンテキストに関連付けられて作成されます。これは、AudioWorkletProcessor クラス定義が評価されるグローバルスコープです。(以降の呼び出しでは、以前に作成されたこのスコープが 使用されます。)

  4. インポートされたスクリプトが、新しく作成されたグローバルスコープ内で実行されます。

  5. インポートされたスクリプトの実行の一部として、AudioWorkletProcessor が、 AudioWorkletGlobalScope 内のキー(上の図では "custom")の下に登録されます。 これにより、グローバルスコープと AudioContext の両方のマップが設定されます。

  6. addModule() 呼び出しの Promise が解決されます。

  7. メインスコープで、ユーザーが指定したキーと オプション辞書を使用して AudioWorkletNode が作成されます。

  8. ノードの作成の一部として、このキーを使用して、 インスタンス化する正しい AudioWorkletProcessor サブクラスを検索します。

  9. AudioWorkletProcessor サブクラスのインスタンスが、 同じオプション辞書の構造化クローンを使用して インスタンス化されます。このインスタンスは、以前に作成された AudioWorkletNode と対になります。

1.32.7. AudioWorklet の例

1.32.7.1. BitCrusher ノード

ビットクラッシングは、サンプル値を量子化する (より低いビット深度をシミュレートする)ことと、時間分解能を量子化する (より低いサンプルレートをシミュレートする)ことの両方によって、 オーディオストリームの品質を低下させる仕組みです。この例は、 AudioWorkletProcessor 内で AudioParam (この場合は a-rate として扱われます)を 使用する方法を示します。

const context = new AudioContext();context.audioWorklet.addModule('bitcrusher.js').then(() => {    const osc = new OscillatorNode(context);    const amp = new GainNode(context);    // Worklet ノードを作成する。'BitCrusher' は、    // bitcrusher.js がインポートされたときに以前に登録された    // AudioWorkletProcessor を識別する。オプションは対応する名前の    // AudioParam を自動的に初期化する。    const bitcrusher = new AudioWorkletNode(context, 'bitcrusher', {        parameterData: {bitDepth: 8}    });    osc.connect(bitcrusher).connect(amp).connect(context.destination);    osc.start();});
class Bitcrusher extends AudioWorkletProcessor {    static get parameterDescriptors () {        return [{            name: 'bitDepth',            defaultValue: 12,            minValue: 1,            maxValue: 16        }, {            name: 'frequencyReduction',            defaultValue: 0.5,            minValue: 0,            maxValue: 1        }];    }    constructor () {        super();        this._phase = 0;        this._lastSampleValue = 0;    }    process (inputs, outputs, parameters) {        const input = inputs[0];        const output = outputs[0];        const bitDepth = parameters.bitDepth;        const frequencyReduction = parameters.frequencyReduction;        if (bitDepth.length > 1) {            for (let channel = 0; channel < output.length; ++channel) {                for (let i = 0; i < output[channel].length; ++i) {                    let step = Math.pow(0.5, bitDepth[i]);                    // frequencyReduction 配列の長さが 1 の場合を処理するため、                    // インデックス指定には剰余を使用する。                    this._phase += frequencyReduction[i % frequencyReduction.length];                    if (this._phase >= 1.0) {                        this._phase -= 1.0;                        this._lastSampleValue =                            step * Math.floor(input[channel][i] / step + 0.5);                    }                    output[channel][i] = this._lastSampleValue;                }            }        } else {            // この呼び出しでは bitDepth が一定であることが分かっているため、            // step の計算をループの外に出すことができ、            // 多くの演算を節約できる。            const step = Math.pow(0.5, bitDepth[0]);            for (let channel = 0; channel < output.length; ++channel) {                for (let i = 0; i < output[channel].length; ++i) {                    this._phase += frequencyReduction[i % frequencyReduction.length];                    if (this._phase >= 1.0) {                        this._phase -= 1.0;                        this._lastSampleValue =                            step * Math.floor(input[channel][i] / step + 0.5);                    }                    output[channel][i] = this._lastSampleValue;                }            }        }        // 値を返す必要はない。このノードのライフタイムは、その        // 入力接続だけに依存する。    }};registerProcessor('bitcrusher', Bitcrusher);

注: AudioWorkletProcessor クラスの定義では、 作者が提供したコンストラクターが this でない明示的な戻り値を持つ場合、 または super() を適切に呼び出さない場合、 InvalidStateError が投げられます。

1.32.7.2. VU メーターノード

この単純な音量メーターの例は、 ネイティブな AudioNode のように動作し、 コンストラクターオプションを受け取り、 AudioWorkletNode と AudioWorkletProcessor の間のスレッド間通信(非同期)をカプセル化する AudioWorkletNode サブクラスを作成する方法をさらに示します。 このノードは出力を使用しません。

/* vumeter-node.js: メイングローバルスコープ */export default class VUMeterNode extends AudioWorkletNode {    constructor (context, updateIntervalInMS) {        super(context, 'vumeter', {            numberOfInputs: 1,            numberOfOutputs: 0,            channelCount: 1,            processorOptions: {                updateIntervalInMS: updateIntervalInMS || 16.67            }        });        // AudioWorkletNode 内の状態        this._updateIntervalInMS = updateIntervalInMS;        this._volume = 0;        // 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 () {        // 音量値に基づいて VU メーターを描画する        // |this._updateIntervalInMS| ミリ秒ごとに。    }};
/* 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];        // 入力はモノラルへダウンミックスされることに注意。ただし、入力が        // 接続されていない場合は、0 チャンネルが渡される。        if (input.length > 0) {            const samples = input[0];            let sum = 0;            let rms = 0;            // 二乗和を計算する。            for (let i = 0; i < samples.length; ++i)                sum += samples[i] * samples[i];            // RMS レベルを計算し、音量を更新する。            rms = Math.sqrt(sum / samples.length);            this._volume = Math.max(rms, this._volume * SMOOTHING_FACTOR);            // 音量プロパティを更新し、メインスレッドと同期する。            this._nextUpdateFrame -= samples.length;            if (this._nextUpdateFrame < 0) {                this._nextUpdateFrame += this.intervalInFrames;                this.port.postMessage({volume: this._volume});            }        }        // 音量がしきい値を上回る場合は処理を続け、        // 入力を切断してもメーターが平滑化された値の計算を        // 直ちに停止しないようにする。        return this._volume >= MINIMUM_VALUE;    }});
/* index.js: メイングローバルスコープ、エントリーポイント */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();});

1.33. AudioPlaybackStats インターフェイス

AudioContext を通じて再生されるオーディオのアンダーランおよびレイテンシー統計を提供します。

オーディオが再生デバイスへ時間どおりに届けられない場合、 オーディオアンダーランが発生します。これにより再生信号に不連続が生じ、 一般に「グリッチ」と呼ばれる、聞き取れる「クリック」音が発生します。 こうしたグリッチはユーザー体験に悪影響を与えるため、発生した場合に アプリケーションが検出し、再生を改善するための何らかの処置を 取れることが有用です。

AudioPlaybackStats はオーディオ統計を報告する専用オブジェクトであり、 AudioContext の AudioDestinationNode および関連付けられたオーディオ出力デバイスを介した再生経路について、 オーディオアンダーランと再生レイテンシーの統計を報告します。これにより、 アプリケーションは次の理由で発生し得るアンダーランを測定できます:

アンダーランは、アンダーランフレームと アンダーランイベントによって定義されます:

[Exposed=Window, SecureContext]
interface AudioPlaybackStats {
    readonly attribute double underrunDuration;
    readonly attribute unsigned long underrunEvents;
    readonly attribute double totalDuration;
    readonly attribute double averageLatency;
    readonly attribute double minimumLatency;
    readonly attribute double maximumLatency;
    undefined resetLatency();
    [Default] object toJSON();
};
        

各 AudioContext は正確に 1 つの AudioPlaybackStats を持ちます。

AudioPlaybackStats には次の内部スロットがあります:

[[audio context]]

この AudioPlaybackStats インスタンスが関連付けられている AudioContext。 作成時に所有元の AudioContext に初期化されます。

[[underrun duration]]

最後の統計更新時点までに [[audio context]] の再生で発生したすべての アンダーランイベントの合計継続時間を表す double。 0 に初期化されます。

[[underrun events]]

最後の統計更新時点までに [[audio context]] の再生で発生した アンダーランイベントの合計数を表す int。 0 に初期化されます。

[[total duration]]

最後の統計更新時点までの [[audio context]] の再生におけるすべてのフレームの合計継続時間(秒)を表す double で、 [[underrun duration]] + currentTime として定義されます。 0 に初期化されます。

[[average latency]]

現在追跡中の区間 にわたる [[audio context]] の平均オーディオ出力レイテンシーを表す double。

[[minimum latency]]

現在追跡中の区間 にわたる [[audio context]] の最小オーディオ出力レイテンシーを表す double。 0 に初期化されます。

[[maximum latency]]

現在追跡中の区間 にわたる [[audio context]] の最大オーディオ出力レイテンシーを表す double。 0 に初期化されます。

[[latency reset time]]

レイテンシー統計が最後にリセットされた時刻を表す double。これは currentTime のクロックドメイン内にあります。 0 に初期化されます。

currently tracked interval は、[[latency reset time]] から現在の currentTime までの区間です。

1.33.1. 属性

注: これらの属性は、特定の条件下で 1 秒に 1 回だけ更新されます。詳細については、§ 1.33.3 統計の更新および § 1.33.4.2 緩和策を参照してください。

underrunDuration, 型は double、読み取り専用

[[underrun duration]] 内部スロットの値を返します。

注: このメトリックは、totalDuration と組み合わせて、 AudioContext によって提供されなかった再生済みメディアの割合を 計算するために使用できます。

underrunEvents, 型は unsigned long、読み取り専用

[[underrun events]] 内部スロットの値を返します。

totalDuration, 型は double、読み取り専用

[[total duration]] 内部スロットの値を返します。

averageLatency, 型は double、読み取り専用

[[average latency]] 内部スロットの値を返します。

minimumLatency, 型は double、読み取り専用

[[minimum latency]] 内部スロットの値を返します。

maximumLatency, 型は double、読み取り専用

[[maximum latency]] 内部スロットの値を返します。

1.33.2. メソッド

resetLatency()

レイテンシー統計を追跡する区間の開始を 現在時刻に設定します。 resetLatency が呼び出されたとき、次の手順を実行します:

  1. [[latency reset time]] を currentTime に設定します。

  2. currentLatency を、[[audio context]] によって最後に再生されたフレームの再生レイテンシーとし、 まだフレームが再生されていない場合は 0 とします。

  3. [[average latency]] を currentLatency に設定します。

  4. [[minimum latency]] を currentLatency に設定します。

  5. [[maximum latency]] を currentLatency に設定します。

1.33.3. 統計の更新

1 秒に 1 回、オーディオ統計更新アルゴリズムを実行します:
  1. [[audio context]] が実行中でない場合、これらの手順を中止します。

  2. canUpdate を false とします。

  3. document を、現在の this の 関連するグローバルオブジェクトの関連付けられた Documentとします。 document が完全にアクティブで、document の 可視性状態が "visible" の場合、 canUpdate を true に設定します。

  4. permission を、"microphone" アクセスに関連付けられた権限の 権限状態とします。 permission が "granted" の場合、canUpdate を true に設定します。

  5. canUpdate が false の場合、これらの手順を中止します。

  6. [[underrun duration]] を、[[audio context]] が構築されてからその再生で発生した すべての アンダーランイベント の合計継続時間 (秒)に設定します。

  7. [[underrun events]] を、[[audio context]] が構築されてからその再生で発生した アンダーランイベント の合計数に設定します。

  8. [[total duration]] を [[underrun duration]] + [[audio context]].currentTime に設定します。

  9. [[average latency]] を、現在追跡中の区間 にわたる [[audio context]] の再生の平均再生レイテンシー(秒)に設定します。

  10. [[minimum latency]] を、現在追跡中の区間 にわたる [[audio context]] の再生の最小再生レイテンシー(秒)に設定します。

  11. [[maximum latency]] を、現在追跡中の区間 にわたる [[audio context]] の再生の最大再生レイテンシー(秒)に設定します。

1.33.4. AudioPlaybackStats のプライバシーに関する考慮事項

1.33.4.1. リスク
オーディオアンダーラン情報は、協調する 2 つのサイト間で クロスサイト隠れチャネルを形成するために使用される可能性があります。 一方のサイトが意図的にオーディオグリッチを発生させることで (たとえば非常に高い CPU 使用率を発生させることで)情報を送信し、 もう一方のサイトがこれらのグリッチを検出できます。

注: この隠れチャネルは特定のシステム特性に 依存します。 通常、共有の直列化点(OS やブラウザーの オーディオミキサーなど)と、その点から実質的に同期するコールバックが必要であり、 負荷の急増を平坦化する中間バッファリングがないことが必要です。

1.33.4.2. 緩和策
このような隠れチャネルの使用を抑制するため、API は次の 緩和策を実装します。

2. 処理モデル

2.1. 背景

この節は非規範的です。

低レイテンシーを必要とするリアルタイムオーディオシステムは、 多くの場合コールバック関数を使用して実装されます。再生を途切れさせないために さらにオーディオを計算する必要があるとき、オペレーティングシステムが プログラムをコールバックします。このようなコールバックは理想的には 高優先度スレッド(多くの場合、システム上で最高優先度)で呼び出されます。 これは、オーディオを扱うプログラムが このコールバックからのみコードを実行することを意味します。スレッド境界を越えたり、 レンダリングスレッドとコールバックの間にバッファリングを追加したりすると、 自然にレイテンシーが増加したり、システムがグリッチに弱くなったりします。

このため、Web プラットフォーム上で非同期 操作を実行する従来の方法であるイベントループは、 スレッドが継続的に実行されるわけではないため、ここでは機能しません。 さらに、従来の実行コンテキスト(Window と Worker)からは、 不要で潜在的にブロッキングする多数の操作が利用可能であり、 許容可能なレベルのパフォーマンスを実現するうえで望ましくありません。

また、Worker モデルでは、スクリプト実行コンテキストごとに 専用スレッドを作成する必要がありますが、通常はすべての AudioNode が同じ実行コンテキストを共有します。

注: この節では、最終結果がどのようになるべきかを 指定しており、どのように実装すべきかを指定しているわけではありません。 特に、メッセージキューを使用する代わりに、 メモリ操作が並べ替えられない限り、 実装者はスレッド間で共有されるメモリを使用できます。

2.2. 制御スレッドとレンダリングスレッド

Web Audio API は、制御スレッドと レンダリングスレッドを使用して 実装されなければなりません。

制御スレッドは、 AudioContext がインスタンス化され、作者が オーディオグラフを操作するスレッドです。つまり、 BaseAudioContext に対する操作が呼び出されるスレッドです。レンダリング スレッド は、制御スレッドからの呼び出しに応じて、 実際のオーディオ出力が計算されるスレッドです。AudioContext のオーディオを計算する場合は リアルタイムのコールバックベースのオーディオスレッドであり得ますし、 OfflineAudioContext のオーディオを計算する場合は通常のスレッドであり得ます。

制御スレッドは、 [HTML] で説明されている従来のイベントループを使用します。

レンダリングスレッド は、オーディオグラフの レンダリングの節で説明されている専用のレンダリングループを使用します。

制御 スレッドから レンダリング スレッドへの通信は、制御メッセージの受け渡しを使用して行われます。 逆方向の通信は、通常のイベントループ タスクを使用して行われます。

各 AudioContext には単一の 制御 メッセージキュー があり、これは レンダリングスレッド上で実行される操作である 制御メッセージのリストです。

制御メッセージをキューに入れるとは、 メッセージを BaseAudioContext の 制御メッセージキューの末尾に追加することを意味します。

注: たとえば、 AudioBufferSourceNode source 上で start() を正常に呼び出すと、 関連付けられた BaseAudioContext の 制御メッセージ キューに 制御 メッセージが追加されます。

制御メッセージは、 制御メッセージ キュー内で挿入時刻順に並べられます。 したがって、最も古いメッセージは、 制御メッセージキューの先頭にあるものです。

制御メッセージ キュー QA を別の 制御メッセージキュー QB と 交換するとは、 次の手順を実行することを意味します:
  1. QC を新しい空の 制御メッセージ キューとします。

  2. QA のすべての 制御メッセージを QC へ移動します。

  3. QB のすべての 制御メッセージを QA へ移動します。

  4. QC のすべての 制御メッセージを QB へ移動します。

2.3. 非同期操作

AudioNode のメソッド呼び出しは実質的に非同期であり、 同期部分と非同期部分の 2 段階で 行われなければなりません。各メソッドでは、実行の一部が 制御スレッド上で行われ (たとえば、無効なパラメーターの場合に例外を投げる)、 一部は レンダリング スレッド上で行われます(たとえば、AudioParam の値を変更する)。

AudioNode および BaseAudioContext に対する各操作の説明では、 同期節には ⌛ が付けられます。それ以外の すべての操作は、[HTML] で説明されているように、 並列に実行されます。

同期節は 制御スレッド上で直ちに実行されます。 失敗した場合、メソッドの実行は中止され、 例外が投げられる可能性があります。成功した場合、 レンダリングスレッド上で 実行される操作をエンコードした 制御 メッセージが、この レンダリングスレッドの 制御メッセージ キューに追加されます。

同期節と非同期節の他のイベントに対する順序は 同じでなければなりません。同期節と非同期節がそれぞれ ASync と AAsync、 BSync と BAsync である 2 つの操作 A と B があり、 A が B より前に発生する場合、 ASync は BSync より前に発生し、 AAsync は BAsync より前に発生します。言い換えると、同期節と 非同期節を並べ替えることはできません。

2.4. サポートされるサンプルレート

実装は 3000 Hz 以上 768000 Hz 以下のサンプルレートを サポートしなければなりません。この 範囲外のサンプルレートが指定された場合、NotSupportedError を投げなければなりません。

2.5. サポートされるレンダー量子サイズ

実装は、1 サンプルフレームからコンテキストのサンプルレートの 6 倍までの [[render quantum size]] をサポートしなければなりません。コンテキストのサンプルレートの 6 倍が 整数でない場合は、最も近い整数へ切り捨てます。 この範囲外の [[render quantum size]] が指定された場合、NotSupportedError を投げなければなりません。

注: 上限の 6 秒は、非推奨の ScriptProcessorNode インターフェイスを最大バッファーサイズ 16384、 サポートされる最低サンプルレート 3000 Hz で使用するアプリケーションを サポートするために選択されました。 コンテキストのサンプルレートが 3000 Hz の場合、サポートされる範囲は [1, 18000] です。サンプルレートが高いほど、上限も高くなります。

2.6. オーディオグラフのレンダリング

オーディオグラフのレンダリングはサンプルフレームのブロック単位で行われ、 各ブロックのサイズは BaseAudioContext のライフタイム中、一定のままです。ブロック内の サンプルフレーム数は レンダー量子サイズと呼ばれ、ブロック 自体は レンダー 量子と呼ばれます。既定値は 128 で、 renderSizeHint を設定することで構成できます。

特定のスレッド上でアトミックに発生する操作は、 別のスレッド上で他の アトミック 操作が実行されていない場合にのみ実行できます。

BaseAudioContext G から、制御メッセージ キュー Q を使用してオーディオのブロックをレンダリングするアルゴリズムは、 複数の手順で構成され、 グラフのレンダリングアルゴリズムでさらに詳しく説明されます。

AudioContext の レンダリングスレッドは、 一定間隔で周期的に呼び出される システムレベルの オーディオコールバックによって駆動されます。 各呼び出しには システムレベルのオーディオコールバックバッファー サイズがあり、これは次の システムレベルのオーディオコールバックが到着する前に 時間どおりに計算する必要がある、変動するサンプルフレーム数です。

負荷値は、 各 システムレベルのオーディオ コールバックについて、その実行時間を、 システムレベルの オーディオコールバックバッファーサイズを sampleRate で割った値で除算することによって計算されます。

理想的には 負荷値は 1.0 未満であり、 これはオーディオのレンダリングに要した時間が、 その再生に要した時間より短かったことを意味します。オーディオバッファー アンダーランは、この 負荷値が 1.0 より大きい場合に発生します。つまり、 システムはリアルタイムに十分な速度でオーディオをレンダリングできませんでした。

オーディオグラフの レンダー量子 サイズは、必ずしも システムレベルのオーディオコールバックバッファーサイズの 約数ではありません。これにより、 オーディオレイテンシーが増加し、 オーディオバッファー アンダーランを発生させずに可能な最大負荷が低下します。

システムレベルのオーディオコールバックおよび 負荷 値の概念は、OfflineAudioContext には適用されないことに注意してください。

オーディオコールバックも 制御メッセージキュー内のタスクとしてキューに入れられます。 UA は、要求されたバッファーサイズを満たすためにレンダー量子を処理し、 このタスクを完了するため、次のアルゴリズムを実行しなければなりません。 制御メッセージ キューに加えて、各 AudioContext には通常の タスク キューがあり、制御スレッドからレンダリングスレッドへ投稿されるタスクのために 関連付けられたタスクキュー と呼ばれます。 レンダー量子の処理後には追加のマイクロタスクチェックポイントが実行され、 AudioWorkletProcessor の process メソッドの実行中にキューへ追加された可能性のある マイクロタスクが実行されます。

AudioWorkletNode から投稿されるすべてのタスクは、関連付けられた BaseAudioContext の 関連付けられたタスクキューへ投稿されます。

次の手順は、レンダリングループが開始する前に 1 回実行されなければなりません。
  1. BaseAudioContext の内部スロット [[current frame]] を 0 に設定します。また、currentTime も 0 に設定します。

レンダー量子をレンダリングするとき、次の手順を実行しなければなりません。
  1. render result を false とします。

  2. 制御メッセージキューを処理します。

    1. Qrendering を空の 制御メッセージ キューとします。Qrendering を現在の 制御メッセージキューと アトミックに交換します。

    2. Qrendering にメッセージが存在する間、 次の手順を実行します:

      1. Qrendering の 最も古いメッセージの 非同期節を実行します。

      2. Qrendering の 最も古いメッセージを削除します。

  3. BaseAudioContext の 関連付けられたタスクキューを処理します。

    1. task queue を、BaseAudioContext の 関連付けられたタスクキューとします。

    2. task count を task queue 内のタスク数とします。

    3. task count が 0 でない間、次の手順を実行します:

      1. oldest task を task queue 内の最初の実行可能なタスクとし、 task queue から削除します。

      2. レンダリングループの現在実行中のタスクを oldest task に設定します。

      3. oldest task の手順を実行します。

      4. レンダリングループの現在実行中のタスクを null に戻します。

      5. task count を 1 減らします。

      6. マイクロタスクチェックポイントを実行します。

  4. レンダー量子を処理します。

    1. BaseAudioContext の [[rendering thread state]] が running でない場合、false を返します。

    2. BaseAudioContext の処理対象となる AudioNode を順序付けします。

      1. ordered node list を、AudioNode と AudioListener の空のリストとします。 この順序付けアルゴリズムが終了すると、AudioNode と AudioListener の順序付けされたリストが含まれます。

      2. nodes を、この BaseAudioContext によって作成され、 まだ生存しているすべてのノードの集合とします。

      3. AudioListener を nodes に追加します。

      4. cycle breakers を空の DelayNode の集合とします。これは 循環の一部であるすべての DelayNode を含むことになります。

      5. nodes 内の各 AudioNode node について:

        1. node が循環の一部である DelayNode の場合、これを cycle breakers に追加し、nodes から削除します。

      6. cycle breakers 内の各 DelayNode delay について:

        1. delayWriter と delayReader を、それぞれ delay の DelayWriter と DelayReader とします。 delayWriter と delayReader を nodes に追加します。delay をすべての入力および 出力から切断します。

          注: これにより 循環が切断されます。DelayNode が 循環内にある場合、循環内のディレイラインは 1 レンダー量子未満には できないため、その 2 つの端を別々に扱うことができます。

      7. nodes に循環が含まれる場合、その循環の一部である すべての AudioNode をミュートし、 nodes から削除します。

      8. nodes 内のすべての要素を未マークとみなします。 nodes に未マークの要素が存在する間:

        1. nodes 内の要素 node を選択します。

        2. node を訪問します。

        ノードを訪問するとは、 次の手順を実行することを意味します:
        1. node がマーク済みの場合、これらの手順を中止します。

        2. node をマークします。

        3. node が AudioNode の場合、node の入力に接続された各 AudioNode を訪問します。

        4. node の各 AudioParam param について:

          1. param に接続された各 AudioNode param input node について:

            1. param input node を訪問します。

        5. node を ordered node list の先頭に追加します。

      9. ordered node list の順序を逆にします。

    3. このブロックについて AudioListener の AudioParam の値を計算します。

    4. ordered node list 内の各 AudioNode について:

      1. この AudioNode の各 AudioParam について、次の手順を実行します:

        1. この AudioParam に AudioNode が接続されている場合、 この AudioParam に接続されたすべての AudioNode によって読み取り可能にされたバッファーを 合計し、 結果のバッファーをモノラルチャンネルにダウンミックスして、 このバッファーを 入力 AudioParam バッファーと呼びます。

        2. このブロックについて、この AudioParam の値を計算します。

        3. 制御 メッセージをキューに入れ、この AudioParam の [[current value]] スロットを § 1.6.3 値の計算に従って設定します。

      2. この AudioNode の入力に AudioNode が接続されている場合、 この AudioNode に接続されたすべての AudioNode によって読み取り可能にされたバッファーを 合計します。 結果のバッファーは 入力バッファーと呼ばれます。 この AudioNode の入力チャンネル数と一致するように アップミックスまたはダウンミックスします。

      3. この AudioNode が ソースノードの場合、 オーディオのブロックを計算し、 読み取り可能にします。

      4. この AudioNode が AudioWorkletNode の場合、次のサブステップを実行します:

        1. processor を、AudioWorkletNode に関連付けられた AudioWorkletProcessor インスタンスとします。

        2. O を processor に対応する ECMAScript オブジェクトとします。

        3. processCallback を未初期化の変数とします。

        4. completion を未初期化の変数とします。

        5. スクリプトを実行する準備を、 現在の設定オブジェクトを使用して行います。

        6. コールバックを実行する準備を、 現在の設定オブジェクトを使用して行います。

        7. getResult を Get(O, "process") とします。

        8. getResult が abrupt completion の場合、completion を getResult に設定し、return とラベル付けされた手順へ移動します。

        9. processCallback を getResult.[[Value]] に設定します。

        10. ! IsCallable(processCallback) が false の場合:

          1. completion を新しい Completion {[[Type]]: throw, [[Value]]: 新しく作成された TypeError オブジェクト, [[Target]]: empty} に設定します。

          2. return とラベル付けされた手順へ移動します。

        11. [[callable process]] を true に設定します。

        12. 次のサブステップを実行します:

          1. args を、 inputs、 outputs、 および parameters からなる Web IDL 引数リストとします。

          2. esArgs を、args を ECMAScript 引数 リストへ 変換した結果とします。

          3. callResult を Call(processCallback, O, esArgs) とします。この操作は esArgs を使用して オーディオのブロックを計算します。 関数呼び出しに成功すると、 outputs を介して渡された Float32Array の要素のコピーを含むバッファーが 読み取り可能にされます。 この呼び出し内で解決された Promise は、AudioWorkletGlobalScope のマイクロタスクキューに追加されます。

          4. callResult が abrupt completion の場合、completion を callResult に設定し、 return とラベル付けされた手順へ移動します。

          5. processor の アクティブ ソースフラグを ToBoolean(callResult.[[Value]]) に設定します。

        13. Return: この時点で、 completion は ECMAScript の completion 値に設定されています。

          1. コールバックの実行後に クリーンアップを、現在の設定 オブジェクトを使用して行います。

          2. スクリプトの 実行後にクリーンアップを、現在の設定 オブジェクトを使用して行います。

          3. completion が abrupt completion の場合:

            1. [[callable process]] を false に設定します。

            2. processor の アクティブソースフラグを false に設定します。

            3. 無音の 出力バッファーを読み取り可能にします。

            4. タスクをキューに入れ、 制御スレッドで、 関連付けられた AudioWorkletNode に対して ErrorEvent を使用し、processorerror という名前のイベントを 発火します。

      5. この AudioNode が デスティネーションノードの場合、 この AudioNode の入力を記録します。

      6. それ以外の場合、入力 バッファーを処理し、 結果のバッファーを読み取り可能にします。

    5. 次の手順をアトミックに 実行します:

      1. [[current frame]] を レンダー量子サイズだけ増加させます。

      2. currentTime を、[[current frame]] を sampleRate で割った値に設定します。

    6. render result を true に設定します。

  5. マイクロタスクチェックポイントを実行します。

  6. render result を返します。

AudioNode をミュートするとは、 このオーディオブロックのレンダリング中、その 出力が無音でなければならないことを意味します。

AudioNode からバッファーを 読み取り可能にするとは、 この AudioNode に接続された他の AudioNode が安全に 読み取れる状態にすることを意味します。

注: たとえば、実装は新しいバッファーを 割り当てることも、 より高度な仕組みを使用して、現在未使用になった既存のバッファーを 再利用することもできます。

AudioNode の入力を記録する とは、この AudioNode の入力データを将来の 使用のためにコピーすることを意味します。

オーディオの ブロックを計算するとは、 この AudioNode のアルゴリズムを実行して、 [[render quantum size]] 個のサンプルフレームを生成することを意味します。

入力 バッファーを処理するとは、 入力 バッファーと、この AudioNode の AudioParam の値を入力として使用して、 AudioNode のアルゴリズムを実行することを意味します。

2.7. AudioContext での中断の処理

中断とは、 AudioContext のオーディオ再生を停止する必要があるときにユーザーエージェントによって生成される イベントです。たとえば、別のアプリケーションが オーディオ出力ハードウェアへの排他的アクセスを要求した場合、ユーザーエージェントは 中断を生成することがあります。

中断が発生したとき、 ユーザーエージェントは AudioContext を中断するための制御メッセージをキューに入れなければなりません。

context という AudioContext を中断する ための 制御メッセージ を実行することは、レンダリングスレッド上で次の手順を実行することを意味します:

  1. context の [[rendering thread state]] が closed または interrupted の場合、 これらの手順を中止します。

  2. context の [[rendering thread state]] が running の場合:

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

    2. 次の手順を実行するためにメディア要素タスクをキューに入れます:

      1. context の [[control thread state]] を interrupted に設定します。

      2. context の [[state before interruption]] スロットを "running" に設定します。

      3. context で statechange という名前のイベントを発火します。

  3. context の [[rendering thread state]] が suspended の場合:

    1. 次の手順を実行するためにメディア要素タスクをキューに入れます:

      1. context の [[control thread state]] を interrupted に設定します。

      2. context の [[state before interruption]] スロットを "suspended" に設定します。

  4. context の [[rendering thread state]] を interrupted に設定します。

注: AudioContext が suspended の場合、 ユーザーのアクティビティを過剰に共有すること(たとえば、電話の着信時や画面が ロックされたとき)を避けるプライバシー上の理由から、statechange イベントは発火されません。

中断が終了すると、 ユーザーエージェントは AudioContext の中断を終了するための制御メッセージをキューに入れなければなりません。

AudioContext context の 中断を終了するための 制御メッセージ を実行することは、レンダリング スレッド上で次の手順を実行することを意味します:

  1. context の [[rendering thread state]] が interrupted でない場合、 これらの手順を中止します。

  2. context の [[state before interruption]] が "running" の場合:

    1. システムリソースの取得を試みます。

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

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

    4. 次の手順を実行するためにメディア要素タスクをキューに入れます:

      1. AudioContext の state 属性がまだ "running" でない場合:

        1. context の [[control thread state]] を "running" に設定します。

        2. context で statechange という名前のイベントを発火します。

  3. context の [[state before interruption]] が "suspended" の場合

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

    2. 次の手順を実行するためにメディア要素タスクをキューに入れます:

      1. context の [[control thread state]] を suspended に設定します。

  4. context の [[state before interruption]] を null に設定します。

2.8. AudioContext におけるシステムオーディオリソースからのエラーの処理

AudioContext audioContext は、オーディオシステムリソースエラーが発生した場合、 レンダリングスレッド上で次の手順を実行します。

  1. audioContext の [[rendering thread state]] が running または interrupted の場合:

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

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

    3. 次の手順を実行するためにメディア要素タスクをキューに入れます:

      1. audioContext で error という名前のイベントを発火します。

      2. audioContext の [[suspended by user]] を false に設定します。

      3. audioContext の [[control thread state]] を suspended に設定します。

      4. audioContext の state 属性を "suspended" に設定します。

      5. audioContext で statechange という名前のイベントを発火します。

    4. これらの手順を中止します。

  2. audioContext の [[rendering thread state]] が suspended の場合:

    1. 次の手順を実行するためにメディア要素タスクをキューに入れます:

      1. audioContext で error という名前のイベントを発火します。

注: システムオーディオリソースエラーの例として、 AudioContext のアクティブなレンダリング中に外部またはワイヤレスのオーディオデバイスが 切断される場合があります。

2.9. 文書のアンロード

BaseAudioContext を使用する文書について、追加の文書アンロード クリーンアップ手順が定義されます:
  1. 関連するグローバルオブジェクトが 文書に関連付けられた Window と同じである各 AudioContext および OfflineAudioContext について、[[pending promises]] のすべての Promise を InvalidStateError で拒否します。

  2. すべての decoding thread を停止します。

  3. AudioContext または OfflineAudioContext を close() するための制御メッセージをキューに入れます。

3. 動的ライフタイム

3.1. 背景

注: AudioContext と AudioNode のライフタイム特性の規範的な説明は、 AudioContext のライフタイムおよび AudioNode のライフタイムで説明されています。

この節は非規範的です。

静的なルーティング構成を作成できることに加えて、 ライフタイムが限られた動的に割り当てられるボイスに対して、 カスタムエフェクトルーティングを行える必要もあります。 この説明では、こうした短命なボイスを「ノート」と呼ぶことにします。 多くのオーディオアプリケーションはノートの概念を取り入れており、 例としてドラムマシン、シーケンサー、ゲームプレイに応じて 多数のワンショットサウンドがトリガーされる 3D ゲームがあります。

従来のソフトウェアシンセサイザーでは、ノートは 利用可能なリソースのプールから動的に割り当てられ、解放されます。 MIDI ノートオンメッセージを受信するとノートが割り当てられます。 ノートがサンプルデータの末尾に達した(ループしない場合)、 エンベロープのサステインフェーズが 0 に達した、 または MIDI ノートオフメッセージによってエンベロープのリリースフェーズへ移行し、 再生を終えたときに解放されます。 MIDI ノートオフの場合、ノートはすぐには解放されず、 リリースエンベロープフェーズが終了したときにのみ解放されます。 任意の時点で多数のノートが再生されている可能性がありますが、 新しいノートがルーティンググラフへ追加され、 古いノートが解放されるため、ノートの集合は常に変化します。

オーディオシステムは、個々の「ノート」イベントに対する ルーティンググラフの一部の解体を自動的に処理します。「ノート」は AudioBufferSourceNode で表され、 他の処理ノードへ直接接続できます。ノートの再生が 終了すると、コンテキストは AudioBufferSourceNode への参照を自動的に解放し、 それにより接続先ノードへの参照も解放され、以降も同様に続きます。 ノードはグラフから自動的に切断され、 参照がなくなると削除されます。動的なボイス間で共有され、 長寿命であるグラフ内のノードは明示的に管理できます。 複雑に聞こえますが、これらはすべて追加の処理なしに 自動的に行われます。

3.2. 例

動的割り当て
早期に解放されるサブグラフを含むグラフ。

ローパスフィルター、パンナー、2 番目のゲインノードは ワンショットサウンドから直接接続されています。そのため、再生が終了すると コンテキストはそれら(点線内のすべて)を自動的に解放します。 ワンショットサウンドおよび接続されたノードへの参照が なくなると、それらは直ちにグラフから削除され、 破棄されます。ストリーミングソースはグローバル参照を持ち、 明示的に切断されるまで接続されたままです。 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 が 0 でない テールタイムと、 入力チャンネル数に依存する出力チャンネル 数を持つ場合、入力チャンネル数が変化するときには、 AudioNode の テールタイムを考慮しなければなりません。

入力チャンネル数が減少する場合、 より多いチャンネル数で受信された入力が出力へ 影響しなくなった時点で、出力チャンネル数を変更しなければなりません。

入力チャンネル数が増加する場合、動作は AudioNode の型に依存します:

注: 直感的には、これにより処理の一部として ステレオ情報が失われることを防ぎます。つまり、異なるチャンネル数の複数の入力レンダー量子が 1 つの出力レンダー量子に寄与する場合、 出力レンダー量子のチャンネル数は入力レンダー量子の入力チャンネル数の 上位集合になります。

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. チャンネル規則の例

// ゲインノードを明示的な 2 チャンネル(ステレオ)に設定する。gain.channelCount = 2;gain.channelCountMode = "explicit";gain.channelInterpretation = "speakers";// 2 つのステレオ出力バスを持つ DJ アプリ向けに「ハードウェア出力」を 4 チャンネルに設定する。context.destination.channelCount = 4;context.destination.channelCountMode = "explicit";context.destination.channelInterpretation = "discrete";// カスタムマルチチャンネルスピーカー配列向けに「ハードウェア出力」を 8 チャンネルに設定する// カスタムマトリックスミキシングを使用する。context.destination.channelCount = 8;context.destination.channelCountMode = "explicit";context.destination.channelInterpretation = "discrete";// HTMLAudioElement を再生するために「ハードウェア出力」を 5.1 に設定する。context.destination.channelCount = 6;context.destination.channelCountMode = "explicit";context.destination.channelInterpretation = "speakers";// 明示的にモノラルへダウンミックスする。gain.channelCount = 1;gain.channelCountMode = "explicit";gain.channelInterpretation = "speakers";

5. オーディオ信号値

5.1. オーディオサンプル形式

リニアパルス 符号変調(リニア PCM)は、 オーディオ値が一定間隔でサンプリングされ、連続する 2 つの値の間の 量子化レベルが線形に均一である形式を表します。

この仕様で信号値がスクリプトへ公開される場合、それらは リニア 32 ビット浮動小数点パルス符号変調形式(リニア 32 ビット float PCM)であり、多くの場合 Float32Array オブジェクトの形式です。

5.2. レンダリング

任意のオーディオグラフのデスティネーションノードにおける すべてのオーディオ信号の範囲は、公称上 [-1, 1] です。この範囲外の 信号値、または NaN、正の無限大、負の 無限大の値のオーディオレンディションは、この仕様では未定義です。

6. 空間化/パンニング

6.1. 背景

現代の 3D ゲームで一般的に要求される機能は、 3D 空間内で複数のオーディオソースを動的に空間化し、移動できることです。 たとえば OpenAL にはこの機能があります。

PannerNode を使用すると、オーディオストリームを AudioListener に対して空間内に空間化または配置できます。 BaseAudioContext は単一の AudioListener を含みます。 パンナーとリスナーの両方は、右手系のデカルト座標系を使用した 3D 空間内の位置を持ちます。座標系で使用される単位は定義されておらず、 定義する必要もありません。これらの座標から計算される効果は、 メートルやフィートなど特定の単位に依存せず不変だからです。 PannerNode オブジェクト(ソースストリームを表す)は、 音がどの方向へ投射されるかを表す向きベクトルを持ちます。 さらに、音の指向性の程度を表すサウンドコーンを持ちます。 たとえば、音は無指向性であることができ、その場合は向きに関係なく どこからでも聞こえます。または、より指向性を持ち、 リスナーの方を向いている場合にのみ聞こえることもあります。 AudioListener オブジェクト(人の耳を表す)は、 人がどの方向を向いているかを表す forward および up ベクトルを持ちます。

空間化の座標系は下の図に示され、 既定値も表示されています。AudioListener と PannerNode の位置は、より見やすくするために 既定位置から移動されています。

パンナー座標
AudioListener と PannerNode の属性を示した座標系の図。

レンダリング中、PannerNode は方位角と仰角を計算します。これらの値は、 空間化効果をレンダリングするために実装によって内部的に使用されます。 これらの値がどのように使用されるかの詳細については、パンニングアルゴリズムの節を 参照してください。

6.2. 方位角と仰角

PannerNode の方位角と仰角を計算するために、 次のアルゴリズムを使用しなければなりません。 実装は、以下の各 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;// 方位角をリスナーの "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" パンニング

これは、基本的ではあるものの妥当な結果を提供する、 単純で比較的低コストのアルゴリズムです。 PannerNode の panningModel 属性が "equalpower" に設定されている場合に使用され、その場合は仰角 の値は無視されます。このアルゴリズムは、 automationRate で指定された適切なレートを使用して実装されなければなりません。 PannerNode の AudioParam または AudioListener の AudioParam のいずれかが "a-rate" である場合、 a-rate 処理を使用しなければなりません。

  1. この AudioNode によって計算される各サンプルについて:

    1. azimuth を、方位角と 仰角の節で計算された値とします。

    2. azimuth 値をまず、次のように 範囲 [-90, 90] 内に収めます:

      // まず、方位角を許容範囲 [-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. モノラル入力の場合、azimuth から 正規化値 x を次のように計算します:

      x = (azimuth + 90) / 180;
      

      またはステレオ入力の場合:

      if (azimuth <= 0) { // -90 -> 0
          // 方位角の値を [-90, 0] 度から範囲 [-90, 90] へ変換する。
          x = (azimuth + 90) / 90;
      } else { // 0 -> 90
          // 方位角の値を [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 を、この StereoPannerNode の pan AudioParam の computedValue とします。

    2. pan を [-1, 1] にクランプします。

      pan = max(-1, pan);
      pan = min(1, pan);
      
    3. pan 値を [0, 1] に正規化して x を計算します。モノラル入力の場合:

      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 属性に依存します。

オーディオレンダリング中、パンナーとリスナーの位置に基づいて 次のように距離値が計算されます:

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 度です。

コーン図
ソースの向き、およびリスナーの位置と向きに対するソースのコーン角度。

ソース(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; // コーンが指定されていない - ユニティゲイン  // 正規化されたソース-リスナーベクトル  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);  // API は半角ではなく全角なので、ここで 2 で割る  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 {    // 内側コーンと外側コーンの間    // 内側 -> 外側で、x は 0 -> 1 へ変化する    const x = (absAngle - absInnerAngle) / (absOuterAngle - absInnerAngle);    gain = (1 - x) + source.coneOuterGain * x;  }  return gain;}

7. パフォーマンスに関する考慮事項

7.1. レイテンシー

レイテンシー
レイテンシーが重要になり得るユースケース

Web アプリケーションでは、マウスやキーボードの イベント(keydown、mousedown など)から音が聞こえるまでの 時間遅延が重要です。

この時間遅延はレイテンシーと呼ばれ、複数の要因 (入力デバイスのレイテンシー、内部バッファリングのレイテンシー、DSP 処理 レイテンシー、出力デバイスのレイテンシー、ユーザーの耳と スピーカーとの距離など)によって生じ、累積します。このレイテンシーが大きいほど、 ユーザー体験の満足度は低下します。極端な場合、 音楽制作やゲームプレイが不可能になることがあります。中程度の レベルでも、タイミングに影響し、音が遅れている、 またはゲームの応答が鈍いという印象を与えることがあります。 音楽アプリケーションではタイミングの問題がリズムに影響します。 ゲームでは、タイミングの問題がゲームプレイの精度に影響します。 対話型アプリケーションでは、非常に低いアニメーションフレームレートの場合と ほぼ同様に、一般にユーザー体験を損ないます。 アプリケーションによっては、妥当なレイテンシーは 3〜6 ミリ秒程度から 25〜50 ミリ秒程度までです。

実装は一般に、全体的なレイテンシーを最小化するよう努めます。

全体的なレイテンシーを最小化することに加え、実装は一般に AudioContext の currentTime と AudioProcessingEvent の playbackTime の差を最小化するよう努めます。 ScriptProcessorNode が非推奨になることで、 この考慮事項は時間とともに重要性が低下します。

さらに、一部の AudioNode は、オーディオグラフの一部の経路に レイテンシーを追加することがあります。特に:

7.2. オーディオバッファーのコピー

AudioBuffer に対して 内容を取得する 操作が実行される場合、通常は操作全体を チャンネルデータのコピーなしで実装できます。 特に、最後の手順は次回の getChannelData() 呼び出し時に遅延して実行するべきです。 これは、途中に getChannelData() がない、連続する 内容を取得する操作のシーケンス (たとえば、複数の AudioBufferSourceNode が同じ AudioBuffer を再生する場合)を、 割り当てやコピーなしで実装できることを意味します。

実装は追加の最適化を行えます。つまり、 AudioBuffer 上で getChannelData() が呼び出されたとき、 新しい ArrayBuffer がまだ割り当てられていないものの、 AudioBuffer に対する以前の 内容を取得する操作のすべての呼び出し元が AudioBuffer のデータの使用を停止している場合、 生のデータバッファーを新しい AudioBuffer で使用するために再利用でき、 チャンネルデータの再割り当てやコピーを回避できます。

7.3. AudioParam の遷移

AudioParam の value 属性を直接設定する際に自動的な平滑化は行われませんが、 一部のパラメーターでは、値を直接設定するより 滑らかな遷移の方が望ましい場合があります。

小さい timeConstant を指定して setTargetAtTime() メソッドを使用すると、 作者は滑らかな遷移を実現できます。

7.4. オーディオのグリッチ

オーディオグリッチは、通常の連続した オーディオストリームが中断されることで発生し、大きなクリック音やポップ音を生じさせます。 これはマルチメディアシステムの致命的な障害と見なされ、 回避しなければなりません。オーディオストリームをハードウェアへ 配信する役割を持つスレッドの問題、たとえば、 スレッドが適切な優先度や時間制約を持たないことによる スケジューリングレイテンシーによって発生することがあります。 また、オーディオ DSP が CPU の速度でリアルタイムに実行可能な量を超える 処理を行おうとすることによっても発生します。

8. プライバシーに関する考慮事項

自己レビュー質問票: セキュリティとプライバシー § 質問に従います:

  1. この仕様は個人を特定できる情報を扱いますか?

    Web Audio API を使用して聴力検査を実施し、 人に聞こえる周波数範囲(これは年齢とともに低下します)を 明らかにすることは可能です。ただし、能動的な参加が必要なため、 ユーザーが認識し同意することなくこれを行う方法を想定するのは困難です。

  2. この仕様は高価値データを扱いますか?

    いいえ。クレジットカード情報などは Web Audio では使用されません。 Web Audio を使用して音声データを処理または解析することは可能であり、 これはプライバシー上の懸念となる可能性がありますが、ユーザーの マイクへのアクセスは getUserMedia() を介した権限ベースです。

  3. この仕様は、ブラウジングセッションをまたいで持続する オリジン用の新しい状態を導入しますか?

    いいえ。AudioWorklet はブラウジングセッションをまたいで持続しません。

  4. この仕様は、永続的なクロスオリジン状態を Web に公開しますか?

    はい。サポートされるオーディオサンプルレートと出力デバイスのチャンネル数が公開されます。 AudioContext を参照してください。

  5. この仕様は、現在アクセスできないその他のデータを オリジンに公開しますか?

    はい。利用可能な AudioNode に関するさまざまな情報を提供する際、Web Audio API は AudioNode インターフェイスを使用する任意のページに対し、 クライアントの特徴的な機能(オーディオハードウェアのサンプルレートなど)に関する情報を 公開する可能性があります。さらに、 AnalyserNode または ScriptProcessorNode インターフェイスを通じてタイミング 情報を収集できます。この情報はその後、 クライアントのフィンガープリントを作成するために使用される可能性があります。

    Princeton CITP の Web Transparency and Accountability Project の研究では、DynamicsCompressorNode と OscillatorNode を使用して クライアントからエントロピーを収集し、デバイスをフィンガープリントできることが示されています。 これは、異なる実装間の DSP アーキテクチャ、リサンプリング戦略、丸めのトレードオフにおける、 小さく通常は聞き取れない差異によるものです。 使用される正確なコンパイラーフラグや CPU アーキテクチャ (ARM 対 x86)も、このエントロピーに寄与します。

    しかし実際には、これは「プラットフォーム Y 上で実行されている ブラウザー X」といった、より簡単な方法(User Agent 文字列)ですでに容易に取得できる情報を 推測できるだけです。ただし、追加のフィンガープリンティングの可能性を減らすため、 任意のノードの出力から生じ得るフィンガープリンティングの問題を緩和する措置を ブラウザーが講じることを要求します。

    クロックのずれによるフィンガープリンティングは、 Steven J Murdoch と Sebastian Zander によって 説明されています。これは getOutputTimestamp から判断できる可能性があります。 ずれに基づくフィンガープリンティングは Nakibly らによって HTML についても実証されています。 クロック解像度とドリフトに関するさらなる情報については、 High Resolution Time § 10. プライバシーに関する考慮事項の節を参照してください。

    レイテンシーによるフィンガープリンティングも可能であり、 baseLatency および outputLatency からこれを推測できる可能性があります。 緩和策には、正確な ずれが誤って報告されるようジッター(ディザリング)や量子化を追加することが含まれます。 ただし、ほとんどのオーディオシステムは、WebAudio が生成したオーディオを 他のオーディオまたはビデオソース、あるいは視覚的な合図 (たとえばゲーム、オーディオ録音、音楽制作環境)と同期させるため、 低レイテンシーを目指していることに注意してください。 過度なレイテンシーは使いやすさを低下させ、 アクセシビリティ上の問題になる可能性があります。

    AudioContext のサンプルレートによるフィンガープリンティングも可能です。 これを最小限にするため、次の手順を推奨します:

    1. 44.1 kHz と 48 kHz を既定のレートとして許可し、 システムは最適な適用性に応じてそのどちらかを選択します。 (当然、オーディオデバイスがネイティブに 44.1 の場合は 44.1 が選択されるなどしますが、 システムは最も「互換性のある」レートを選択することもあります。たとえば、 システムがネイティブに 96kHz の場合、 44.1kHz ではなく 48kHz が選択される可能性があります。

    2. ネイティブに異なるレートを使用するデバイスについては、 リサンプリングされたオーディオによって追加のバッテリー消費が生じる可能性があるとしても、 システムはこれら 2 つのレートのいずれかへリサンプリングするべきです。 (ここでも、システムは最も互換性のあるレートを選択します。たとえば、 ネイティブシステムが 16kHz の場合、48kHz が選択されると予想されます。)

    3. ブラウザーは、デバイス上のブラウザーでフラグを設定するなどして、 ネイティブレートの使用を強制するユーザー向け手段を提供すると予想されます (ただし必須ではありません)。 この設定は API には公開されません。

    4. AudioContext のコンストラクターで異なるレートを明示的に要求できることも、 想定される動作です (これはすでに仕様に含まれており、通常は要求された sampleRate でオーディオレンダリングを行い、その後デバイス出力へアップサンプリング またはダウンサンプリングします)。 そして、そのレートがネイティブにサポートされている場合、 レンダリングをそのまま渡すことができます。 これにより、ユーザーの介入なしでアプリがより高いレートでレンダリングできます (ただし、オーディオ出力でダウンサンプリングされていないことは Web Audio から観測できません)。たとえば、 MediaDevices の機能が(ユーザーの介入によって)読み取られ、 より高いレートがサポートされることを示している場合です。

    AudioContext のレンダー量子サイズによるフィンガープリンティングは、 "hardware" ヒントを使用した場合に可能です。これは ユーザーの既定のオーディオハードウェアバッファー サイズに関する情報を公開するためです。このリスクを最小化するため、 renderQuantumSize は、AudioContext が "running" 状態へ遷移するまで 0 を返します。 AudioContext が "running" 状態へ遷移した後は、 実際のレンダー量子サイズが返されます。実行中の AudioContext は AudioWorklet のタイミングを介してユーザーのオーディオハードウェアバッファーサイズを推測するために使用できるため、 これは新しい情報を公開しません。

    AudioContext の出力チャンネル数によるフィンガープリンティングも可能です。 maxChannelCount は 2 (ステレオ)に設定することを推奨します。ステレオは圧倒的に最も一般的な チャンネル数です。

  6. この仕様は、オリジンにユーザーの 位置へのアクセスを許可しますか?

    いいえ。

  7. この仕様は、オリジンにユーザーのデバイス上の センサーへのアクセスを許可しますか?

    直接には許可しません。現在、この文書ではオーディオ入力は 規定されていませんが、クライアントマシンのオーディオ入力または マイクへのアクセスを取得することになります。その場合、 適切な方法でユーザーに権限を求める必要があり、おそらく getUserMedia() API を介します。

    さらに、 Media Capture and Streams 仕様のセキュリティおよびプライバシーに関する考慮事項にも 注意するべきです。特に、周囲のオーディオを解析したり一意のオーディオを再生したりすると、 部屋単位のユーザー位置、さらには異なるユーザーや デバイスが同じ部屋を同時に占有していることを特定できる可能性があります。 オーディオ出力とオーディオ入力の両方へのアクセスにより、 1 つのブラウザー内で本来分離されているコンテキスト間の通信が可能になることもあります。

  8. この仕様は、オリジンにユーザーの ローカルコンピューティング環境の側面へのアクセスを許可しますか?

    直接には許可しません。要求されたすべてのサンプルレートがサポートされ、 必要な場合はアップサンプリングされます。 Media Capture and Streams を使用して、 MediaTrackSupportedConstraints でサポートされているオーディオサンプルレートを調査することは可能です。 これには明示的なユーザーの同意が必要です。 これはわずかなフィンガープリンティング情報を提供します。しかし、 実際にはほとんどのコンシューマーおよびプロシューマー向けデバイスは、 2 つの標準化されたサンプルレートのいずれかを使用します。44.1kHz (元々 CD で使用)と 48kHz(元々 DAT で使用)です。 リソースが非常に制約されたデバイスは音声品質の 11kHz サンプルレートを サポートする場合があり、より高級なデバイスは 88.2、96、 さらにはオーディオファイル向けの 192kHz レートをサポートすることがよくあります。

    すべての実装に、48kHz のような単一の広くサポートされた レートへのアップサンプリングを要求すると、特段の利点なく CPU コストが増加し、 高級デバイスに低いレートの使用を要求すると、 Web Audio がプロフェッショナル用途には不適切だと見なされるだけです。

  9. この仕様は一時的な識別子を Web に公開しますか?

    いいえ。

  10. この仕様はファーストパーティコンテキストと サードパーティコンテキストで動作を区別しますか?

    いいえ。

  11. この仕様は、ユーザーエージェントの 「シークレット」モードでどのように動作するべきですか?

    異なる動作はしません。

  12. この仕様はユーザーのローカルデバイスへデータを永続化しますか?

    いいえ。

  13. この仕様には「セキュリティに関する考慮事項」と 「プライバシーに関する考慮事項」の節がありますか?

    はい(現在読んでいるものです)。

9. セキュリティに関する考慮事項

自己レビュー質問票: セキュリティとプライバシー § 質問に従います:

  1. この仕様は、新しいスクリプト実行/読み込み 機構を有効にしますか?

    いいえ。ただし、[HTML] で定義されているスクリプト実行方法を 使用します。

  2. この仕様は、オリジンに他のデバイスへのアクセスを許可しますか?

    通常、他のネットワーク接続デバイスへのアクセスは許可しません (高級録音スタジオの例外として Dante ネットワーク接続 デバイスが考えられますが、通常これらは別の専用ネットワークを使用します)。 必然的に、ユーザーのオーディオ出力デバイス または複数のデバイスへのアクセスは許可します。それらはコンピューターとは別の装置である場合があります。

    音声または音で作動するデバイスの場合、Web Audio API が 他のデバイスの制御に使用される可能性があります。 さらに、音で作動するデバイスが近超音波周波数に敏感である場合、 そのような制御は聞き取れない可能性があります。 この可能性は HTML にも存在し、 <audio> または <video> 要素を通じて実現できます。 一般的なオーディオサンプリングレートでは、設計上、 超音波情報のための余裕はほとんどありません:

    人間の聴覚の上限は通常 20kHz とされています。 44.1kHz のサンプリングレートでは、ナイキスト限界は 22.05kHz です。 真のブリックウォールフィルターは物理的に実現できないため、 20kHz から 22.05kHz の間の領域は、ナイキストを超えるすべての周波数を 強く減衰させる急峻なロールオフフィルターに使用されます。

    48kHz のサンプリングレートでも、20kHz から 24kHz の帯域では 急速な減衰があります(ただし通過帯域での位相リップル エラーを回避しやすくなります)。

  3. この仕様は、オリジンにユーザーエージェントのネイティブ UI を ある程度制御することを許可しますか?

    UI に音声アシスタントやスクリーンリーダーのようなオーディオ要素がある場合、 Web Audio API を使用してネイティブ UI の側面を模倣し、 攻撃をローカルシステムイベントらしく見せる可能性があります。 この可能性は HTML にも存在し、 <audio> 要素を通じて実現できます。

  4. この仕様は、既定のセキュリティ 特性のダウングレードを許可しますか?

    いいえ。

10. 要件とユースケース

[webaudio-usecases]を参照してください。

11. 仕様コードの共通定義

この節では、この仕様内で使用される 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);    }}

12. 変更履歴

12.1. 2024年11月05日の最初の公開作業草案以降

13. 謝辞

この仕様は W3C Audio Working Group の共同作業によるものです。

ワーキンググループの現メンバー、元メンバー、および仕様への貢献者は (執筆時点で、アルファベット順)次のとおりです:
Adenot, Paul (Mozilla Foundation) - 仕様共同編集者; Akhgari, Ehsan (Mozilla Foundation); Becker, Steven (Microsoft Corporation); Berkovitz, Joe (Invited Expert, affiliated with Noteflight/Hal Leonard) - 2013年9月から 2017年12月まで WG 共同議長; Bossart, Pierre (Intel Corporation); Borins, Myles (Google, Inc); Buffa, Michel (NSAU); Caceres, Marcos (Invited Expert); 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 (Invited Expert); Lee, WonSuk (Electronics and Telecommunications Research Institute); Kakishita, Masahiro (AMEI); Kawai, Ryoya (AMEI); Kostiainen, Anssi (Intel Corporation); Lilley, Chris (W3C Staff); Lowis, Chris (Invited Expert) - 2012年12月から2013年9月まで WG 共同議長、British Broadcasting Corporation 所属; MacDonald, Alistair (W3C Invited Experts) — 2011年3月から2012年7月まで WG 共同議長; Mandyam, Giridhar (Qualcomm Innovation Center, Inc); Michel, Thierry (W3C/ERCIM); Nair, Varun (Facebook); Needham, Chris (British Broadcasting Corporation); Noble, Jer (Apple, Inc); O’Callahan, Robert(Mozilla Foundation); Onumonu, Anthony (British Broadcasting Corporation); Paradis, Matthew (British Broadcasting Corporation) - 2013年9月から現在まで WG 共同議長; 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 (British Broadcasting Corporation); Toy, Raymond (Google, Inc.) - 2017年12月から現在まで WG 共同議長; 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]

この仕様の例は、“for example” という語で導入されるか、 class="example" によって 規範的なテキストから区別され、 次のように示されます:

これは情報提供の例です。

情報提供の注記は “Note” という語で始まり、 class="note" によって 規範的なテキストから区別され、 次のように示されます:

注: これは情報提供の注記です。

適合 アルゴリズム

アルゴリズムの一部として命令形で表現された要件 (たとえば、「先頭の空白文字をすべて除去する」 または「false を返してこれらの手順を中止する」) は、そのアルゴリズムを導入する際に使用された キーワード(“must”、“should”、“may” など)の 意味で解釈されます。

アルゴリズムまたは特定の手順として表現された適合要件は、 最終結果が同等である限り、 任意の方法で実装できます。 特に、この仕様で定義されるアルゴリズムは 理解しやすいことを意図しており、 高性能であることを意図していません。 実装者には最適化が推奨されます。

索引

この仕様で定義される 用語

参照によって定義される 用語

参考文献

規範的参考文献

[DOM]
Anne van Kesteren. DOM 標準. 現行標準. URL: https://dom.spec.whatwg.org/
[ECMASCRIPT]
ECMAScript 言語仕様. URL: https://tc39.es/ecma262/multipage/
[FETCH]
Anne van Kesteren. Fetch 標準. 現行 標準. URL: https://fetch.spec.whatwg.org/
[HR-TIME-3]
Yoav Weiss. 高解像度時刻. 2026年3月24日. WD. URL: https://www.w3.org/TR/hr-time-3/
[HTML]
Anne van Kesteren; et al. HTML 標準. 現行標準. URL: https://html.spec.whatwg.org/multipage/
[INFRA]
Anne van Kesteren; Domenic Denicola. Infra 標準. 現行標準. URL: https://infra.spec.whatwg.org/
[MEDIACAPTURE-STREAMS]
Cullen Jennings; et al. メディアキャプチャと ストリーム. 2025年10月9日. CRD. URL: https://www.w3.org/TR/mediacapture-streams/
[MIMESNIFF]
Gordon P. Hemsley. MIME スニッフィング標準. 現行標準. URL: https://mimesniff.spec.whatwg.org/
[PERMISSIONS]
Marcos Caceres; Mike Taylor. 権限. 2025年10月6日. WD. URL: https://www.w3.org/TR/permissions/
[RFC2119]
S. Bradner. RFC で 要件レベルを示すために使用するキーワード. 1997年3月. 現行の最良慣行. URL: https://datatracker.ietf.org/doc/html/rfc2119
[SECURITY-PRIVACY-QUESTIONNAIRE]
Theresa O'Connor; Peter Snyder; Simone Onofri. 自己レビュー質問票: セキュリティ とプライバシー. 2025年4月18日. NOTE. URL: https://www.w3.org/TR/security-privacy-questionnaire/
[WEBIDL]
Edgar Chen; Timothy Gu. Web IDL 標準. 現行 標準. URL: https://webidl.spec.whatwg.org/
[WEBRTC]
Cullen Jennings; et al. WebRTC: ブラウザーにおけるリアルタイム通信. 2025年3月13日. REC. URL: https://www.w3.org/TR/webrtc/

非規範的参考文献

[2DCONTEXT]
Rik Cabanier; et al. HTML Canvas 2D コンテキスト. 2021年1月28日. REC. URL: https://www.w3.org/TR/2dcontext/
[MEDIASTREAM-RECORDING]
Miguel Casas-sanchez. MediaStream 録音. 2026年3月16日. WD. URL: https://www.w3.org/TR/mediastream-recording/
[WEBAUDIO-USECASES]
Joe Berkovitz; Olivier Thereaux. Web Audio 処理: ユースケースと要件. 2013年1月29日. NOTE. URL: https://www.w3.org/TR/webaudio-usecases/
[WEBCODECS]
Paul Adenot; Eugene Zemtsov. WebCodecs. 2026年7月8日. WD. URL: https://www.w3.org/TR/webcodecs/
[WEBGL]
Kelsey Gilbert. WebGL 2.0 仕様. URL: https://www.khronos.org/registry/webgl/specs/latest/2.0/
[XHR]
Anne van Kesteren. XMLHttpRequest 標準. 現行 標準. URL: https://xhr.spec.whatwg.org/

IDL 索引

enum AudioContextState {
    "suspended",
    "running",
    "closed",
    "interrupted"
};

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;
    attribute EventHandler onsinkchange;
    attribute EventHandler onerror;
    [SameObject] readonly attribute AudioPlaybackStats playbackStats;
    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 OfflineAudioContext : BaseAudioContext {
    constructor(OfflineAudioContextOptions contextOptions);
    constructor(unsigned long numberOfChannels, unsigned long length, float sampleRate);
    Promise<AudioBuffer> startRendering(optional unsigned long? chunkSize = null);
    Promise<undefined> resume();
    Promise<undefined> suspend(double suspendTime);
    Promise<undefined> close();
    readonly attribute unsigned long? length;
    attribute EventHandler oncomplete;
};

dictionary OfflineAudioContextOptions {
    unsigned long numberOfChannels = 1;
    unsigned long? length = null;
    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";
};

[Exposed=Window, SecureContext]
interface AudioPlaybackStats {
    readonly attribute double underrunDuration;
    readonly attribute unsigned long underrunEvents;
    readonly attribute double totalDuration;
    readonly attribute double averageLatency;
    readonly attribute double minimumLatency;
    readonly attribute double maximumLatency;
    undefined resetLatency();
    [Default] object toJSON();
};

✔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?