7

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);
}

しかし、このアプローチは混乱のように聞こえます(これがそのように聞こえます)。コード内のノートごとに新しいAudioContextを作成しようとすると、問題なく聞こえます(次のようになります)。

// 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);
}

しかし、私はあなたが1つのAudioContextしか持っていないことになっていることを読みました。私は何が間違っているのですか?

4

2 に答える 2

7

これが解決策になるかどうかはわかりませんが、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);
}

Chrome23.0.1271.101でこれを試しました

新しいメソッドstartstopメソッドを使用するように更新:createOscillatornoteOnが機能しない

于 2013-01-17T10:53:41.763 に答える
4

noteOn(0)オシレーター/ノートをすぐに起動します。

forループはオシレーターの作成に時間がかかるため、最初のノート以降のすべてのノートの開始時間はわずかに遅れます。noteOn()各オシレーターを初期化し、それらを配列に入れてから、それらすべてを別のforループで呼び出します。

また、信頼性の低いsetTimeoutを呼び出す必要はありません。1noteOff秒後に。を呼び出すことで実行されnoteOff(1)ます。

var ac = new (window.AudioContext || window.webkitAudioContext);
// C4, E4, G4
var freqs = [261.63, 329.63, 392.00];
var oscs = [];
// initialize the oscillators
for(var i=0;i<freqs.length;i++) {
    var o = ac.createOscillator();
    o.frequency.value = freqs[i];
    o.connect(ac.destination);
    oscs.push(o);
}
// schedule noteOn and noteOff (deprecated: the methods will be renamed to start() and   stop() soon)
for (i = 0; i < oscs.length; i +=1) {
    oscs[i].noteOn(0);
    oscs[i].noteOff(1);
}
于 2013-01-14T14:04:54.443 に答える