トップ «前の日記(2007-10-20) 最新 次の日記(2007-10-28)» 編集

あしたに日記[RSS]

Wiki/Bookmark/Top


2007-10-23 [長年日記]

Ruby/VST

ということで、rubyインタプリタを組み込んだVSTを試作してみた。

とりあえずMIDIイベントだけに対応した。以下のようなスクリプトを書いたファイルを用意しておくと、ノートに応じてオクターブとチャネルを変更するフィルタになる。後ろにマルチティンバーなシンセを置けばスプリット自由自在なソフトシンセの出来上がりというわけ。いいねえ。

case $mididatas[1]
    when note("C0")..note("C4")
        set_channel(1)
        transpose(24)
    when note("C6")..note("C8")
        set_channel(3)
        transpose(-24)
    else
        set_channel(2)
end

MIDIイベントごとにrubyインタプリタを起動(!)して、毎回スクリプトを読み込んでMIDIイベントに改変を加えて再送信、というあまりにも富豪な方式なおかげで、スクリプトを編集して保存したらすぐ反映されるのがすばらしすぎる。もちろん負荷は大きいが、手元の環境では破綻するほどではない。さすがはCore2Duo、なんともないぜ。

  • 原因不明だが、イベントごとにruby_init()を叩かないと連弾で落ちる
  • C++からRubyへの受け渡しはグローバル変数経由なので美しくない
  • スクリプトを選べるようにしたい
  • スクリプトの例外を全無視するのはさすがに厳しいな...コンソールつけるか? などなど、いろいろやりたいことは出てきた。あと、これぐらいの負荷なら、もしかしてオーディオ処理もなんとかなるんじゃないか。それは素敵すぎないか。

ある程度まとまったら公開しよう。しかしrubyのdllもつけて配布ってのはちょっとアレだなあ。

(追記)あまりに統一感がないので、以下のように変更。
m=MidiEvent.new
case m.note
when note("C0")..note("C4")
m.channel=3
m.note+=24
when note("C6")..note("C8")
m.channel=1
m.note-=24
else
m.channel=2
end