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

VST(エフェクター)作成例


参考資料

サンプルコード全体

ソースコードのダウンロード→ここをクリック

  1. // ============================================================================================
  2. // インクルードファイル
  3. // ============================================================================================
  4. #include <stdio.h>
  5. #include <stdlib.h>
  6. #include <string.h>
  7. #include <math.h>
  8. #include <windows.h>
  9.  
  10. #include "audioeffectx.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 Tremolo VST" //このVSTの製品名
  19. #define MY_VST_NAME "Tremolo" //この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. //このVSTのパラメータを定義しておく。
  32. //0からの連番でなければならない。
  33. #define TREMOLO_SPEED 0
  34. #define TREMOLO_DEPTH 1
  35.  
  36. // ============================================================================================
  37. // VSTの基本となるクラス
  38. // ============================================================================================
  39. class MyTremoloVST : public AudioEffectX
  40. {
  41. protected:
  42. float fTime; //トレモロ用に経過時間を保存する変数
  43. float fTremoloSpeed; //トレモロの周期
  44. float fTremoloDepth; //トレモロの振幅
  45.  
  46. public:
  47. MyTremoloVST (audioMasterCallback audioMaster);
  48. ~MyTremoloVST ();
  49.  
  50. //作者(ベンダー)名、バージョン、製品名、VSTの名前を
  51. //Hostアプリケーションへ知らせるメンバー関数
  52. virtual bool getVendorString (char* text);
  53. virtual VstInt32 getVendorVersion ();
  54. virtual bool getProductString (char* text);
  55. virtual bool getEffectName (char* name);
  56.  
  57. // エフェクターのパラメータに関するメンバー関数
  58. virtual void setParameter (VstInt32 index, float value);
  59. virtual float getParameter (VstInt32 index);
  60. virtual void getParameterName (VstInt32 index, char* text);
  61. virtual void getParameterLabel (VstInt32 index, char* label);
  62. virtual void getParameterDisplay (VstInt32 index, char* text);
  63.  
  64. // 音声信号を処理するメンバー関数
  65. virtual void processReplacing (float** inputs, float** outputs, VstInt32 sampleFrames);
  66. };
  67.  
  68. // ============================================================================================
  69. // このVSTのを生成するための関数
  70. // ============================================================================================
  71. AudioEffect* createEffectInstance (audioMasterCallback audioMaster)
  72. {
  73. //newでこのVSTを生成したポインタを返す
  74. return new MyTremoloVST (audioMaster);
  75. }
  76.  
  77. // ============================================================================================
  78. // コンストラクタ、デストラクタ(VSTの初期化、終了処理を記述)
  79. // ============================================================================================
  80. MyTremoloVST::MyTremoloVST (audioMasterCallback audioMaster)
  81. : AudioEffectX (audioMaster, MY_VST_PRESET_NUM, MY_VST_PARAMETER_NUM)
  82. {
  83. //VSTの初期化を行う。
  84.  
  85. //以下の関数を呼び出して入力数、出力数等の情報を設定する。
  86. //必ず呼び出さなければならない。
  87. setNumInputs (MY_VST_INPUT_NUM); //入力数の設定
  88. setNumOutputs (MY_VST_OUTPUT_NUM); //出力数の設定
  89. setUniqueID (MY_VST_UNIQUE_ID); //ユニークIDの設定
  90.  
  91. isSynth (false); //このVSTがSynthかどうかのフラグを設定。
  92. //Synthの場合…true、Effectorの場合…false
  93.  
  94. canProcessReplacing (); //このVSTが音声処理可能かどうかのフラグを設定。
  95. //音声処理を行わないVSTはないので必ずこの関数を呼び出す。
  96.  
  97. //このVSTのパラメータを初期化する。
  98. fTime = 0.0f;
  99.  
  100. fTremoloSpeed = 1.0f / 4.0f; //トレモロの周期 0.25秒
  101. fTremoloDepth = 0.5f; //トレモロの振幅 0.5倍
  102. }
  103.  
  104. MyTremoloVST::~MyTremoloVST ()
  105. {
  106. //VSTの終了処理をする。
  107. //このVSTでは特に実行する処理はなし。
  108. }
  109.  
  110. // ============================================================================================
  111. // 作者(ベンダー)名、バージョン、製品名、VSTの名前をHostアプリケーションへ知らせるメンバー関数
  112. // ============================================================================================
  113. bool MyTremoloVST::getVendorString (char* text)
  114. {
  115. //作者(ベンダー)名をtextに格納してtrueを返す。
  116. //kVstMaxVendorStrLenは「vstsdk2.4\pluginterfaces\vst2.x\aeffect.h」に
  117. //定義されている。(kVstMaxVendorStrLen = 64)
  118. vst_strncpy (text, MY_VST_VENDOR, kVstMaxVendorStrLen);
  119. return true;
  120. }
  121.  
  122. VstInt32 MyTremoloVST::getVendorVersion ()
  123. {
  124. //バージョン(整数)を返す。
  125. return MY_VST_VERSION;
  126. }
  127.  
  128. bool MyTremoloVST::getProductString (char* text)
  129. {
  130. //製品名をtextに格納してtrueを返す。
  131. //kVstMaxProductStrLenは「vstsdk2.4\pluginterfaces\vst2.x\aeffect.h」に
  132. //定義されている。(kVstMaxProductStrLen = 64)
  133. vst_strncpy (text, MY_VST_PRODUCT_NAME, kVstMaxProductStrLen);
  134. return true;
  135. }
  136.  
  137. bool MyTremoloVST::getEffectName (char* name)
  138. {
  139. //製品名をnameに格納してtrueを返す。
  140. //kVstMaxEffectNameLenは「vstsdk2.4\pluginterfaces\vst2.x\aeffect.h」に
  141. //定義されている。(kVstMaxEffectNameLen = 32)
  142. vst_strncpy (name, MY_VST_NAME, kVstMaxEffectNameLen);
  143. return true;
  144. }
  145.  
  146. // ============================================================================================
  147. // エフェクターのパラメーターの設定、表示を行うメンバー関数
  148. // ============================================================================================
  149. void MyTremoloVST::setParameter (VstInt32 index, float value)
  150. {
  151. //indexで指定されたパラメータに値を設定する。
  152. //valueは0.0f~1.0fで与えられる。
  153. switch (index)
  154. {
  155. case TREMOLO_SPEED:
  156. fTremoloSpeed = 1.0f / (29.0f*value +1.0f); //1秒~1/30秒の範囲にする
  157. break;
  158. case TREMOLO_DEPTH:
  159. fTremoloDepth = value;
  160. break;
  161. }
  162. }
  163.  
  164. float MyTremoloVST::getParameter (VstInt32 index)
  165. {
  166. //indexで指定されたパラメータの値を
  167. //0.0f~1.0fの範囲で返す
  168. float value = 0.0f;
  169. switch (index)
  170. {
  171. case TREMOLO_SPEED:
  172. value = (1 / fTremoloSpeed - 1.0f) / 29.0f; //1秒~1/30秒を0.0f~1.0fの範囲にする
  173. break;
  174. case TREMOLO_DEPTH:
  175. value = fTremoloDepth;
  176. break;
  177. }
  178. return value;
  179. }
  180.  
  181. void MyTremoloVST::getParameterName (VstInt32 index, char* text)
  182. {
  183. //indexで指定されたパラメータの名前をtextに格納する
  184. //kVstMaxParamStrLenは「vstsdk2.4\pluginterfaces\vst2.x\aeffect.h」に
  185. //定義されている。(kVstMaxParamStrLen = 8)
  186. switch (index)
  187. {
  188. case TREMOLO_SPEED:
  189. vst_strncpy (text, "Speed", kVstMaxParamStrLen);
  190. break;
  191. case TREMOLO_DEPTH:
  192. vst_strncpy (text, "Depth", kVstMaxParamStrLen);
  193. break;
  194. }
  195. }
  196.  
  197. void MyTremoloVST::getParameterLabel (VstInt32 index, char* label)
  198. {
  199. //indexで指定されたパラメータの単位をlabelに格納する
  200. //kVstMaxParamStrLenは「vstsdk2.4\pluginterfaces\vst2.x\aeffect.h」に
  201. //定義されている。(kVstMaxParamStrLen = 8)
  202. switch (index)
  203. {
  204. case TREMOLO_SPEED:
  205. vst_strncpy (label, "Hz", kVstMaxParamStrLen);
  206. break;
  207. case TREMOLO_DEPTH:
  208. vst_strncpy (label, "dB", kVstMaxParamStrLen);
  209. break;
  210. }
  211. }
  212.  
  213. void MyTremoloVST::getParameterDisplay (VstInt32 index, char* text)
  214. {
  215. //indexで指定されたパラメータの表示内容をtextに格納する
  216. //kVstMaxParamStrLenは「vstsdk2.4\pluginterfaces\vst2.x\aeffect.h」に
  217. //定義されている。(kVstMaxParamStrLen = 8)
  218. switch (index)
  219. {
  220. case TREMOLO_SPEED:
  221. float2string (1.0f / fTremoloSpeed, text, kVstMaxParamStrLen);
  222. break;
  223. case TREMOLO_DEPTH:
  224. float2string (fTremoloDepth, text, kVstMaxParamStrLen);
  225. break;
  226. }
  227. }
  228.  
  229. // ============================================================================================
  230. // 音声信号を処理するメンバー関数
  231. // ============================================================================================
  232. void MyTremoloVST::processReplacing (float** inputs, float** outputs, VstInt32 sampleFrames)
  233. {
  234. //入力、出力は2次元配列で渡される。
  235. //入力は-1.0f~1.0fの間で渡される。
  236. //出力は-1.0f~1.0fの間で書き込む必要がある。
  237. //sampleFramesが処理するバッファのサイズ
  238. float* inL = inputs[0]; //入力 左用
  239. float* inR = inputs[1]; //入力 右用
  240. float* outL = outputs[0]; //出力 左用
  241. float* outR = outputs[1]; //出力 右用
  242.  
  243. float dt = 1.0f / getSampleRate (); //1フレームで進む秒数
  244. float pi = 3.14159265f; //円周率
  245.  
  246. while (sampleFrames > 0)
  247. {
  248. //ここで音声処理を行う。
  249.  
  250. //dt分時間を進める。
  251. //トレモロ周期を超えた場合は、周期分戻す。
  252. fTime = fTime + dt;
  253. if (fTime > fTremoloSpeed)
  254. {
  255. fTime -= fTremoloSpeed;
  256. }
  257.  
  258. //出力バッファへ書き込む。
  259. (*outL) = (*inL) * ( 1.0f - fTremoloDepth * (0.5f + 0.5f*sin(2.0f*pi*fTime/fTremoloSpeed)));
  260. (*outR) = (*inR) * ( 1.0f - fTremoloDepth * (0.5f + 0.5f*sin(2.0f*pi*fTime/fTremoloSpeed)));
  261.  
  262. inL++;
  263. inR++;
  264. outL++;
  265. outR++;
  266. sampleFrames--;
  267. }
  268.  
  269. }
  270.  

誤字・脱字、内容の不備、要望等あれば教えてください。
また質問もこちらへお願いします。
名前:
コメント:



合計: -
今日: -
昨日: -