キーボードシンセサイザー(仮)で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を演奏してみるデモ。ところどころ音程外してる+四分音符しかないので、まだまだです。
ちなみに、Soundboothで波形を見てみたら綺麗にSin波が出力されていました。なるほどなぁ