AudioParam: setTargetAtTime() 方法

基线 广泛可用

此功能已得到良好建立,并在许多设备和浏览器版本中运行。自以下日期起,它已在浏览器中可用 2021 年 4 月.

AudioParam 接口的 setTargetAtTime() 方法计划开始对 AudioParam 值进行逐渐更改。这对于 ADSR 包络的衰减或释放部分很有用。

语法

js
setTargetAtTime(target, startTime, timeConstant)

参数

target

在给定开始时间时,参数将开始向其过渡的值。

startTime

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

timeConstant

指数逼近目标值的时常值(以秒为单位)。此值越大,过渡速度越慢。

返回值

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

描述

更改从 startTime 中指定的时间开始,并以指数方式向 target 参数给出的值移动。由 timeConstant 参数定义的衰减率是指数的;因此,该值永远不会完全达到 target,但在每个长度为 timeConstant 的时间步长后,该值将接近 target 另一个 1 - e - 1 63.2 % 1 - e^{-1} \approx 63.2% 。有关完整公式(使用一阶线性连续时间不变系统),请查看 Web Audio 规范

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

选择合适的 timeConstant

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

根据您的用例,达到目标值的 95% 可能已经足够了;在这种情况下,您可以将 timeConstant 设置为所需持续时间的 1/3。

有关更多详细信息,请查看下表,了解随着时间的推移,值如何从 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 - n 1 - 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

浏览器兼容性

BCD 表格仅在启用了 JavaScript 的浏览器中加载。

另请参阅