2017-01-20 2 views
0

私は、音のサンプルが間隔を置いてランダムに選択されて、歌が進化するようにしようとしています。 HTML Audioはタイミングが不正確なのでこれでは不十分だったので、私はWeb Audioを試していますが、かなり複雑に思えます。今のところ、私はちょうど私がこのWeb Audio:正確なタイミングでイベントを発生させますか?

playSound.start(audioContext.currentTime + numb); 

のようなものに出くわした。しかし、今のように私はそれを動作させることができないなど、正確に16秒の時点で新たなオーディオファイルの再生を作る方法を知りたい、または32秒。

var audioContext = new audioContextCheck(); 

function audioFileLoader(fileDirectory) { 
    var soundObj = {}; 
    soundObj.fileDirectory = fileDirectory; 

    var getSound = new XMLHttpRequest(); 
    getSound.open("GET", soundObj.fileDirectory, true); 
    getSound.responseType = "arraybuffer"; 
    getSound.onload = function() { 
    audioContext.decodeAudioData(getSound.response, function(buffer) { 
     soundObj.soundToPlay = buffer; 
    }); 
    } 

    getSound.send(); 

    soundObj.play = function(volumeVal, pitchVal) { 
    var volume = audioContext.createGain(); 
    volume.gain.value = volumeVal; 
    var playSound = audioContext.createBufferSource(); 
    playSound.playbackRate.value = pitchVal; 
    playSound.buffer = soundObj.soundToPlay; 
    playSound.connect(volume); 
    volume.connect(audioContext.destination) 
    playSound.start(audioContext.currentTime) 
    } 

    return soundObj; 
}; 

var harp1 = audioFileLoader("IRELAND/harp1.ogg"); 
var harp2 = audioFileLoader("IRELAND/harp2.ogg"); 

function keyPressed() { 
    harp1.play(.5, 2); 
    harp2.start(audioContext.currentTime + 7.5); 
} 

window.addEventListener("keydown", keyPressed, false); 

私は、harp1.oggが終了すると直ちにharp2.oggを再生しようとしていることがわかります。最終的には、次のファイルをランダムに選択できるようにしたいと思いますが、今のところ、どうすればそれを実現するかを知る必要があります。 harp1.oggが開始してから7.5秒後にharp2.oggを正確に再生させるにはどうすればいいですか?(もっと良いですが、harp2が終了したときにトリガーする方法はありますか?

+0

提案通り、https://developer.mozilla.org/en-US/docs/Web/API/AudioBufferSourceNode/onendedです。 –

+1

あなたの 'soundObj'オブジェクトには' start'メソッドがありません。 'playSound'を' soundObj'のプロパティにすることをお勧めします。この方法で、外部から 'start'メソッドにアクセスできます。 – Kaiido

+0

偉大な、私はすでに、私はあまりにも野心的にしようとする前に、より多くのファンダメンタルズを勉強する必要があることを知っています--- "playSoundをsoundObjの財産にする"のはどうですか?ありがとう! – Tom

答えて

1

WebAudioは、最も近いサンプル時間まで、start(time)を使用して音声を非常に正確に開始できるはずです。そうでない場合は、decodeAudioDataのオーディオデータに期待したデータが含まれていないか、ブラウザのバグです。

0

keyPressedに電話をかけたときのように、両方の曲が再生を開始するようにしたいとします。 1つは直ちに、もう1つは7.5秒で終了します。曲を再生するには

  1. 機能がsoundObj.playあり、それは曲を再生するaudioContext時間で追加の引数を取る必要があります。ような何か:soundObj.play = function(volumeVal, pitchVal, startTime) {...}

  2. function keyPressed()ブロックは次のようなものになります。

    harp1.play(.5, 2, 0); harp2.start(1, 1, audioContext.currentTime + 7.5); audioContext.resume();

audioContext.resumeは()実際のオーディオを開始します(というかそれがないので、オーディオグラフのタイミングを開始します

関連する問題