https://plus.google.com/events/c544bi31lo05o3e7gka9v8cl090
g200kg Tatsuya Shinyagaito
<audio>タグのようにmp3などの出来上がった音をページに組み込むのではなく、 プログラムで音を合成/加工する機能
- W3Cで標準化作業中 -
※ 未対応ブラウザでもそれなりに動作させるための Polyfill (WAAPISim) を作りました
<script type="text/javascript" src="waapisim.js"></script>
これを読み込むとIE等でもWebAudioAPIが使えるようになります
※できない事もありますけど
GitHubに置いてあります :
https://github.com/g200kg/WAAPISim
ノードの組み合わせで音を作る
var audioctx = new webkitAudioContext();
var osc = audioctx.createOscillator();
osc.connect(audioctx.destination);
function Play() {
osc.start(0);
}
var audioctx = new webkitAudioContext();
var osc = audioctx.createOscillator();
var gain = audioctx.createGain();
osc.connect(gain);
gain.connect(audioctx.destination);
osc.start(0);
function Setup() {
osc.type = document.getElementById("type").selectedIndex;
osc.frequency.value = parseFloat(document.getElementById("freq").value);
gain.gain.value = parseFloat(document.getElementById("level").value);
}
var audioctx = new webkitAudioContext();
var buffer = null;
LoadSample(audioctx, "./sample.mp3");
function Play() {
var src = audioctx.createBufferSource();
src.buffer = buffer;
src.connect(audioctx.destination);
src.start(0);
}
function LoadSample(ctx, url) {
var req = new XMLHttpRequest();
req.open("GET", url, true);
req.responseType = "arraybuffer";
req.onload = function() {
if(req.response)
// buffer = audioctx.createBuffer(req.response, false);
audioctx.decodeAudioData(req.response, function(b){buffer=b;}, function(){});
}
req.send();
}
ScriptProcessorで音を加工する(1)
var audioctx = new webkitAudioContext();
var bufsrc = audioctx.createBufferSource();
var scrproc = audioctx.createScriptProcessor(2048,1,1);
bufsrc.connect(scrproc);
scrproc.connect(audioctx.destination);
bufsrc.loop = 1; //<== loopフラグ
scrproc.onaudioprocess = Proc; //<== ScriptProcessorの処理関数
・
・
function Proc(ev) {
var bufin = ev.inputBuffer.getChannelData(0);
var bufout = ev.outputBuffer.getChannelData(0);
for(var i = 0; i < 2048; ++i)
bufout[i] = bufin[i] * eff;
}
ScriptProcessorで音を加工する(2)
var audioctx = new webkitAudioContext();
var bufsrc = audioctx.createBufferSource();
var scrproc = audioctx.createScriptProcessor(2048,1,1);
bufsrc.connect(scrproc);
scrproc.connect(audioctx.destination);
bufsrc.loop = 1; //<== loopフラグ
scrproc.onaudioprocess = Proc; //<== ScriptProcessorの処理関数
・
・
function Proc(ev) {
var bufin = ev.inputBuffer.getChannelData(0);
var bufout = ev.outputBuffer.getChannelData(0);
for(var i = 0; i < 2048; ++i) {
var j = ((i * eff) | 0) % 2048;
bufout[i] = bufin[j];
}
}
音楽系Webアプリに興味のある方はぜひ
https://groups.google.com/forum/#!forum/web-music-developers-jp