RSS Twitter Facebook
g200kg > VSTiの作り方 > 2.準備

VSTiの作り方

2004/08/22

2.準備



2.1 準備

まず必要なものはWindows上でプログラムを作る環境
普通はVisualC++だ! Borlandとかで書いている人もいるにはいるようだが、
やはり余計な手間はかかる模様。 面倒だと思うならVC++でいってくれ。

-------------2007.08.19
今マイクロソフトからは Visual Studio 2005 Express Editionという開発環境が無料配布されているのだ。当初期間限定配布みたいな話だったのだが、どうやら無期限になったらしいぞ。残念ながらリソース編集関係の機能が削減されているのだが、コンパイラ自身は最適化もちゃんとやる手抜きのない奴なので、昔で言えばProfessional Edition相当DA!! 凄いぜ。これを使えば取り合えずVSTSDKのサンプルなんかがそのままコンパイルできるぞ
http://www.microsoft.com/japan/msdn/vstudio/express/
-------------

それから、VST Audio-Plugins SDKを >http://www.steinberg.net/en/company/developer.html
から手に入れるのだ! (※このURLは結構変わる事がある。これは2012年1月現在。)

このとき、契約書を読んでメールアドレスを入れる必要があるからちゃんと読むように。ポイントは・・・


  • タダで使っていいが、動作の保証はしない!
  • SDKを売ったり再配布はしないでくれ
  • これで下品なものを作ることは許さん!

3番目のが問題だ。多分・・・。KusoSynthは大丈夫なのだろうかと一瞬不安がよぎる。
--------------2007.08.19
いわゆるVSTを作るにの必要なのは "VST Audio Plug-Ins SDK" という奴だ。"VST Module Architecture SDK"の方はMIDIプラグインのようだが、俺はいじった事がないからしらん!!
--------------


2.2 VSTで練習

準備ができたらまずVSTiではなくてVSTエフェクトで練習DA!
VSTiよりも入力も出力も音になっているVSTの方が簡単なのだ。
VCならSDKのwinフォルダのサンプルプロジェクトがそのまま開けるぞ

サンプルの中でチェックするのはAGainだ!!
音量を変えるだけの単純なサンプルだからわかりやすい。
重要なのはAGain::processとAGain::processReplacingだ!
入力も出力もfloatの配列になっていてこの間で処理をするだけで何でもできるぞ。
processReplacingは必須ではなくてコンストラクタでcanProcessReplacing を
やらなければ書かなくてもよいが、普通は書いておいた方がよさそうだ。
内容はprocessもprocessRepracingも同じで結果を足しこむかそのまま書くかの違いだけだ

もうひとつ重要なのはコンストラクタにあるsetUniqueIDだ!!
とりあえず実験ならなんでも良いがこれがプラグインの識別に使われているので、
公開するときはSteinbergのデータベースに登録しないといけないぞ

---------------2007.08.19
VST 2.4 になってprocess()というメソッドはなくなってしまったのDA!!! かわりに今までオプションだったprocessReplacing()が必須になり、更に倍精度浮動小数点を扱う processDoubleReplacing()というのが追加された。 これは重大な変更DA!!!

てかさ、昔のホストでprocess()使ってた奴とかないの? ま、ないのかも知れん。面倒なだけだし。
---------------
さて、ここまではVSTエフェクトの話だ。ここで詰まっているようだとVSTiまでたどり着けんぞ。もっと具体的な手順が知りたい人はVSTエフェクト実践編を見てくれ!!


2.3 VSTiに挑戦する

VSTエフェクトの構造を大体理解したら、次はいよいよVSTiを作るのDA!

チェックするサンプルはvstxsynth。
vstxsynthproc.cの中にVSTエフェクトの時と同じように
process()とprocessReplacing()がある。

ただし音の入力の代わりにMIDIイベントを見ながら自力で波形を作り出す必要がある。
サンプルではテーブルの波形を読む速度を変えて音程を作っているぞ。エイリアスの問題
とかはあるが最初はこれでOKだ。MIDIイベントの方はprocessEvents()で処理している。
しかし!!

このサンプルコードは単純化のため、とっても手抜きをしているのDA!!
一つのブロックをprocess/processReplacingで処理する時に一つ分のMIDIイベントしか
チェックしていないぞ。 本当は一つのブロック内に複数のMIDIイベントが来る事がある、
というか来る!

ので、本当はもっと面倒な処理が必要だ
ここの処理はSynth1の作者であるDaichi氏がとても良いサンプルを公開してくれているぞ!!
てゆうか、そこ読んだらこのページいらんやん・・・

-------------2007.08.19
ここでもprocess()がばっさりなくなっている。 コンストラクタでcanProcessDoubleReplacing()を呼んでいないから、processDoubleReplacing()は実装されていない。 いやぁ、すっきりするなぁ。 なんかprocess()は盲腸な感じだったんだよな!!
-------------




g200kg