※上記の広告は60日以上更新のないWIKIに表示されています。更新することで広告が下部へ移動します。

VST Tips(準備中)


VST GUIの作成

VST GUIのウィンドウが開かれるだけのサンプルにつまみを2つ追加したもの。
追加内容としては以下のとおり。

  • つまみクラス(Cknobクラス)へのポインターをGUIクラスの変数として定義
  • GUIクラスにsetParameter()関数を追加
  • GUIクラスのopen()関数につまみを作成するコードの追加
  • GUIクラスのvalueChanged()関数に操作されたつまみを特定しsetParameter()関数へ引き渡す処理の追加
  • GUIクラスのsetParameter()関数につまみの更新処理を追加

リソースファイルを追加する必要がある。リソースファイルの追加方法はCPPファイルを追加する方法と同じ。

なお今回つまみ用いた画像と作成したVSTは以下のとおり。(DLLファイルを利用するときはウィルスチェックをかけてください)


サンプルコード全体

【resource.rc】
  1. #include <windows.h>
  2. #include <commctrl.h>
  3. #include <richedit.h>
  4. #include "resource.h"
  5.  
  6. BITMAP_KNOB_BACK BITMAP ".\\knob_back.bmp"
  7. BITMAP_KNOB_HANDLE BITMAP ".\\knob_handle.bmp"


【resource.h】
  1. #define BITMAP_KNOB_BACK 100
  2. #define BITMAP_KNOB_HANDLE 101

