2015-06-24 27 views
0

我知道你不能發揮振盪器不止一次,所以我寫了創建一個新的每一次函數:AudioContext振盪器不會玩不止一次

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)」,它具有完全相同的代碼,它將發揮甚至之後的第一個功能發揮的聲音的聲音。但是當我第二次打電話時它不會發出聲音。

回答

1

你的問題是與start時候你傳遞給你的函數。開始時間從audioContextcurrentTime開始計算,該值從創建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); 
} 
+0

謝謝,我不知道那:) – 3jfx