初めてVSTiシンセを作ろうとすると、VST SDKをダウンロードしてきて、中にあるサンプルソースと ドキュメントを眺める事になります。 しかし、あれを眺めるだけでシンセを作るのは初心者の方には難しいと思います。 そこで、シンセ作りをもっと簡単に行えるようにするために、雛形となるようなクラス構造を 設計してサンプルコードを作りました。考え方としては、信号処理に関するメイン部分と、 それ以外のVST仕様やMIDIハンドリング等の部分を分離して、プログラミングし易い構造を目指しました。
しかし、今回のバージョンはまだ独自のGUIがありません。 これではまともなシンセとは言えません。GUIについては、別途説明したいと考えています。
設定項目 | 設定値 |
---|---|
プロジェクトの種類 | Win32プロジェクト |
アプリケーションの種類 | DLL |
追加のオプション | 空のプロジェクト |
設定ページ | 設定項目 | 設定値 |
---|---|---|
「構成プロパティ」-「全般」 | 文字セット | マルチバイト文字セットを使用する |
「構成プロパティ」-「リンカ」-「入力」 | モジュール定義ファイル | vstplug.defと入力 |
「構成プロパティ」-「C/C++」-「コード生成」 ※ソースファイルを追加後でないとこのページは表示されません | ランタイム ライブラリ | Release構成は「マルチスレッド (/MT)」 Debug構成は「マルチスレッド デバッグ (/MTd)」 |
浮動小数点モデル | Fast(/fp:fast) | |
拡張命令セットを有効にする | ストリーム SIMD 拡張機能 2 (/arch:SSE2) |
デフォルトの状態では、実行するとホストと共にデバッグウィンドウも起動し、ディスプレイ上部に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解釈、ボイスコントロール制御など面倒な事をやってくれるクラス群。 基本的には修正の必要はないが、これらの機能に不満が出てきたらどうぞ。 |
まずは、イメージをつかむ為の絵です。
続く。。。