AudioParam: setTargetAtTime() 方法
AudioParam 接口的 setTargetAtTime() 方法用于调度 AudioParam 值的渐变。这对于 ADSR 包络的衰减或释放部分非常有用。
语法
setTargetAtTime(target, startTime, timeConstant)
参数
目标-
参数将在给定开始时间开始过渡到的值。
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 设置为所需持续时间的三分之一。
更多详情,请参阅下表,了解值如何随着时间的推移从 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 |
浏览器兼容性
加载中…