pico.js

English

紹介

これは何?

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

使える環境

使い方

基本

  1. 関数 process(L, R) の定義されたオブジェクトを用意

    L と R の型は Float32Array です

  2. pico.play(gen); で処理開始

    gen.process(L, R) が呼ばれるので L と R に信号を書き込みます

  3. pico.pause(); で処理停止

    静寂に戻るまでが音楽です

ex.01

// ホワイトノイズを出力する
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);

その他の便利な機能

  1. サンプリングレートの変更

    pico.setup({samplerate:24000})

    サンプリングレートは 8000, 11025, 12000, 16000, 22050, 24000, 32000, 44100, 48000 のいずれかを指定してください

  2. Flash fallback

    'pico.swf' を 'pico.js' と同じフォルダに設置します.

  3. node.js サポート

    npmでインストールできます.

    $ npm install node-pico

    リポジトリ内 demo/node-demo.js を参照してください.

ex.02

// サイントーンを出力する
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));

リファレンス

メソッド

  1. pico.play(gen)

    再生を開始する

  2. pico.pause()

    再生を停止する

  3. pico.setup(opts)

    サンプリングレート, cellsize を設定する

  4. pico.bind(PlayerClass, opts)

    プレイヤー実装クラスを使用する

プロパティ

  • pico.isPlaying

    処理中かどうかを返す

  • pico.env

    実行環境を返す (webkit, moz, flash, nop=利用できない)

  • pico.samplerate

    サンプリングレートを返す

  • pico.channels

    チャンネル数を返す (2で固定)

  • pico.cellsize

    関数 process で処理するサンプル数を返す

ex.03

// 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());

その他

ソースコード

ライセンス

  • MIT
このエントリーをはてなブックマークに追加

ex.04

// MMLと簡単なFM音源のデモ
// TO MAKE THE END OF BATTLE/Ys2
//     Copyright© Nihon Falcom Corporation
// 
// 元データには以下のデータを使わせていただきました
// http://d.hatena.ne.jp/mosshm/20071013/p1

pico.play(demo());