RubyVST
このページのソースです。
!これはなにか 肝であるフィルタ処理の部分だけをスクリプト言語Rubyで記述できるVST。あるいはCUI LoverのためのVST。あるいはVSTプロトタイプ環境。 まだぜんぜん開発中です。作者が一通り満足したらリリースします。 !MIDIフィルタ仕様 グローバル変数$mにMIDIメッセージが入っている。スクリプト一周終了時の$mがそのまま後段のVSTに送られるので、適宜これを編集すればMIDIフィルタになる。 $mはMIDIメッセージのArrayになっており、オーディオの処理周期に合わせているのでとても周期が早く、手弾きならたいがいは1イベントしか入ってないはず。 MIDIメッセージは最大4つの整数からなるArrayで表現されている。*詳細MIDI規格>http://www.pluto.dti.ne.jp/~daiki/Midi/Midi.html*がすばらしくまとまっているので参考にされたし。たとえば0x90,0x80がノートオン/オフであることを知っていれば十分だろう。 ノートオンメッセージは[0x90, note_number,vel]のようになっている。よく使うであろうノートオンオフについてはマクロを用意していて、m.note, m.vel などが使える。これらはm[1],m[2]と同じだが、0x80か0x90の時にしか作用しないようにしてある。 たとえば入ってくるメッセージのノートを一斉に+3変更したければ以下のように書くだけでよい。 {{{ $m.each do |m| m.note+=3 end }}} Arrayのまま処理するならば、これは以下と同じである。 {{{ $m.each do |m| if (m==0x80 || m==0x90) m[1]+=3 end end }}} すべてのノートに+3でハモリを入れるには以下のようにすればよい。(もちろん、すべて+3ではハモりとはいえない)。 {{{ $a=[] $m.each do |m| a=m.dup a.note+=3 $a.push a end $a.each do |a| $m.push a end }}} 追加すべきノートからなるArrayである$aを作っておいて、最後に追加している。 うーん、これはせめて$m.push $aと書けるようにしたいなあ。 まてよ、一番目の例も、$m.note+=3で済むようにできるんじゃないか? そうすれば最後のやつも、 {{{ $a=$m.dup $a.note+=3 $m.push $a }}} か。うーん、これいいね。