簡単なエフェクターを作成してみるのソースコード全体です。
MyMiniTremoloVST.cpp
VSTプラグインのメインとなるソースファイル
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 |
// ============================================================================================ // インクルードファイル // ============================================================================================ #include "audioeffectx.h" #include <math.h> // ============================================================================================ // 設計情報の記入 // ============================================================================================ #define MY_VST_PRESET_NUM 1 //プリセットプログラムの数 #define MY_VST_PARAMETER_NUM 0 //パラメータの数 #define MY_VST_INPUT_NUM 2 //入力数。モノラル入力=1、ステレオ入力=2 #define MY_VST_OUTPUT_NUM 2 //出力数。モノラル出力=1、ステレオ出力=2 #define MY_VST_UNIQUE_ID 'SMPL' //ユニークID //公開する場合は以下URLで発行されたユニークIDを入力する。 //https://ygrabit.steinberg.de/~ygrabit/public_html/index.html // ============================================================================================ // VSTの基本となるクラス // ============================================================================================ class MyMiniTremoloVST : public AudioEffectX { private: float theta; // sin関数の角度 θ。初期値は0 float tremolospeed; // トレモロのスピード。角速度ωと同じ。 float tremolodepth; // トレモロの効き具合。0~1の間。 public: MyMiniTremoloVST(audioMasterCallback audioMaster); // 音声信号を処理するメンバー関数 virtual void processReplacing(float** inputs, float** outputs, VstInt32 sampleFrames); }; // ============================================================================================ // このVSTのを生成するための関数 // ============================================================================================ AudioEffect* createEffectInstance(audioMasterCallback audioMaster) { //newでこのVSTを生成したポインタを返す return new MyMiniTremoloVST(audioMaster); } // ============================================================================================ // コンストラクタ(VSTの初期化) // ============================================================================================ MyMiniTremoloVST::MyMiniTremoloVST(audioMasterCallback audioMaster) : AudioEffectX(audioMaster, MY_VST_PRESET_NUM, MY_VST_PARAMETER_NUM) { //VSTの初期化を行う。 //以下の関数を呼び出して入力数、出力数等の情報を設定する。 //必ず呼び出さなければならない。 setNumInputs(MY_VST_INPUT_NUM); //入力数の設定 setNumOutputs(MY_VST_OUTPUT_NUM); //出力数の設定 setUniqueID(MY_VST_UNIQUE_ID); //ユニークIDの設定 //このVSTがSynthかどうかのフラグを設定。Synthの場合…true、Effectorの場合…false isSynth(false); //このVSTが音声処理可能かどうかのフラグを設定。音声処理を行わないVSTはないので必ずこの関数を呼び出す。 canProcessReplacing(); //上記の関数を呼び出した後に初期化を行う theta = 0.0f; float Hz = 4.0f; // トレモロの周期 tremolospeed = (2.0f * 3.14159265f * Hz) / 44100.0f ; //トレモロの周期を角速度に変換 tremolodepth = 0.5f; //トレモロの振幅 0.5 } // ============================================================================================ // 音声信号を処理するメンバー関数 // ============================================================================================ void MyMiniTremoloVST::processReplacing(float** inputs, float** outputs, VstInt32 sampleFrames) { int L = 0; int R = 1; for (int i = 0; i < sampleFrames; i++) { //ここで音声処理を行う。 // theta(θ)にtremolospeed(=角速度)を加え、更新する // 2π(360°)を超えた場合は、2π分戻す。 theta += tremolospeed; if (theta > 2 * 3.14159265f) { theta -= 2 * 3.14159265f; } // sin関数の結果を0~1の間にする float a = (sin(theta) * 0.5f) + 0.5f; // tremolodepthと先ほどの結果から掛け合わせる値を計算する float b = (1.0f - tremolodepth) + (a * tremolodepth); //入力信号と掛け合わせ、出力バッファへ書き込む。 outputs[L][i] = b * inputs[L][i]; outputs[R][i] = b * inputs[R][i]; } } |