RubyVST

これはなにか

肝であるフィルタ処理の部分だけをスクリプト言語Rubyで記述できるVST。あるいはCUI LoverのためのVST。あるいはVSTプロトタイプ環境。

まだぜんぜん開発中です。作者が一通り満足したらリリースします。

MIDIフィルタ仕様

グローバル変数$mにMIDIメッセージが入っている。スクリプト一周終了時の$mがそのまま後段のVSTに送られるので、適宜これを編集すればMIDIフィルタになる。

$mはMIDIメッセージのArrayになっており、オーディオの処理周期に合わせているのでとても周期が早く、手弾きならたいがいは1イベントしか入ってないはず。

MIDIメッセージは最大4つの整数からなるArrayで表現されている。詳細MIDI規格がすばらしくまとまっているので参考にされたし。たとえば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

か。うーん、これいいね。

やりたいこと

  • Rubyクラスの見直し
  • irbウィンドウをつける
  • 外部ライブラリ呼び出し
  • ログクリアボタン
  • でかいputsしたら遅い(あたりまえだが、バッファしてタイマでリフレッシュとか打つ手はありそう)
  • つまみと対応してうごくなにか
  • Rubyロゴとか(じゃまだからHelp画面でいいか)
  • オーディオ対応