トップページ


VST GUIの作成

一定間隔でGUIの描画更新するサンプル。
テキストラベルを表示するサンプルをもとにしている。

テキストラベルを表示するサンプルからの追加内容としては以下のとおり。

  • idle()関数(100ミリ秒ごとに呼び出される関数)をオーバーライド
  • idle()関数の中にカウンタを用意し、呼び出されることにカウントアップし描画する。

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


サンプルコード全体

【MyGuiVst5.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 "audioeffectx.h"
  10. #include "vstcontrols.h"
  11.  
  12.  
  13. // ============================================================================================
  14. // 設計情報の記入
  15. // ============================================================================================
  16. #define MY_VST_VENDOR "test vendor" //作者(ベンダー)名
  17. #define MY_VST_VERSION 1 //このVSTバージョン
  18. #define MY_VST_PRODUCT_NAME "Sample VST GUI" //このVSTの製品名
  19. #define MY_VST_NAME "GUI" //このVSTの名前
  20.  
  21. #define MY_VST_INPUT_NUM 2 //入力数。モノラル入力=1、ステレオ入力=2
  22. #define MY_VST_OUTPUT_NUM 2 //出力数。モノラル出力=1、ステレオ出力=2
  23.  
  24. #define MY_VST_UNIQUE_ID 'SMPL' //ユニークID
  25. //公開する場合は以下URLで発行されたユニークIDを入力する。
  26. //http://ygrabit.steinberg.de/~ygrabit/public_html/index.html
  27.  
  28. #define MY_VST_PRESET_NUM 1 //プリセットプログラムの数
  29. #define MY_VST_PARAMETER_NUM 2 //パラメータの数
  30.  
  31. #define MYVST_VOLUME_L 0
  32. #define MYVST_VOLUME_R 1
  33. // ============================================================================================
  34. // VST GUIクラス
  35. // ============================================================================================
  36. class VstGui5 : public AEffGUIEditor, CControlListener
  37. {
  38. public:
  39. VstGui5 (void* effect);
  40. virtual ~VstGui5 ();
  41.  
  42. // GUIのWindowを開いたときと閉じたときに処理を行う関数
  43. virtual bool open (void *ptr);
  44. virtual void close ();
  45.  
  46. // 他の処理がアイドル状態の際に呼び出される関数
  47. // GUI描画の更新等を行う。
  48. // おそらく100ミリ秒ごとに呼び出される。
  49. virtual void idle ();
  50.  
  51. // ボタンやつまみ等が動かされたときに処理を行う関数
  52. // 今回はテキストラベルのみのため、処理すべきことはないが、
  53. // valueChanged()関数は必ずオーバーライドしなければならない。
  54. virtual void valueChanged (CDrawContext *pContext, CControl *pControl) {};
  55.  
  56. protected:
  57. // テキストラベル
  58. CTextLabel* textLabel;
  59. };
  60.  
  61. VstGui5::VstGui5 (void* effect)
  62. : AEffGUIEditor ((AudioEffect*)effect)
  63. {
  64. // 継承元のにあるrect変数を初期化。
  65. // このrect変数にGUIのWindowsサイズを設定する。
  66. // (設定を行わないとWindowが開けない)
  67. rect.left = 0;
  68. rect.top = 0;
  69. rect.right = 512;
  70. rect.bottom = 256;
  71. }
  72.  
  73. VstGui5::~VstGui5 ()
  74. {
  75. }
  76.  
  77. bool VstGui5::open (void *ptr)
  78. {
  79. // まずは継承元の関数を呼び出す(必須)
  80. AEffGUIEditor::open (ptr);
  81.  
  82. // 次にフレーム(CFrame)を作成する。
  83. // ボタンやつまみ等はこのフレームの上に配置する形になる
  84. // ここではWindowと同じサイズのフレームを作成している
  85. CRect size (rect.left, rect.top, rect.right, rect.bottom);
  86.  
  87. CFrame* cframe = new CFrame (size, ptr, this);
  88. // 作成したフレームは継承元にあるframe変数に値を保存する必要がある。
  89. this->frame = cframe;
  90.  
  91. // -----------------------------------------------------------------
  92. // テキストラベルの大きさを設定
  93. CRect textsize (0, 0, 80, 25);
  94.  
  95. // テキストラベルの位置を設定
  96. textsize.offset (16, 16);
  97.  
  98. // テキストラベルを作成
  99. textLabel = new CTextLabel(textsize, "TextLabel", NULL, kLeft);
  100.  
  101. // テキストラベルをframeに追加する
  102. frame->addView (textLabel);
  103.  
  104. // 処理に問題がなければtrueを返す
  105. return true;
  106. }
  107.  
  108. void VstGui5::close ()
  109. {
  110. // frameをdeleteすることを忘れないようにする
  111. if (frame)
  112. {
  113. delete frame;
  114. }
  115. frame = 0;
  116. }
  117.  
  118. void VstGui5::idle ()
  119. {
  120. // まずは継承元の関数を呼び出す(必須)
  121. AEffGUIEditor::idle ();
  122.  
  123. // このVSTGUI固有の処理を記載する
  124.  
  125. static int i = 0;
  126. char text[256];
  127.  
  128. sprintf_s(text, 256,"%d", i);
  129.  
  130. //テキストラベルの文字を設定する
  131. textLabel->setText (text);
  132.  
  133. // テキストラベルの描画を更新する
  134. textLabel->setDirty();
  135.  
  136. i++;
  137. }
  138.  
  139. // ============================================================================================
  140. // VSTの基本となるクラス
  141. // ============================================================================================
  142. class MyVstGui5 : public AudioEffectX
  143. {
  144. public:
  145. MyVstGui5 (audioMasterCallback audioMaster);
  146. ~MyVstGui5 ();
  147.  
  148. // 音声信号を処理するメンバー関数
  149. virtual void processReplacing (float** inputs, float** outputs, VstInt32 sampleFrames);
  150. };
  151.  
  152. // ============================================================================================
  153. // このVSTのを生成するための関数
  154. // ============================================================================================
  155. AudioEffect* createEffectInstance (audioMasterCallback audioMaster)
  156. {
  157. //newでこのVSTを生成したポインタを返す
  158. return new MyVstGui5 (audioMaster);
  159. }
  160.  
  161. // ============================================================================================
  162. // コンストラクタ、デストラクタ(VSTの初期化、終了処理を記述)
  163. // ============================================================================================
  164. MyVstGui5::MyVstGui5 (audioMasterCallback audioMaster)
  165. : AudioEffectX (audioMaster, MY_VST_PRESET_NUM, MY_VST_PARAMETER_NUM)
  166. {
  167. //VSTの初期化を行う。
  168.  
  169. //以下の関数を呼び出して入力数、出力数等の情報を設定する。
  170. //必ず呼び出さなければならない。
  171. setNumInputs (MY_VST_INPUT_NUM); //入力数の設定
  172. setNumOutputs (MY_VST_OUTPUT_NUM); //出力数の設定
  173. setUniqueID (MY_VST_UNIQUE_ID); //ユニークIDの設定
  174.  
  175. isSynth (false); //このVSTがSynthかどうかのフラグを設定。
  176. //Synthの場合…true、Effectorの場合…false
  177.  
  178. canProcessReplacing (); //このVSTが音声処理可能かどうかのフラグを設定。
  179. //音声処理を行わないVSTはないので必ずこの関数を呼び出す。
  180.  
  181. // GUIを設定する
  182. editor = new VstGui5(this);
  183.  
  184. //このVSTのパラメータを初期化する。
  185. }
  186.  
  187. MyVstGui5::~MyVstGui5 ()
  188. {
  189. //VSTの終了処理をする。
  190. //このVSTでは特に実行する処理はなし。
  191.  
  192. // GUIはdeleteしなくていいっぽい
  193. }
  194.  
  195. // ============================================================================================
  196. // 音声信号を処理するメンバー関数
  197. // ============================================================================================
  198. void MyVstGui5::processReplacing (float** inputs, float** outputs, VstInt32 sampleFrames)
  199. {
  200. float *inL = inputs[0]; //入力 左用
  201. float *inR = inputs[1]; //入力 右用
  202. float *outL = outputs[0]; //出力 左用
  203. float *outR = outputs[1]; //出力 右用
  204.  
  205. for (int i = 0; i <sampleFrames ; i++)
  206. {
  207. // 入力をそのまま出力へ
  208. outL[i] = inL[i];
  209. outR[i] = inR[i];
  210. }
  211. }





javascript plugin Error : このプラグインで利用できない命令または文字列が入っています。
最終更新:2012年12月02日 16:26