javascript - 使用Web Audio API的点击声

标签 javascript audio web-audio-api

我一直在尝试使用Web Audio API制作数字合成器,但遇到了一些障碍。我正在尝试在复音合成器中添加一个信封,但似乎无法正确处理。我已经尝试了linearRamptoValueAtTime,exponentialRamptoValueAtTime,setTargetAtTime等的每种组合,但最终还是得到了这些令人讨厌的爆音和点击。我觉得我已经阅读了有关该主题的所有教程和文章,但显然我做错了什么。

这是我目前的攻击和释放的代码。

攻击:

let osc1Vol;
keyboard.keyDown = function(note, freq) {
    let now = audioCtx.currentTime;
    const osc1 = audioCtx.createOscillator();
    if (gainNodeTable[freq]) {
    osc1Vol = gainNodeTable[freq];
    osc1Vol.gain.cancelScheduledValues(now);
    osc1Vol.gain.setValueAtTime(osc1Vol.gain.value, now);
  } else {
    osc1Vol = audioCtx.createGain();
    osc1Vol.gain.setValueAtTime(0, now);
  }
    osc1.connect(osc1Vol);
    osc1.type = osc1wave.value;
    osc1.frequency.value = (freq * octaveTable[osc1octave.value]);
    oscillators[freq] = osc1;
    gainNodeTable[freq] = osc1Vol;
    osc1Vol.connect(audioCtx.destination);
    osc1Vol.gain.linearRampToValueAtTime(1.0, (now + parseInt(attack.value)));
  osc1.start();
};

释放:
keyboard.keyUp = function (note, freq) {
    const now = audioCtx.currentTime;
    const gain = gainNodeTable[freq].gain.value;
    gainNodeTable[freq].gain.cancelScheduledValues(now);
    gainNodeTable[freq].gain.setValueAtTime(gain, now)
    gainNodeTable[freq].gain.exponentialRampToValueAtTime(0.0001, now + parseInt(decay.value));
    oscillators[freq].stop(now + parseInt(decay.value));
};

谢谢!

最佳答案

最终只是通过过滤器运行它以消除那些频率。

关于javascript - 使用Web Audio API的点击声,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47206857/

相关文章:

javascript - var foo = foo ||警报(富);

javascript - underscore.js 中的 foreach 方法是如何工作的?

audio-recording - AnalyserNode 的 getFloatFrequencyData 与 getFloatTimeDomainData

php - 需要将工作 php 代码转换为函数(随机合并 mp3 文件)

objective-c - 音频播放的准确(音乐级)计时

javascript - Web Audio onaudioprocess 在 Firefox 中有效,JSFiddle 在 Chrome 中有效,但在 Chrome 本身中无效

audio - WebAudio中的WaveShaper节点-如何模拟失真?

javascript - 损坏的代码 -- 如何正确使用 AJAX 来阻止加载网站的这一部分?

javascript - 按数组中对象内的对象属性过滤对象数组

audio - 在网络上录制音频并将数据发送到 Android 应用程序