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で済むようにできるんじゃないか?---