使用Web Audio API与OscillatorNodes弹奏和弦

Lab*_*kak 5 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);
}
Run Code Online (Sandbox Code Playgroud)

但这种方法听起来像一团糟(这听起来像是这样).如果我尝试为和弦中的每个音符创建新的AudioContexts,那么听起来不错(就像这样):

// 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);
}
Run Code Online (Sandbox Code Playgroud)

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

kuu*_*kuu 5

不确定这可能是一个解决方案,但我发现插入一个GainNode并设置一个低值消除了这个问题:

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 = 0.25;
  g.connect(ac.destination);
  o.noteOn(0);
  setTimeout(function(s) {s.noteOff(0)}, 1000, o);
}
Run Code Online (Sandbox Code Playgroud)

我在Chrome 23.0.1271.101上试过这个