AudioParam: setTargetAtTime() 方法
AudioParam
接口的 setTargetAtTime()
方法计划开始对 AudioParam
值进行逐渐更改。这对于 ADSR 包络的衰减或释放部分很有用。
语法
setTargetAtTime(target, startTime, timeConstant)
参数
target
-
在给定开始时间时,参数将开始向其过渡的值。
startTime
-
指数过渡开始的时间,以与
AudioContext.currentTime
相同的时间坐标系表示。如果它小于或等于AudioContext.currentTime
,则参数将立即开始更改。 timeConstant
-
指数逼近目标值的时常值(以秒为单位)。此值越大,过渡速度越慢。
返回值
对该 AudioParam
对象的引用。此接口的一些较旧的浏览器实现返回 undefined
。
描述
更改从 startTime
中指定的时间开始,并以指数方式向 target
参数给出的值移动。由 timeConstant
参数定义的衰减率是指数的;因此,该值永远不会完全达到 target
,但在每个长度为 timeConstant
的时间步长后,该值将接近 target
另一个。有关完整公式(使用一阶线性连续时间不变系统),请查看 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 |
示例
在此示例中,我们有一个媒体源,它有两个控制按钮(有关源代码,请参阅 webaudio-examples 存储库,或 查看示例)。当按下这些按钮时,setTargetAtTime()
用于将增益值淡入到 1.0,并分别淡出到 0,效果在 1 秒后开始,效果持续时间由 timeConstant 控制。
// 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 的浏览器中加载。