16.4 Web Audio API(网页音频接口) 计时接口

创建音频软件时最重要的事情之一就是管理时间,因为这个时间需要精度。使用JavaScript的时钟不是最好的做法,因为它不够精确。网络音频接口使用了一个可用于音频播放调度的增强版硬件时间戳,它在Audio Context被定义时设定为0。你可以尝试通过控制台的日志console.log(context.currentTime) 来查看时间戳。

如果希望振荡器立即播放,只需要运行oscillator.start(0)来启动它(0是默认值,可以省略)。如果希望它在从现在开始的一秒钟内开始播放,然后两秒钟后停止,以通过下面的方法来实现:

var now = context.currentTime;
oscillator.play(now + 1);
oscillator.stop(now + 3);

这里涉及了两个方法:
AudioParam.setValueAtTime(value, startTime)方法是在精确时间上管理了值的变化,例如在一秒钟内改变振荡器的频率值:

oscillator.frequency.setValueAtTime(261.6, context.currentTime + 1);

你可以通过修改AudioParam的属性值来像使用.setValueAtTime(value, context.currentTime)那样立即更新,但如果它们作为自动化事件(通过AudioParam方法安排的事件)发生在同一时刻时,任何更新的值会被忽略且不会抛出任何异常。

AudioParam.exponentialRampToValueAtTime(value, endTime)方法是进行值的渐变管理。这个代码使振荡器在1秒钟内可以很好的平滑的下降音量指数值。

gain.gain.exponentialRampToValueAtTime(0.001, context.currentTime + 1);

因为值需要是正数,不能为0,所以我们用一个非常小的值来替代0。