AudioWorkletNode: parameters プロパティ

Baseline Widely available

This feature is well established and works across many devices and browser versions. It’s been available across browsers since April 2021.

AudioWorkletNode インターフェイスの読み取り専用プロパティ parameters は、関連付けられた AudioParamMap を返します。これは AudioParam オブジェクトが入った Map のようなコレクションです。中身のオブジェクトは、用いる AudioWorkletProcessor の生成時に parameterDescriptors 静的ゲッターに沿って生成されます。

AudioParam のインスタンスを持つ AudioParamMap オブジェクトです。 これらはデフォルトの AudioNode で行うのと同じ方法で自動化でき、計算された値は自分の AudioWorkletProcessorprocess メソッドで使用できます。

独自の AudioParam の作成と使用のデモを行うため、AudioWorkletNode ページにある例を拡張します。このページでは、ホワイトノイズを出力する単純なノードを作成しました。ここでは、独自のゲインパラメーターを追加し、出力の音量を直接変えることができるようにします。(これは GainNode を用いてもできますが)

まず、独自の AudioWorkletProcessor を定義して登録する必要があります。 これは別のファイルで行うことに注意してください。

処理器を拡張し、静的な parameterDescriptors ゲッターを追加します。これは AudioWorkletNode のコンストラクター内部で parameters に生成した AudioParam オブジェクトを入れるのに用いられます。

js
// white-noise-processor.js
class WhiteNoiseProcessor extends AudioWorkletProcessor {
  static get parameterDescriptors() {
    return [
      {
        name: "customGain",
        defaultValue: 1,
        minValue: 0,
        maxValue: 1,
        automationRate: "a-rate",
      },
    ];
  }

  process(inputs, outputs, parameters) {
    const output = outputs[0];
    output.forEach((channel) => {
      for (let i = 0; i < channel.length; i++) {
        channel[i] =
          (Math.random() * 2 - 1) *
          (parameters["customGain"].length > 1
            ? parameters["customGain"][i]
            : parameters["customGain"][0]);
        // メモ: パラメーターは 128 個の値の配列です。(128 サンプルのそれぞれについて 1 個ずつ)
        // ただし、現在自動処理がスケジュールされていない場合、
        // 128 サンプル全てで用いる値が 1 個だけ入っていることがあります。
      }
    });
    return true;
  }
}

registerProcessor("white-noise-processor", WhiteNoiseProcessor);

次に、メインスクリプトで処理器を読み込み、処理器の名前を渡して AudioWorkletNode のインスタンスを作成し、このノードを音声グラフに接続します。

js
const audioContext = new AudioContext();
await audioContext.audioWorklet.addModule("white-noise-processor.js");
const whiteNoiseNode = new AudioWorkletNode(
  audioContext,
  "white-noise-processor",
);
whiteNoiseNode.connect(audioContext.destination);

すると、ノードのゲインをこのようにして変えることができます。

js
const gainParam = whiteNoiseNode.parameters.get("customGain");
gainParam.setValueAtTime(0, audioContext.currentTime);
gainParam.linearRampToValueAtTime(0.5, audioContext.currentTime + 0.5);

仕様書

Specification
Web Audio API
# dom-audioworkletnode-parameters

ブラウザーの互換性

BCD tables only load in the browser

関連情報