キーボードシンセサイザー(仮)でRydeenっぽいの

テスト期間ではあるのですが、TeamFortress2をやったり、ChucKをいぢったりしています。うん、勉強もするよ。
で、ChucKをいぢる練習を続けてきたのですが、ちょっとは出来るようになってきたので少し書こうと思います。ChucKにはHID(Human Interface Device)をサポートしているので、それを使ってキーボードをシンセサイザー風にしてみよう、と思いつき。
ソース↓

/*ここからHIDの宣言とか。キーボードが確認できなかったらShadeが終了する*/
Hid hi;
HidMsg msg;
if ( !hi.openKeyboard(0) ) me.exit();

/*Gainは音量などの設定。WvOutはwaveで出力するため*/
Gain g => WvOut w => dac;
"ry.wav" => w.wavFilename;
.2 => g.gain;

/*キーが押されたときの関数。bs[]には音階の周波数が格納されている。1-8をド-シ(C-B)に割り当てている。キー1が49だったので、49を引いています。*/
fun void keyOn(int n) {
    SinOsc s => g;
    [261, 293, 329, 349, 391, 440, 493, 523] @=> int bs[];
    n-49 => n;
    bs[n] => s.freq;
    1::minute / 120 => now;
}

/*メインループ キーが押されたらkeyOnをspork(関数をShadeで呼び出す)している。keyOnは押されたキーのASCIIコード*/
while(hi => now) {
    while(hi.recv(msg)) {
        if (msg.isButtonDown()) {
            spork ~ keyOn(msg.ascii);
        }
    }
}

とまぁ、こんな感じ。で、Rydeen/Yellow Magic Orchestraを演奏してみるデモ。ところどころ音程外してる+四分音符しかないので、まだまだです。
Download
ちなみに、Soundboothで波形を見てみたら綺麗にSin波が出力されていました。なるほどなぁ