JavaScriptでリアルタイム信号処理を行なうための簡易インターフェイスです.ブラウザとnode.jsで動作します.






process(L, R) の定義されたオブジェクトを用意L と R の型は Float32Array です
pico.play(gen); で処理開始gen.process(L, R) が呼ばれるので L と R に信号を書き込みます
pico.pause(); で処理停止静寂に戻るまでが音楽です
// ホワイトノイズを出力する
var noise = {
process: function(L, R) {
for (var i = 0; i < L.length; i++) {
L[i] = R[i] = Math.random() * 0.25;
}
}
};
pico.play(noise);
pico.setup({samplerate:24000})
サンプリングレートは 8000, 11025, 12000, 16000, 22050, 24000, 32000, 44100, 48000 のいずれかを指定してください
'pico.swf' を 'pico.js' と同じフォルダに設置します.
npmでインストールできます.
$ npm install node-pico
リポジトリ内 demo/node-demo.js を参照してください.
// サイントーンを出力する
function sinetone(freq) {
var phase = 0,
phaseStep = freq / pico.samplerate;
return {
process: function(L, R) {
for (var i = 0; i < L.length; i++) {
L[i] = R[i] = Math.sin(6.28318 * phase) * 0.25;
phase += phaseStep;
}
}
};
}
pico.play(sinetone(880));
pico.play(gen)再生を開始する
pico.pause()再生を停止する
pico.setup(opts)サンプリングレート, cellsize を設定する
pico.bind(PlayerClass, opts)プレイヤー実装クラスを使用する
pico.isPlaying処理中かどうかを返す
pico.env実行環境を返す (webkit, moz, flash, nop=利用できない)
pico.samplerateサンプリングレートを返す
pico.channelsチャンネル数を返す (2で固定)
pico.cellsize関数 process で処理するサンプル数を返す
// 1行の数式から音楽を作るやつ
window.f1 = function(t) {
return Math.sin(t*(0.001+Math.sin(t>>10)))*64;
};
window.f2 = function(t) {
return (t>>9)&((t<<5)|(Math.sin(t*1.4142)*3000))+(t>>3);
};
function oneliner() {
var t = 0, dt = 8000 / pico.samplerate;
var dlyL = new pico.DelayNode({time:225, feedback:0.8});
var dlyR = new pico.DelayNode({time:225, feedback:0.8});
return {
process: function(L, R) {
for (var i = 0; i < L.length; i++) {
L[i] = (window.f1(t|0) % 256) / 512;
R[i] = (window.f2(t|0) % 256) / 512;
t += dt;
}
dlyL.process(L, true);
dlyR.process(R, true);
}
};
}
pico.play(oneliner());
// MMLと簡単なFM音源のデモ // TO MAKE THE END OF BATTLE/Ys2 // Copyright© Nihon Falcom Corporation // // 元データには以下のデータを使わせていただきました // http://d.hatena.ne.jp/mosshm/20071013/p1 pico.play(demo());