Created
March 3, 2016 11:25
-
-
Save uupaa/e92fbd3643391806918f to your computer and use it in GitHub Desktop.
WebAudio.js test
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<button onclick="play()">play</button> | |
<script> | |
var bufsize = 4096 / 2; | |
var audioctx = new webkitAudioContext(); | |
var scrproc = audioctx.createScriptProcessor(bufsize, 2); | |
scrproc.onaudioprocess = processHandler; | |
scrproc.connect(audioctx.destination); | |
var osc = null; | |
var currentTimeArray = []; | |
var timeStampArray = []; | |
var lastCurrentTime = 0; | |
var lastPlayBackTime = 0; | |
// 44.1kHz = 44100 = 1็งใซ44100ใใฌใผใ ใฎใตใณใใชใณใฐใฌใผใ | |
// = 1ใใฌใผใ ่พบใ 0.00002267573696 ็ง | |
// * 4096ใใฌใผใ = 0.09287981858816็ง | |
// 4096 = 0.09287981859410431 | |
// 44.1kHz ใง 2048ใใฌใผใ ๆฏใซใณใผใซใใใฏใใใจ | |
// ๅผใณๅบใ้้ใฏใ 0.04643990929705216 | |
function processHandler(event) { | |
var currentTime = audioctx.currentTime; | |
var playbackTime = event.playbackTime; | |
currentTimeArray.push(currentTime - lastCurrentTime); | |
timeStampArray.push(playbackTime - lastPlayBackTime); | |
lastCurrentTime = currentTime; | |
lastPlayBackTime = playbackTime; | |
var buf0 = event.outputBuffer.getChannelData(0); | |
for(var i = 0; i < bufsize; ++i) { | |
buf0[i] = (Math.random() * 2) - 1; | |
} | |
if (currentTimeArray.length > 100) { | |
scrproc.disconnect(); | |
console.dir(currentTimeArray); | |
console.dir(timeStampArray); | |
} | |
} | |
function play() { | |
osc = audioctx.createOscillator(); | |
osc.connect(scrproc); | |
osc.start(0); | |
} | |
play(); | |
</script> | |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<button onclick="play()">play</button><br /> | |
<button onclick="stop()">stop</button><br /> | |
<input id="a" type="text" value="" /><br /> | |
<input id="b" type="text" value="" /><br /> | |
<input id="c" type="text" value="" /><br /> | |
ใใทใใ<br> | |
ใใทใใ<br> | |
ใใทใใ<br> | |
ใใทใใ<br> | |
ใใทใใ<br> | |
ใใทใใ<br> | |
ใใทใใ<br> | |
ใใทใใ<br> | |
ใใทใใ<br> | |
ใใทใใ<br> | |
ใใทใใ<br> | |
ใใทใใ<br> | |
ใใทใใ<br> | |
ใใทใใ<br> | |
ใใทใใ<br> | |
ใใทใใ<br> | |
ใใทใใ<br> | |
ใใทใใ<br> | |
ใใทใใ<br> | |
ใใทใใ<br> | |
ใใทใใ<br> | |
ใใทใใ<br> | |
<script> | |
var bufferSize = 4096 / 2; | |
var audioContext = new webkitAudioContext(); | |
var scriptProcessor = audioContext.createScriptProcessor(bufferSize, 1, 1); | |
scriptProcessor.onaudioprocess = processHandler; | |
scriptProcessor.connect(audioContext.destination); | |
var oscillator = null; | |
var currentTimeArray = []; | |
var timeStampArray = []; | |
var lastCurrentTime = 0; | |
var lastPlayBackTime = 0; | |
var now = performance.now(); | |
/* | |
var diffTime1 = (now / 1000) - audioContext.currentTime; | |
*/ | |
var nodeA = document.querySelector("#a"); | |
var nodeB = document.querySelector("#b"); | |
var nodeC = document.querySelector("#c"); | |
/* | |
## WebAudio ใฎ AudioContext.currentTime ใ็จใใใคใใณใใญใฅใผ่จญ่จใฎใใคใณใ | |
WebAudio ใฎ ScriptProcessorNode ใไธๆใไฝฟใใจใ | |
็ฒพๅบฆใ้ซใๅฎๅฎใใใณใผใซใใใฏใๅฎๆ็ใซ็บ็ใใใไบใใงใใพใใ | |
ใใฎ็นๆงใๅฉ็จใใใจใๅฎๅฎใใใชใใใทใณใฏ(้ณๅฃฐใจๅ็ปใฎๅๆๅฆ็)ใๅฎ็พใใไบใๅฏ่ฝใซใชใใพใใ | |
### ๅฎๅฎใใใชใใใทใณใฏใๅฎ็พใใใใใซ | |
ใชใใใทใณใฏใๅฎๅฎใใใใซใฏใไปฅไธใฎๆกไปถใๅฏ่ฝใช้ใๆบใใๅฟ ่ฆใใใใพใใ | |
- ใงใใใ ใ็ฒพๅบฆใฎ้ซใใฏใญใใฏใๅฟ ่ฆใงใ | |
- setTimeout, setInterval ใฎๆๅฐๅ่งฃ่ฝใฏ 4ms ใงใ(ไปๆงไธใฎๅคใงใๅฎ่ฃ ๆฌก็ฌฌใงใ) | |
- requestAnimationFrame ใฎๆๅฐๅ่งฃ่ฝใฏ 16.666ms ใงใ(iPhone 5, iOS 9 ใงใฏ็ด33ms ใซใชใใพใ) | |
- ใกใคใณในใฌใใใฎๆทท้็ถๆณใฎๅฝฑ้ฟใๅใใใซๅไฝใใไป็ตใฟใๅฟ ่ฆใงใ | |
- setTimeout ใฏใกใคใณในใฌใใใฎๅฝฑ้ฟใๅผทใๅใใพใ | |
- requestAnimationFrame ใฏใชใใฌใใทใฅใฌใผใใฎๅฝฑ้ฟใๅผทใๅใใพใ | |
- AudioContext#currentTime ใฏๅฅในใฌใใใงๅไฝใใใใใกใคใณในใฌใใใฎๅฝฑ้ฟใๅใใพใใ | |
ๅบๆฌ็ใชๆง้ ใฏใไปฅไธใฎใใใซใชใใพใใ | |
```js | |
var bufferSize = 2048; | |
var audioContext = new AudioContext(); | |
var oscillatorNode = null; | |
var scriptProcessorNode = audioContext.createScriptProcessor(bufferSize, 1, 1); | |
scriptProcessorNode.onaudioprocess = processHandler; | |
scriptProcessorNode.connect(audioContext.destination); | |
function processHandler(event) { | |
var currentTime = audioContext.currentTime; | |
var inputBuffer0 = event.inputBuffer.getChannelData(0); // Float32Array | |
var outputBuffer0 = event.outputBuffer.getChannelData(0); // Float32Array | |
outputBuffer0.set(inputBuffer0, 0); // inputBuffer ใ outputBuffe ใซใณใใผใใ | |
// currentTime ใซๅฟใใในใฑใธใฅใผใชใณใฐๅฆ็ใใใใซ่จ่ฟฐใใ | |
} | |
function play() { | |
if (oscillatorNode) { return; } | |
oscillatorNode = audioContext.createOscillator(); | |
oscillatorNode.type = "sine"; | |
oscillatorNode.frequency.value = 440; // 440Hz | |
oscillatorNode.connect(scriptProcessorNode); | |
oscillatorNode.start(); | |
} | |
``` | |
ใใฎ็นๆงใไฝฟใใจใ | |
AudioContext.currentTime | |
่จญ่จใฎๆๆปใใ้ฟใใใใใซใไบๅใซๆ็ขบใซใในใใใคใณใใ | |
- performance.now() ใจ AudioContext.currentTime ใฎใฏใญใใฏ็นๆงใ่ชฟๆปใใ | |
- ๅไฝใฏ? | |
- ็ฒพๅบฆใฏ? | |
- ๆฌก็ฌฌใซใบใฌใ็บ็ใใ? | |
- tab hidden ็ถๆ ใงใฏใฉใใชใ? | |
- ๆดๆฐ้ ปๅบฆใ่ฝใกใฆใบใฌใไบใฏใชใใ? | |
- WebAudio ใฎ็นๆงใ่ชฟๆปใใ | |
- tab hidden ใงใฉใใชใ? | |
- ้ณใฏๅๆญขใใใใใจใๅ็ใ็ถใใ? | |
่ชฟๆป็ตๆใงใใ | |
- ใฏใญใใฏ็นๆง | |
- performance.now() | |
- ๅไฝใฏ ms (ms.microsec) | |
- tab hidden ็ถๆ | |
- ๅขๅ ใใ | |
- OSใทใฃใใใใฆใณ | |
- ๅๆญขใใใชใธใฅใผใ ใงๅ้ใใ | |
- AudioContext.currentTime | |
- ๅไฝใฏ sec (sec.ms) | |
- tab hidden ็ถๆ | |
- Chrome, Safari | |
- ๅขๅ ใใ | |
- iOS | |
- ๅๆญขใใ | |
- OSใทใฃใใใใฆใณ | |
- ๅๆญขใใใชใธใฅใผใ ใงๅ้ใใ | |
- ใตใฆใณใ็นๆง | |
- tab hidden ็ถๆ | |
- Chrome, Safari | |
- ๅ็ใ็ถใใ | |
- iOS | |
- ๅๆญขใใ | |
*/ | |
/* | |
console.dir({ | |
diffTime1: diffTime1, | |
"performance.now": now, | |
"audioContext.currentTime": audioContext.currentTime, | |
}); | |
*/ | |
// performance.now ใฎๅ่งฃ่ฝใฏ ms ๅไฝ | |
// performance.now() -> 1000 -> 1็ง | |
// ไธๆน AudioContext.currentTime ใฎๅ่งฃ่ฝใฏใ็งๅไฝ | |
// 44.1kHz = 44100 = 1็งใซ44100ใใฌใผใ ใฎใตใณใใชใณใฐใฌใผใ | |
// = 1ใใฌใผใ ่พบใ 0.00002267573696 ็ง | |
// * 4096ใใฌใผใ = 0.09287981858816็ง | |
// 4096 = 0.09287981859410431 | |
// 44.1kHz ใง 2048ใใฌใผใ ๆฏใซใณใผใซใใใฏใใใจ | |
// ๅผใณๅบใ้้ใฏใ 0.04643990929705216 | |
// ่จ็ฎไธใฏ 44100 ใฎ 2048 ใใฌใผใ ใง 0.04643990929408 | |
// iPhone 6s ใฎๅฎๆธฌๅคใ ใจ 44100 ใฎ 2048 ใใฌใผใ ใง 0.04643990929705211 (46ms) | |
// iPhone 5 ใฎๅฎๆธฌๅคใ ใจ 44100 ใฎ 2048 ใใฌใผใ ใง 0.04643990929705211 (46ms) | |
// iPhone 5 ใฎๅฎๆธฌๅคใ ใจ 44100 ใฎ 256 ใใฌใผใ ใง 0.005804988662131527 (5ms) | |
// MBP Chrome 48 ใฎๅฎๆธฌๅคใ ใจ 44100 ใฎ 2048 ใใฌใผใ ใง 0.04643990929705211 (46ms) | |
// 16384 ใใฌใผใ ใ ใจ ๅฎๆธฌๅคใง 0.3715192743764173 (371ms) ใซใชใ | |
function processHandler(event) { | |
var now = performance.now(); | |
var currentTime = audioContext.currentTime; | |
var playbackTime = event.playbackTime; | |
nodeA.value = (now / 1000).toFixed(2); | |
nodeB.value = (currentTime).toFixed(2); | |
nodeC.value = (playbackTime).toFixed(2); | |
/* | |
currentTimeArray.push(currentTime - lastCurrentTime); | |
timeStampArray.push(playbackTime - lastPlayBackTime); | |
lastCurrentTime = currentTime; | |
lastPlayBackTime = playbackTime; | |
*/ | |
/* | |
if (currentTimeArray.length > 100) { | |
scriptProcessor.disconnect(); | |
console.dir(currentTimeArray); | |
console.dir(timeStampArray); | |
var now = performance.now(); | |
var diffTime2 = (now / 1000) - currentTime; | |
console.dir({ | |
diffTime1: diffTime1, | |
diffTime2: diffTime2, | |
"performance.now": now, | |
"audioContext.currentTime": currentTime, | |
"event.playbackTime": playbackTime, | |
}); | |
} | |
*/ | |
var input0 = event.inputBuffer.getChannelData(0); // Float32Array | |
var output0 = event.outputBuffer.getChannelData(0); // Float32Array | |
//for(var i = 0; i < bufferSize; ++i) { | |
// output0[i] = (Math.random() * 2) - 1; | |
//} | |
// for (var i = 0; i < bufferSize; ++i) { | |
// output0[i] = input0[i]; | |
// } | |
output0.set(input0, 0); | |
} | |
function play() { | |
if (!oscillator) { | |
oscillator = audioContext.createOscillator(); | |
oscillator.type = "sine"; | |
oscillator.frequency.value = 440; | |
oscillator.connect(scriptProcessor); | |
oscillator.start(); | |
} | |
} | |
function stop() { | |
if (oscillator) { | |
oscillator.stop(); | |
oscillator = null; | |
} | |
} | |
</script> | |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<!-- take 3 --> | |
<button onclick="play()">play</button><br /> | |
<button onclick="stop()">stop</button><br /> | |
<input id="a" type="text" value="" /><br /> | |
<input id="b" type="text" value="" /><br /> | |
<input id="c" type="text" value="" /><br /> | |
ใใทใใ<br> | |
ใใทใใ<br> | |
ใใทใใ<br> | |
ใใทใใ<br> | |
ใใทใใ<br> | |
ใใทใใ<br> | |
ใใทใใ<br> | |
ใใทใใ<br> | |
ใใทใใ<br> | |
ใใทใใ<br> | |
ใใทใใ<br> | |
ใใทใใ<br> | |
ใใทใใ<br> | |
ใใทใใ<br> | |
ใใทใใ<br> | |
ใใทใใ<br> | |
ใใทใใ<br> | |
ใใทใใ<br> | |
ใใทใใ<br> | |
ใใทใใ<br> | |
ใใทใใ<br> | |
ใใทใใ<br> | |
<script> | |
var bufferSize = 4096 / 2; | |
var audioContext = new webkitAudioContext(); | |
var scriptProcessor = audioContext.createScriptProcessor(bufferSize, 1, 1); | |
scriptProcessor.onaudioprocess = processHandler; | |
scriptProcessor.connect(audioContext.destination); | |
var oscillator = null; | |
var currentTimeArray = []; | |
var timeStampArray = []; | |
var lastCurrentTime = 0; | |
var lastPlayBackTime = 0; | |
var now = performance.now(); | |
/* | |
var diffTime1 = (now / 1000) - audioContext.currentTime; | |
*/ | |
var nodeA = document.querySelector("#a"); | |
var nodeB = document.querySelector("#b"); | |
var nodeC = document.querySelector("#c"); | |
function processHandler(event) { | |
var now = performance.now(); | |
var currentTime = audioContext.currentTime; | |
var playbackTime = event.playbackTime; | |
nodeA.value = (now / 1000).toFixed(2); | |
nodeB.value = (currentTime).toFixed(2); | |
nodeC.value = (playbackTime).toFixed(2); | |
/* | |
currentTimeArray.push(currentTime - lastCurrentTime); | |
timeStampArray.push(playbackTime - lastPlayBackTime); | |
lastCurrentTime = currentTime; | |
lastPlayBackTime = playbackTime; | |
*/ | |
/* | |
if (currentTimeArray.length > 100) { | |
scriptProcessor.disconnect(); | |
console.dir(currentTimeArray); | |
console.dir(timeStampArray); | |
var now = performance.now(); | |
var diffTime2 = (now / 1000) - currentTime; | |
console.dir({ | |
diffTime1: diffTime1, | |
diffTime2: diffTime2, | |
"performance.now": now, | |
"audioContext.currentTime": currentTime, | |
"event.playbackTime": playbackTime, | |
}); | |
} | |
*/ | |
var input0 = event.inputBuffer.getChannelData(0); // Float32Array | |
var output0 = event.outputBuffer.getChannelData(0); // Float32Array | |
//for(var i = 0; i < bufferSize; ++i) { | |
// output0[i] = (Math.random() * 2) - 1; | |
//} | |
// for (var i = 0; i < bufferSize; ++i) { | |
// output0[i] = input0[i]; | |
// } | |
output0.set(input0, 0); | |
} | |
function play() { | |
if (!oscillator) { | |
oscillator = audioContext.createOscillator(); | |
oscillator.type = "sine"; | |
oscillator.frequency.value = 440; | |
oscillator.connect(scriptProcessor); | |
oscillator.start(); | |
} | |
} | |
function stop() { | |
if (oscillator) { | |
oscillator.stop(); | |
oscillator = null; | |
} | |
} | |
</script> | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment