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)」を作成すると、最初の関数がサウンドを再生した後でもサウンドが再生されます。しかし、2回目に呼び出しても音は出ません。

4

1 に答える 1

1

あなたの問題は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);
}
于 2015-06-24T18:08:22.400 に答える