AudioParamDescriptor - 指定了 AudioParam 对象的属性

AudioParamDescriptorWeb Audio API 的字典,指定了 AudioParam 对象的属性。它用于在 AudioWorkletNode 上创建自定义 AudioParam。如果底层的 AudioWorkletProcessor 具有 parameterDescriptors 静态 getter,则 AudioWorkletNode 构造函数在内部使用基于此字典的返回对象数组来相应地填充其 parameters 属性。

属性

name

一个 DOMString,表示 AudioParam 的名称。在该名称下,AudioParam 将在节点的 parameters 属性中可用,并在此名称下,AudioWorkletProcessor.process 方法将获取此 AudioParam 的计算值。

automationRate 可选

"a-rate""k-rate" 字符串,表示此 AudioParam 的自动化速率。默认为 "a-rate"。

minValue 可选

一个 float,表示 AudioParam 的最小值。默认为 -3.4028235e38

maxValue 可选

一个 float,表示 AudioParam 的最大值。默认为 3.4028235e38

defaultValue 可选

一个 float,,表示 AudioParam 的初始值。默认为 0

实例

为了演示自定义 AudioParam 的创建和用法,我们扩展了来自 AudioWorkletNode 页面上实例。在那里,我们创建了一个输出白噪声的简单节点。另外,在这里,我们将创建一个自定义的增益参数,因此我们可以直接更改输出的音量(尽管您也可以使用 GainNode 来实现此目的)。

首先,我们需要定义一个自定义的 AudioWorkletProcessor,并进行注册。请注意,这应该在单独的文件中完成的。

我们通过添加静态 parameterDescriptors getter 来扩展处理器。 AudioWorkletNode 构造函数将在内部使用它,以实例化的 AudioParam 对象填充其 parameters

// 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 个样本中的每个值一个值),
        // 但是,如果当前未计划自动化,则它可能包含单个值,该值将用于所有 128 个样本。
      }
    })
    return true
  }
}

registerProcessor('white-noise-processor', WhiteNoiseProcessor)

接下来,在主脚本文件中,我们将加载处理器,创建一个 AudioWorkletNode 实例,并为其传递处理器名称,然后将该节点连接到音频图。

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

现在我们可以像这样更改节点上的增益:

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

规范

规范 状态 备注
Web Audio API
AudioParamDescriptor 的定义
工作草案 初始定义。

桌面浏览器兼容性

暂无兼容数据