1

我知道你不能多次播放振荡器,所以我写了一个函数,每次都会创建一个新的:

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)”时,即使第一个函数播放了声音,它也会播放声音。但是当我第二次调用它时它也不会播放声音。

4

1 回答 1

1

你的问题是start你传递给你的函数的时间。开始时间是从创建时开始计算的audioContext currentTimeaudioContext并从那时起继续前进。因此,例如,当您从 0 开始您的第一个声音,然后在 3 结束它时,您audioContext将在此之后继续运行。所以如果你用相同的时间参数调用你的新声音,它就不会播放,因为你的start时间是 before 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);
}
于 2015-06-24T18:08:22.400 回答