VSTiシンセ開発の為のサンプルソースコード(VSTSDK2.4 GUIなし編)

ホームへ戻る

初めてVSTiシンセを作ろうとすると、VST SDKをダウンロードしてきて、中にあるサンプルソースと ドキュメントを眺める事になります。 しかし、あれを眺めるだけでシンセを作るのは初心者の方には難しいと思います。 そこで、シンセ作りをもっと簡単に行えるようにするために、雛形となるようなクラス構造を 設計してサンプルコードを作りました。考え方としては、信号処理に関するメイン部分と、 それ以外のVST仕様やMIDIハンドリング等の部分を分離して、プログラミングし易い構造を目指しました。
しかし、今回のバージョンはまだ独自のGUIがありません。 これではまともなシンセとは言えません。GUIについては、別途説明したいと考えています。

目次

必要なもの('10.9.16)
サンプルシンセ(MySynth)のスペック('10.9.16)
ビルド方法('10.9.16)
実行方法('10.9.16)
ファイルの説明('10.9.16)
クラス構造や、コードの説明など('10.9.16)

必要なもの


サンプルシンセ(MySynth)のスペック

ただの雛形なので、スペック的に見るべきものはありません。


ビルド方法

VC2008プロジェクトなので、VCでビルドしてください。成功すれば、MySynth.dllがReleaseフォルダにできると思います。 VC2010でのビルドは未確認ですが、自動コンバートしてくれていけるんじゃないでしょうか。


実行方法

VSTプラグインなので、VSTホストが必要です。簡単に実行できる観点から、お勧めのホストはSAVIHostです。 SAVIHostのexe本体を"MySynth.exe"とリネームして、本プロジェクトのReleaseフォルダに置いておくと いいと思います。あとは、そのMySynth.exeを実行すれば、MySynth.dllを読み込んで実行してくれます。
ただし、SAVIHostでは、GUIなしVSTiのプログラム番号を変更しても、GUIが変更されません。 今のところMySynth/SAVIHostのどちらの問題か今の所わかりませんが、開発用途なら許せる範囲です。 なお、VSTホストReaperでは問題ありませんでした。

デフォルトの状態では、実行するとホストと共にデバッグウィンドウも起動し、ディスプレイ上部に1サンプル辺りの 処理クロックが表示されるようになります。デバッグウィンドウにはedPrintf()というprintf()形式の関数を 使ってコードからからテキストを表示する事ができます。起動時には波形テーブルの周波数情報等が出力されています。

SAVIHostでMySynthを起動したところ。独自のGUIを持たないので、SAVIHostがパラメタを一覧にして表示している。

独自GUIを持たないので、ホストのGUIが使われます。このシンセのパラメタは、以下の5種類があります。 VST仕様ではパラメタ名は8文字(短い!)なので、本来のパラメタ名が切れて表示されています。
表示項目名パラメタ
Master Vマスターボリューム
Wave For波形種類(サイン、三角、ノコギリ、矩形)
Portamenポルタメント時間(0秒〜3秒)
Voice Moボイスモード(ポリ、モノ、レガート)
Unison Vユニゾンボイス数(1〜16)
この数を上げると、ボイス間でデチューンが掛かり、ボイスがステレオに振られます。

ディスプレイ上部には、常に処理クロックが表示される。

この表示は信号処理ロジックの処理効率を計る為のもので、1サンプル分のデータを生成するのにかかったクロック数等を表示します。 「分散」にはあまり意味はありません。クロックはRDTSC命令で取得していますが、これはCPU内部のコアクロックではなくFSBをベースにしたもののようです。 最近のCPUでは、SpeedStepやTurboBoostといわれるクロック可変技術が使われていますが、これには対応していません。 よって、実際にコアクロックが変動すると、ここで表示されるクロックも変動していまい、コードの実行効率が変化したように見える事になるので、 注意が必要です。

注意
ホストの種類によってはASIOを使っている場合、スレッド間でデッドロックが発生し、ホストが無応答に なる事があります。その場合、ホストのAudio設定を"MME"に設定するか、後述する方法でデバッグ機能を オフにしてください。また、ASIOで低レイテンシ実行している場合、edPrintf()のせいで、音切れが発生し易くなります。 プログラムミスと勘違いしないように注意してください。その時は、デバッグ機能をオフにするか、デバッグウィンドウを 閉じれば、音切れしなくなります。


ファイルの説明

ソースファイル等の説明です。 また、オリジナルシンセを開発するにあたって、これらのファイルの修正の必要度合いも示しておきます。
ファイル説明
vstplug.defエクスポート関数の為の定義ファイル。ビルド時(リンク時)に必要。修正不要。
common.h共通ヘッダ。デバッグ機能(デバッグウィンドウ及びクロック表示)のオン/オフの切り替えはこの中の_MYDEBUG_ONマクロの定義を1(オン)/0(オフ)にする事で行って下さい。開発が進むにつれて、ここにいろいろ追加していいと思います。
debug.cpp, debug.hデバッグ用処理の書かれたソース。修正不要。デバッグ機能に不満が出てきたらどうぞ。
MySynth.cpp, MySynth.h VSTiプラグインの本体クラス。ただし、ホストとのハンドリング処理のみで、信号処理は一切なし。 VSTi仕様に関わる部分と信号処理メイン部分を分離するようにしている。 オリジナルプラグインを公開する場合には、この中のユニークIDやシンセの名前など数箇所のみを修正する。 詳細はファイル参照。それ以外は修正不要。
MySynthMain.cpp, MySynthMain.h シンセ本体のクラス群で信号処理のメイン。VSTi仕様に依存する部分を排除。 オリジナルなシンセを作っていく時には、主にこのファイルにあるクラスを修正したり、 新規にクラス及びソースファイルを追加していく事になります。
synthBase.cpp, synthBase.h シンセ本体に必要となる、MIDI解釈、ボイスコントロール制御など面倒な事をやってくれるクラス群。 基本的には修正の必要はないが、これらの機能に不満が出てきたらどうぞ。


クラス構造や、コードの説明など

シンセ本体、ボイス、VCO(Voltage Controlではないが便宜上)、ボイスコントローラー、などなど。 まだ書いていません。

まずは、イメージをつかむ為の絵です。

続く。。。


Copyright c 2010 by Daichi. All rights reserved.
mail : cbj75800[at]pop02[dot]odn[dot]ne[dot]jp