javascript - 使用 Web Audio API 使用 OscillatorNodes 演奏和弦

标签 javascript api web-audio-api

我想使用 OscillatorNodes 演奏和弦:

var ac = new (window.AudioContext || window.webkitAudioContext);
// C4, E4, G4
var freqs = [261.63, 329.63, 392.00];
for(var i=0;i<freqs.length;i++) {
  var o = ac.createOscillator();
  o.frequency.value = freqs[i];
  o.connect(ac.destination);
  o.noteOn(0);
  setTimeout(function() {o.noteOff(0)}, 1000);
}

但这种方法听起来一团糟(here's what it sounds like)。如果我尝试为和弦中的每个音符创建新的 AudioContext,那么它听起来不错(like this):

// C4, E4, G4
var freqs = [261.63, 329.63, 392.00];
for(var i=0;i<freqs.length;i++) {
  var ac = new (window.AudioContext || window.webkitAudioContext);
  var o = ac.createOscillator();
  o.frequency.value = freqs[i];
  o.connect(ac.destination);
  o.noteOn(0);
  setTimeout(function() {o.noteOff(0)}, 1000);
}

但我读到你应该只有一个 AudioContext。我做错了什么?

最佳答案

不确定这是否是一个解决方案,但我发现插入一个 GainNode 并设置它的值以便增益总和为 1 消除了这个问题:

var ac = new (window.AudioContext || window.webkitAudioContext);
// C4, E4, G4
var freqs = [261.63, 329.63, 392.00];
for(var i=0;i<freqs.length;i++) {
  var o = ac.createOscillator();
  var g = ac.createGainNode();
  o.frequency.value = freqs[i];
  o.connect(g);
  g.gain.value = 1/freqs.length;
  g.connect(ac.destination);
  o.start(0);
  setTimeout(function(s) {s.stop(0)}, 1000, o);
}

我在 Chrome 23.0.1271.101 上试过了

已更新为使用新的 startstop 方法:createOscillator noteOn not working

关于javascript - 使用 Web Audio API 使用 OscillatorNodes 演奏和弦,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14308029/

相关文章:

node.js - 构建 Node.js API(使用标准 MongoDB URI 的 mongodb 连接出现意外 token 错误)

linux - 如何实现 HTTP API 守护进程

javascript - 遵循 API 时出现 Web Audio OfflineAudioContext 语法错误

javascript - 使用麦克风时静音输出 - Audio Web API

javascript - 从JSON设置Jquery slider 值

javascript - 在特定的 div 媒体查询中更改父元素的类样式

javascript - jquery - 定义加载效果仅出现一次

json - REST:更新多条记录

web-audio-api - 有没有办法在网络 worker 中使用 AudioContext

javascript - 使用 toDataURL() 从 Canvas 导出时如何压缩 .png 图像?