web-audio-api - 停止振荡器时 Web Audio API 点击声音
问题描述
当使用网络音频 API 制作振荡器时,我总是在停止它时听到咔哒声。我已经搜索了周围,但没有一个解决方案对我有用。我尝试了如何在停止播放声音时避免这种“点击”声音中的所有实现?和更多
我读到的一种解决方案是等待下一个零幅度值,然后立即停止播放。有没有办法使用网络音频 api 做到这一点?
我正在考虑为我的项目切换到 Tone.Js,因为声音在没有点击的情况下播放。他们如何解决问题?
我很惊讶没有内置解决方案
解决方案
摆脱咔嗒声的最佳方法是淡出信号。这是一个小例子(未经测试):
let c = new AudioContext();
let s = new OscillatorNode(c);
let g = new GainNode(c);
s.connect(g).connect(c.destination);
g.gain.setValueAtTime(1, c.currentTime);
s.start();
// Let's stop the oscillator in 5 sec.
let stopTime = c.currentTime + 5;
s.stop(stopTime);
// Fade out the signal. Fade out starts 0.25 sec before we stop.
// Then we linearly ramp down to 0 at stopTime
g.gain.setValueAtTime(1, stopTime - 0.25);
g.gain.linearRamptToValueAtTime(0, stopTime);
有不止一种方法可以淡出信号。另一种方法是:
g.gain.setTargetAtTime(0, stopTime - 0.25, .025);
这在停止时间前 0.25 秒开始淡出。您必须适当地选择 timeConstant 值以足够快地淡出但不够快以引起点击。
推荐阅读
- sql - 在 SQL 中,如何获取一行中最大项目的列名?
- python-3.x - 我想以幻灯片的形式显示发送到特定文件夹的图像
- jenkins - 允许 Jenkins 用户在 Jenkins 上的特定 shell 脚本作业上运行 sudo 命令
- c - 将 getline() 输出保存到外部数组
- notepad++ - Notepad++ : 设置打开文件的特定编码
- sql - 在一列中拆分数据并将它们转换为 MS Access 中的列标题
- regex - Google RE2 的正则表达式测试器
- php - 警告:非法字符串偏移 'save_username'
- typescript - 如何在不重新捆绑新的 monaco-editor 的情况下将我自己的 monaco-typescript repo 分支集成到我的 monaco-editor vuejs webpack 设置中
- windows - Windows:关闭 32 位控制台应用程序时出现问题