AudioParam: setTargetAtTime() 方法

Baseline 已广泛支持

此特性已相当成熟,可在许多设备和浏览器版本上使用。自 ⁨2015 年 7 月⁩以来,各浏览器均已提供此特性。

AudioParam 接口的 setTargetAtTime() 方法用于调度 AudioParam 值的渐变。这对于 ADSR 包络的衰减或释放部分非常有用。

语法

js
setTargetAtTime(target, startTime, timeConstant)

参数

目标

参数将在给定开始时间开始过渡到的值。

startTime

指数过渡将开始的时间,与 AudioContext.currentTime 处于同一时间坐标系。如果它小于或等于 AudioContext.currentTime,则参数将立即开始更改。

timeConstant

目标值的指数逼近的时间常数值,单位为秒。该值越大,过渡越慢。

返回值

指向此 AudioParam 对象的引用。此接口的一些旧浏览器实现返回 undefined

描述

变化从 startTime 指定的时间开始,并呈指数趋势向 target 参数给定的值移动。timeConstant 参数定义的衰减率是指数级的;因此,值永远不会完全达到 target,但在每个长度为 timeConstant 的时间步长之后,该值将接近 target1-e-163.2%1 - e^{-1} \approx 63.2%。有关完整公式(使用一阶线性连续时间不变系统)的信息,请参阅 Web Audio 规范

如果你绝对需要在特定时间达到目标值,可以使用 AudioParam.exponentialRampToValueAtTime()。但是,出于数学原因,当当前值或目标值为 0 时,该方法不起作用。

选择合适的 timeConstant

如上所述,值呈指数变化,每个 timeConstant 使你更接近目标值 63.2%。你不必担心达到目标值;一旦足够接近,任何进一步的变化对人耳来说都将是无法察觉的。

根据你的用例,接近目标值 95% 可能已经足够;在这种情况下,你可以将 timeConstant 设置为所需持续时间的三分之一。

更多详情,请参阅下表,了解值如何随着时间的推移从 0% 变为 100%。

startTime 以来的时间
0 * timeConstant 0%
0.5 * timeConstant 39.3%
1 * timeConstant 63.2%
2 * timeConstant 86.5%
3 * timeConstant 95.0%
4 * timeConstant 98.2%
5 * timeConstant 99.3%
n * timeConstant 1
1-e-n1 - e^{-n}

示例

在此示例中,我们有一个带有两个控制按钮的媒体源(有关源代码,请参阅 webaudio-examples 仓库,或在线查看示例。)当按下这些按钮时,setTargetAtTime() 分别用于将增益值渐变到 1.0 和 0,效果在 1 秒后开始,效果的持续时间由 timeConstant 控制。

js
// create audio context
const audioCtx = new AudioContext();

// set basic variables for example
const myAudio = document.querySelector("audio");

const atTimePlus = document.querySelector(".at-time-plus");
const atTimeMinus = document.querySelector(".at-time-minus");

// Create a MediaElementAudioSourceNode
// Feed the HTMLMediaElement into it
const source = audioCtx.createMediaElementSource(myAudio);

// Create a gain node and set its gain value to 0.5
const gainNode = audioCtx.createGain();
gainNode.gain.value = 0.5;
let currGain = gainNode.gain.value;

// connect the AudioBufferSourceNode to the gainNode
// and the gainNode to the destination
source.connect(gainNode);
gainNode.connect(audioCtx.destination);

// set buttons to do something onclick
atTimePlus.onclick = () => {
  currGain = 1.0;
  gainNode.gain.setTargetAtTime(1.0, audioCtx.currentTime + 1, 0.5);
};

atTimeMinus.onclick = () => {
  currGain = 0;
  gainNode.gain.setTargetAtTime(0, audioCtx.currentTime + 1, 0.5);
};

规范

规范
Web Audio API
# dom-audioparam-settargetattime

浏览器兼容性

另见