【MyGuiVst2.cpp】
  1. #define _CRT_SECURE_NO_DEPRECATE 1
  2.  
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. #include <string.h>
  6. #include <math.h>
  7. #include <windows.h>
  8.  
  9. #include "resource.h"
  10. #include "audioeffectx.h"
  11. #include "vstcontrols.h"
  12.  
  13.  
  14. // ============================================================================================
  15. // 設計情報の記入
  16. // ============================================================================================
  17. #define MY_VST_VENDOR "test vendor" //作者(ベンダー)名
  18. #define MY_VST_VERSION 1 //このVSTバージョン
  19. #define MY_VST_PRODUCT_NAME "Sample VST GUI" //このVSTの製品名
  20. #define MY_VST_NAME "GUI" //このVSTの名前
  21.  
  22. #define MY_VST_INPUT_NUM 2 //入力数。モノラル入力=1、ステレオ入力=2
  23. #define MY_VST_OUTPUT_NUM 2 //出力数。モノラル出力=1、ステレオ出力=2
  24.  
  25. #define MY_VST_UNIQUE_ID 'SMPL' //ユニークID
  26. //公開する場合は以下URLで発行されたユニークIDを入力する。
  27. //http://ygrabit.steinberg.de/~ygrabit/public_html/index.html
  28.  
  29. #define MY_VST_PRESET_NUM 1 //プリセットプログラムの数
  30. #define MY_VST_PARAMETER_NUM 2 //パラメータの数
  31.  
  32. #define MYVST_VOLUME_L 0
  33. #define MYVST_VOLUME_R 1
  34. // ============================================================================================
  35. // VST GUIクラス
  36. // ============================================================================================
  37. class VstGui2 : public AEffGUIEditor, CControlListener
  38. {
  39. public:
  40. VstGui2 (void* effect);
  41. virtual ~VstGui2 ();
  42.  
  43. // GUIのWindowを開いたときと閉じたときに処理を行う関数
  44. virtual bool open (void *ptr);
  45. virtual void close ();
  46.  
  47. // ボタンやつまみ等が動かされたときに処理を行う関数
  48. virtual void valueChanged (CDrawContext *pContext, CControl *pControl);
  49. virtual void setParameter (VstInt32 index, float value);
  50.  
  51. protected:
  52. // ボリュームを操作するつまみ
  53. CKnob* knobVolumeL;
  54. CKnob* knobVolumeR;
  55. };
  56.  
  57. VstGui2::VstGui2 (void* effect)
  58. : AEffGUIEditor ((AudioEffect*)effect)
  59. {
  60. // 継承元のにあるrect変数を初期化。
  61. // このrect変数にGUIのWindowsサイズを設定する。
  62. // (設定を行わないとWindowが開けない)
  63. rect.left = 0;
  64. rect.top = 0;
  65. rect.right = 512;
  66. rect.bottom = 256;
  67.  
  68. // VstGui2クラス固有の初期化を行う
  69. knobVolumeL = 0;
  70. knobVolumeR = 0;
  71. }
  72.  
  73. VstGui2::~VstGui2 ()
  74. {
  75. }
  76.  
  77. void VstGui2::valueChanged (CDrawContext *pContext, CControl *pControl)
  78. {
  79. // どのパラメーターが操作されたかを取得する。
  80. VstInt32 index = pControl->getTag();
  81.  
  82. // パラメーターの値を取得する。
  83. float value = pControl->getValue ();
  84.  
  85. // 取得した値をパラメーターに反映させる
  86. this->setParameter(index, value);
  87. }
  88.  
  89. void VstGui2::setParameter (VstInt32 index, float value)
  90. {
  91. switch (index)
  92. {
  93. case MYVST_VOLUME_L:
  94. // つまみに値を設定し、画面を更新する(描画させる。)
  95. knobVolumeL->setValue (value);
  96.  
  97. // MyVstGui2(AudioEffectXを継承して作ったクラス)に
  98. // 操作されたパラメーターを通知して更新させる
  99. // (setParameterAutomatedは内部でsetParameterを呼び出す)
  100. effect->setParameterAutomated(index, value);
  101. break;
  102.  
  103. case MYVST_VOLUME_R:
  104. // MYVST_VOLUME_Lの処理とほぼ同様
  105. knobVolumeR->setValue (value);
  106. effect->setParameterAutomated(index, value);
  107. break;
  108.  
  109. default:
  110. break;
  111. }
  112. }
  113.  
  114. bool VstGui2::open (void *ptr)
  115. {
  116. // まずは継承元の関数を呼び出す(必須)
  117. AEffGUIEditor::open (ptr);
  118.  
  119. // 次にフレーム(CFrame)を作成する。
  120. // ボタンやつまみ等はこのフレームの上に配置する形になる
  121. // ここではWindowと同じサイズのフレームを作成している
  122. CRect size (rect.left, rect.top, rect.right, rect.bottom);
  123.  
  124. CFrame* cframe = new CFrame (size, ptr, this);
  125. // 作成したフレームは継承元にあるframe変数に値を保存する必要がある。
  126. this->frame = cframe;
  127.  
  128. // -----------------------------------------------------------------
  129. // つまみを作成する。
  130. // つまみ用の画像をリソースから読み込み
  131. CBitmap *KnobBack = new CBitmap (BITMAP_KNOB_BACK);
  132. CBitmap *KnobHandle = new CBitmap (BITMAP_KNOB_HANDLE);
  133.  
  134. // つまみの大きさを設定
  135. CRect knobsize (0, 0, KnobBack->getWidth (), KnobBack->getHeight ());
  136.  
  137. // つまみの位置を設定
  138. knobsize.offset (16, 16);
  139.  
  140. // つまみ画像をどこから表示するかの設定。基本的に0, 0でよいはず。
  141. CPoint point (0, 0);
  142.  
  143. knobVolumeL = new CKnob (knobsize, this, MYVST_VOLUME_L, KnobBack, KnobHandle, point);
  144. // つまみの中心とハンドルまでの長さ
  145. knobVolumeL->setInsetValue (7);
  146. // 現在のボリュームをMyVstGui2(AudioEffectXを継承して作ったクラス)から取得する
  147. knobVolumeL->setValue(effect->getParameter(MYVST_VOLUME_L));
  148. // つまみをframeに追加する
  149. frame->addView (knobVolumeL);
  150.  
  151. // knobVolumeLとほぼ同様
  152. knobsize (0, 0, KnobBack->getWidth (), KnobBack->getHeight ());
  153. knobsize.offset (64, 16);
  154. knobVolumeR = new CKnob (knobsize, this, MYVST_VOLUME_R, KnobBack, KnobHandle, point);
  155. knobVolumeR->setInsetValue (7);
  156. knobVolumeR->setValue(effect->getParameter(MYVST_VOLUME_R));
  157. frame->addView (knobVolumeR);
  158.  
  159. // つまみ用の画像を解放する
  160. KnobBack->forget();
  161. KnobHandle->forget();
  162.  
  163. // 処理に問題がなければtrueを返す
  164. return true;
  165. }
  166.  
  167. void VstGui2::close ()
  168. {
  169. // frameをdeleteすることを忘れないようにする
  170. if (frame)
  171. {
  172. delete frame;
  173. }
  174. frame = 0;
  175. }
  176.  
  177. // ============================================================================================
  178. // VSTの基本となるクラス
  179. // ============================================================================================
  180. class MyVstGui2 : public AudioEffectX
  181. {
  182. public:
  183. MyVstGui2 (audioMasterCallback audioMaster);
  184. ~MyVstGui2 ();
  185.  
  186. // エフェクターのパラメータに関するメンバー関数
  187. virtual void setParameter (VstInt32 index, float value);
  188.  
  189. // 音声信号を処理するメンバー関数
  190. virtual void processReplacing (float** inputs, float** outputs, VstInt32 sampleFrames);
  191.  
  192. protected:
  193. float volumeL;
  194. float volumeR;
  195. };
  196.  
  197. // ============================================================================================
  198. // このVSTのを生成するための関数
  199. // ============================================================================================
  200. AudioEffect* createEffectInstance (audioMasterCallback audioMaster)
  201. {
  202. //newでこのVSTを生成したポインタを返す
  203. return new MyVstGui2 (audioMaster);
  204. }
  205.  
  206. // ============================================================================================
  207. // コンストラクタ、デストラクタ(VSTの初期化、終了処理を記述)
  208. // ============================================================================================
  209. MyVstGui2::MyVstGui2 (audioMasterCallback audioMaster)
  210. : AudioEffectX (audioMaster, MY_VST_PRESET_NUM, MY_VST_PARAMETER_NUM)
  211. {
  212. //VSTの初期化を行う。
  213.  
  214. //以下の関数を呼び出して入力数、出力数等の情報を設定する。
  215. //必ず呼び出さなければならない。
  216. setNumInputs (MY_VST_INPUT_NUM); //入力数の設定
  217. setNumOutputs (MY_VST_OUTPUT_NUM); //出力数の設定
  218. setUniqueID (MY_VST_UNIQUE_ID); //ユニークIDの設定
  219.  
  220. isSynth (false); //このVSTがSynthかどうかのフラグを設定。
  221. //Synthの場合…true、Effectorの場合…false
  222.  
  223. canProcessReplacing (); //このVSTが音声処理可能かどうかのフラグを設定。
  224. //音声処理を行わないVSTはないので必ずこの関数を呼び出す。
  225.  
  226. // GUIを設定する
  227. editor = new VstGui2(this);
  228.  
  229. //このVSTのパラメータを初期化する。
  230. volumeL = 0.0f;
  231. volumeR = 0.0f;
  232. }
  233.  
  234. MyVstGui2::~MyVstGui2 ()
  235. {
  236. //VSTの終了処理をする。
  237. //このVSTでは特に実行する処理はなし。
  238.  
  239. // GUIはdeleteしなくていいっぽい
  240. }
  241.  
  242. void MyVstGui2::setParameter (VstInt32 index, float value)
  243. {
  244. switch (index)
  245. {
  246. case MYVST_VOLUME_L:
  247. volumeL = value;
  248. break;
  249.  
  250. case MYVST_VOLUME_R:
  251. volumeR = value;
  252. break;
  253.  
  254. default:
  255. break;
  256. }
  257. }
  258.  
  259. // ============================================================================================
  260. // 音声信号を処理するメンバー関数
  261. // ============================================================================================
  262. void MyVstGui2::processReplacing (float** inputs, float** outputs, VstInt32 sampleFrames)
  263. {
  264. float *inL = inputs[0]; //入力 左用
  265. float *inR = inputs[1]; //入力 右用
  266. float *outL = outputs[0]; //出力 左用
  267. float *outR = outputs[1]; //出力 右用
  268.  
  269. for (int i = 0; i <sampleFrames ; i++)
  270. {
  271. // 入力をそのまま出力へ
  272. outL[i] = volumeL * inL[i];
  273. outR[i] = volumeR * inR[i];
  274. }
  275. }





javascript plugin Error : このプラグインで利用できない命令または文字列が入っています。