AudioContext 振荡器不会播放超过一次
AudioContext Oscillator won't play more than once
我知道您不能多次使用振荡器,所以我编写了一个每次都创建一个新振荡器的函数:
function playFrequency(f, t0, t1){
console.log(f, t0, t1);
var oscillator = self.audioContext.createOscillator();
oscillator.type = "square";
oscillator.frequency.value = f;
oscillator.connect(self.audioContext.destination);
oscillator.start(t0);
oscillator.stop(t1);
}
但奇怪的是,该函数实际上只会播放一次声音。我不明白为什么会这样。我不是每次调用函数都创建了一个新的振荡器吗?
当我创建一个具有完全相同代码的函数 "playFrequency2(f, t0, t1)" 时,它会在第一个函数播放声音后播放声音。但是我第二次调用的时候也没有声音
您的问题是 start
传递给函数的时间。开始时间是从 audioContext
currentTime
开始计算的,从 audioContext
创建时开始,并从那时起继续前进。因此,例如,当您从 0 开始第一个声音然后以 3 结束时,您的 audioContext
之后将保持 运行。因此,如果您使用相同的时间参数调用新声音,它将不会播放,因为您的 start
时间早于 currentTime
。
你可以这样修改:
function playFrequency(f, t1){
console.log(f, t0, t1);
var oscillator = self.audioContext.createOscillator();
oscillator.type = "square";
oscillator.frequency.value = f;
oscillator.connect(self.audioContext.destination);
oscillator.start();
oscillator.stop(self.audioContext.currentTime+t1);
}
我知道您不能多次使用振荡器,所以我编写了一个每次都创建一个新振荡器的函数:
function playFrequency(f, t0, t1){
console.log(f, t0, t1);
var oscillator = self.audioContext.createOscillator();
oscillator.type = "square";
oscillator.frequency.value = f;
oscillator.connect(self.audioContext.destination);
oscillator.start(t0);
oscillator.stop(t1);
}
但奇怪的是,该函数实际上只会播放一次声音。我不明白为什么会这样。我不是每次调用函数都创建了一个新的振荡器吗?
当我创建一个具有完全相同代码的函数 "playFrequency2(f, t0, t1)" 时,它会在第一个函数播放声音后播放声音。但是我第二次调用的时候也没有声音
您的问题是 start
传递给函数的时间。开始时间是从 audioContext
currentTime
开始计算的,从 audioContext
创建时开始,并从那时起继续前进。因此,例如,当您从 0 开始第一个声音然后以 3 结束时,您的 audioContext
之后将保持 运行。因此,如果您使用相同的时间参数调用新声音,它将不会播放,因为您的 start
时间早于 currentTime
。
你可以这样修改:
function playFrequency(f, t1){
console.log(f, t0, t1);
var oscillator = self.audioContext.createOscillator();
oscillator.type = "square";
oscillator.frequency.value = f;
oscillator.connect(self.audioContext.destination);
oscillator.start();
oscillator.stop(self.audioContext.currentTime+t1);
}