それ自体はみんなしってますよね。でもでも、
\(`・ω・´)ノ
ここから本題
<audio src="hoge.mp3" autoplay></audio>あるいは
(new Audio("hoge.mp3")).play()だけで音が出る。
var ktkrAudio = new Audio('/sound/ktkr.mp3'); $('#ktkr-button').on('click', function (e) { e.preventDefault(); // 再生後など、currentTimeが揃っていないなら頭出し if (ktkrAudio.currentTime) { ktkrAudio.currentTime = 0; } // 再生 ktkrAudio.play(); });キタコレ!!
.play
はonclick等の中に置くしかないこのあたりはおそらく、技術的に困難というより
Apple側のポリシーなので
今後も状況は変わらないのでは。
でも、SPでも音を扱いたいよ!
→ 2章に続く
// 音声ファイルの場所 var SOUND_URL = '/sound/ktkr.mp3'; // Web Audio APIが使えるか確認しつつ、contextをつくる var SupportedAudioContext; try { SupportedAudioContext = window.AudioContext || window.webkitAudioContext; } catch(e) { throw new Error('Web Audio API is not supported.'); } var context = new SupportedAudioContext(); // 音声ファイルのロード var buffer; (function () { var request = new XMLHttpRequest(); request.open('GET', SOUND_URL, true); request.responseType = 'arraybuffer'; // ArrayBufferとしてロード request.send(); request.onload = function () { // contextにArrayBufferを渡し、decodeさせる context.decodeAudioData(request.response, function (buf) { buffer = buf; }); }; })(); // click時に再生 $('#ktkr-button2').on('click', function (e) { e.preventDefault(); var source = context.createBufferSource(); source.buffer = buffer; source.connect(context.destination); source.start(0); });
.start
がユーザーイベント内なら、あとは自由→ 3章に続く
contextからnodeを作って、node同士を繋ぎあわせていく。
context.destination
まで繋がると、音が出力される。
node1.connect(node2); node2.connect(context.destination);
ギター → エフェクター → アンプ
とつながっている図をイメージすると分かりやすい
context.destination
context.createBufferSource()
context.createOscillator()
context.createMediaStreamSource()
// Web Audio APIが使えるか確認しつつ、contextをつくる var SupportedAudioContext; try { SupportedAudioContext = window.AudioContext || window.webkitAudioContext; } catch(e) { throw new Error('Web Audio API is not supported.'); } var context = new SupportedAudioContext(); // オシレーターをつくる var oscNode = context.createOscillator(); oscNode.frequency.value = 880; oscNode.type = 'triangle'; // 音量調節用のnodeを作成 var gainNode = context.createGain(); gainNode.gain.value = 0; // もろもろつなげる oscNode.connect(gainNode); gainNode.connect(context.destination); // ボタンで再生・停止 (ミュートのON/OFF切り替え) var playing = false; var muted = true; $('#webaudio-button').on('click', function (e) { e.preventDefault(); // 再生開始 (初回のみ) if (!playing) { playing = true; oscNode.start(0); } muted = !muted; if (muted) { gainNode.gain.value = 0; $(this).text('play'); } else { gainNode.gain.value = 1; $(this).text('stop'); } }); // ピッチをランダムで変える var random; $('#webaudio-random').on('click', function (e) { e.preventDefault(); if (random) { clearInterval(random); random = null; } else { random = setInterval(function () { var min = 440; var max = 2000; oscNode.frequency.value = Math.floor(min + (max - min) * Math.random()); }, 200); } });
context.createGain()
context.createAnalyser()
余談
getByteFrequencyData(data)
getByteTimeDomainData(data)
再生する音声があらかじめ決まっているなら、
動的解析する必要はない。これ当然。
マイク入力を動的に解析したいとかなったら、有用かも
マイク入力…!? → 5章へ続く
第三のHTML5 Audio
Stream API
navigator.getUserMedia()
でブラウザに権限をもらう// Web Audio APIが使えるか確認しつつ、contextをつくる var SupportedAudioContext; try { SupportedAudioContext = window.AudioContext || window.webkitAudioContext; } catch(e) { throw new Error('Web Audio API is not supported.'); } var context = new SupportedAudioContext(); // マイクの取得 function initMic() { navigator.getUserMedia = navigator.getUserMedia || navigator.webkitGetUserMedia || navigator.mozGetUserMedia; navigator.getUserMedia( { audio: true }, function(s) { connectMicToOutput(s); }, function(e) { console.log(e); } ); } // マイクの音を出力へ var micNode; function connectMicToOutput (mic) { micNode = context.createMediaStreamSource(mic); micNode.connect(context.destination); var $canvas = $('#visualizer'); var analyserNode = context.createAnalyser(); micNode.connect(analyserNode); // ビジュアライザーの詳細は省略 new Visualizer($canvas, analyserNode); } // マイク入力解除の処理 function disconnect () { micNode.disconnect(context.distination); micNode = null; } // クリックで切り替え $('#mic-button').on('click', function (e) { e.preventDefault(); if (micNode) { disconnect(); this.innerHTML = 'mic ON'; } else { initMic(); this.innerHTML = 'mic OFF'; } });
※結局再生するのはWeb Audio API