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

VST Tips(準備中)


VST GUIの作成

つまみだけのVST GUIのつまみをスライダーに変更したもの

  • スライダークラス(CSliderクラス)へのポインターをGUIクラスの変数として定義
  • GUIクラスのopen()関数にスライダーを作成するコードの追加

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


サンプルコード全体

【resource.rc】
  1. #include <windows.h>
  2. #include <commctrl.h>
  3. #include <richedit.h>
  4. #include "resource.h"
  5.  
  6. BITMAP_SLIDER_BACK BITMAP ".\\slider_back.bmp"
  7. BITMAP_SLIDER_HANDLE BITMAP ".\\slider_handle.bmp"

【resource.h】
  1. #define BITMAP_SLIDER_BACK 100
  2. #define BITMAP_SLIDER_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 VstGui3 : public AEffGUIEditor, CControlListener
  38. {
  39. public:
  40. VstGui3 (void* effect);
  41. virtual ~VstGui3 ();
  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. CSlider* sliderVolumeL;
  54. CSlider* sliderVolumeR;
  55. };
  56.  
  57. VstGui3::VstGui3 (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. // VstGui3クラス固有の初期化を行う
  69. sliderVolumeL = 0;
  70. sliderVolumeR = 0;
  71. }
  72.  
  73. VstGui3::~VstGui3 ()
  74. {
  75. }
  76.  
  77. void VstGui3::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 VstGui3::setParameter (VstInt32 index, float value)
  90. {
  91. switch (index)
  92. {
  93. case MYVST_VOLUME_L:
  94. // スライダーに値を設定し、画面を更新する(描画させる。)
  95. sliderVolumeL->setValue (value);
  96.  
  97. // MyVstGui3(AudioEffectXを継承して作ったクラス)に
  98. // 操作されたパラメーターを通知して更新させる
  99. // (setParameterAutomatedは内部でsetParameterを呼び出す)
  100. effect->setParameterAutomated(index, value);
  101. break;
  102.  
  103. case MYVST_VOLUME_R:
  104. // MYVST_VOLUME_Lの処理とほぼ同様
  105. sliderVolumeR->setValue (value);
  106. effect->setParameterAutomated(index, value);
  107. break;
  108.  
  109. default:
  110. break;
  111. }
  112. }
  113.  
  114. bool VstGui3::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 *sliderBack = new CBitmap (BITMAP_SLIDER_BACK);
  132. CBitmap *sliderHandle = new CBitmap (BITMAP_SLIDER_HANDLE);
  133.  
  134. // スライダーの大きさを設定
  135. CRect slidersize (0, 0, sliderBack->getWidth (), sliderBack->getHeight ());
  136.  
  137. // スライダーの位置を設定
  138. slidersize.offset (16, 16);
  139.  
  140. // スライダー画像をどこから表示するかの設定。基本的に0, 0でよいはず。
  141. CPoint point (0, 0);
  142.  
  143. // スライダーのハンドルの下限位置と上限位置を計算
  144. int minpos = slidersize.top;
  145. int maxpos = slidersize.top + sliderBack->getHeight () - sliderHandle->getHeight ();
  146.  
  147. // 縦方向(下限位置が0.0、上限位置が1.0)のスライダーを作成する。
  148. sliderVolumeL = new CSlider (slidersize, this, MYVST_VOLUME_L, minpos, maxpos, sliderHandle, sliderBack, point, kBottom | kVertical);
  149. // 現在のボリュームをMyVstGui3(AudioEffectXを継承して作ったクラス)から取得する
  150. sliderVolumeL->setValue(effect->getParameter(MYVST_VOLUME_L));
  151. // スライダーをframeに追加する
  152. frame->addView (sliderVolumeL);
  153.  
  154. // sliderVolumeLとほぼ同様
  155. slidersize (0, 0, sliderBack->getWidth (), sliderBack->getHeight ());
  156. slidersize.offset (64, 16);
  157. minpos = slidersize.top;
  158. maxpos = slidersize.top + sliderBack->getHeight () - sliderHandle->getHeight ();
  159. sliderVolumeR = new CSlider (slidersize, this, MYVST_VOLUME_R, minpos, maxpos, sliderHandle, sliderBack, point, kBottom | kVertical);
  160. sliderVolumeR->setValue(effect->getParameter(MYVST_VOLUME_R));
  161. frame->addView (sliderVolumeR);
  162.  
  163. // スライダー用の画像を解放する
  164. sliderBack->forget();
  165. sliderHandle->forget();
  166.  
  167. // 処理に問題がなければtrueを返す
  168. return true;
  169. }
  170.  
  171. void VstGui3::close ()
  172. {
  173. // frameをdeleteすることを忘れないようにする
  174. if (frame)
  175. {
  176. delete frame;
  177. }
  178. frame = 0;
  179. }
  180.  
  181. // ============================================================================================
  182. // VSTの基本となるクラス
  183. // ============================================================================================
  184. class MyVstGui3 : public AudioEffectX
  185. {
  186. public:
  187. MyVstGui3 (audioMasterCallback audioMaster);
  188. ~MyVstGui3 ();
  189.  
  190. // エフェクターのパラメータに関するメンバー関数
  191. virtual void setParameter (VstInt32 index, float value);
  192.  
  193. // 音声信号を処理するメンバー関数
  194. virtual void processReplacing (float** inputs, float** outputs, VstInt32 sampleFrames);
  195.  
  196. protected:
  197. float volumeL;
  198. float volumeR;
  199. };
  200.  
  201. // ============================================================================================
  202. // このVSTのを生成するための関数
  203. // ============================================================================================
  204. AudioEffect* createEffectInstance (audioMasterCallback audioMaster)
  205. {
  206. //newでこのVSTを生成したポインタを返す
  207. return new MyVstGui3 (audioMaster);
  208. }
  209.  
  210. // ============================================================================================
  211. // コンストラクタ、デストラクタ(VSTの初期化、終了処理を記述)
  212. // ============================================================================================
  213. MyVstGui3::MyVstGui3 (audioMasterCallback audioMaster)
  214. : AudioEffectX (audioMaster, MY_VST_PRESET_NUM, MY_VST_PARAMETER_NUM)
  215. {
  216. //VSTの初期化を行う。
  217.  
  218. //以下の関数を呼び出して入力数、出力数等の情報を設定する。
  219. //必ず呼び出さなければならない。
  220. setNumInputs (MY_VST_INPUT_NUM); //入力数の設定
  221. setNumOutputs (MY_VST_OUTPUT_NUM); //出力数の設定
  222. setUniqueID (MY_VST_UNIQUE_ID); //ユニークIDの設定
  223.  
  224. isSynth (false); //このVSTがSynthかどうかのフラグを設定。
  225. //Synthの場合…true、Effectorの場合…false
  226.  
  227. canProcessReplacing (); //このVSTが音声処理可能かどうかのフラグを設定。
  228. //音声処理を行わないVSTはないので必ずこの関数を呼び出す。
  229.  
  230. // GUIを設定する
  231. editor = new VstGui3(this);
  232.  
  233. //このVSTのパラメータを初期化する。
  234. volumeL = 0.0f;
  235. volumeR = 0.0f;
  236. }
  237.  
  238. MyVstGui3::~MyVstGui3 ()
  239. {
  240. //VSTの終了処理をする。
  241. //このVSTでは特に実行する処理はなし。
  242.  
  243. // GUIはdeleteしなくていいっぽい
  244. }
  245.  
  246. void MyVstGui3::setParameter (VstInt32 index, float value)
  247. {
  248. switch (index)
  249. {
  250. case MYVST_VOLUME_L:
  251. volumeL = value;
  252. break;
  253.  
  254. case MYVST_VOLUME_R:
  255. volumeR = value;
  256. break;
  257.  
  258. default:
  259. break;
  260. }
  261. }
  262.  
  263. // ============================================================================================
  264. // 音声信号を処理するメンバー関数
  265. // ============================================================================================
  266. void MyVstGui3::processReplacing (float** inputs, float** outputs, VstInt32 sampleFrames)
  267. {
  268. float *inL = inputs[0]; //入力 左用
  269. float *inR = inputs[1]; //入力 右用
  270. float *outL = outputs[0]; //出力 左用
  271. float *outR = outputs[1]; //出力 右用
  272.  
  273. for (int i = 0; i <sampleFrames ; i++)
  274. {
  275. // 入力をそのまま出力へ
  276. outL[i] = volumeL * inL[i];
  277. outR[i] = volumeR * inR[i];
  278. }
  279. }





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