約 3,975,272 件
https://w.atwiki.jp/vstplugins/pages/162.html
PSP08 Vapor Virtual Synth メディアファージ (日本輸入元) East West (開発元) イントロダクション ハリウッド映画やマルチメディア業界で注目を集めている、奇才のサウンドデザイナーMarc Van Borkを起用して開発したシンセサイザー音源が登場!! 彼のハリウッドでの実践経験に基づいて、「本当に使えるサウンドか?」を常に判断しつつ制作した結果、各収録サウンドは見事に研ぎ澄まされ、粒揃いの「使える」サウンドに仕上がっています。 『VAPOR』の音色コンセプトである、「テクノロジー」と「フューチャー(未来)」を実現するために、スタジオにて数多くの実験を試みた上、制作に着手しています。それ故この製品には、聴く者を空想の世界へと誘う様なイマジネイティブな音像に満ち溢れています。 プリセット波形の制作にあたっては、一般的なシンセシス方式に加えて、ボコーディング、フェーズ・ボコーディング、グラニュラー・シンセシス、コンボリューション、ウェーブ・シェーピング、スペクトラル・リシンセシスなどの特殊シンセシス方式も採用しました。 搭載サウンド □Marc Van Borkの手によるオリジナル・シンセサウンド音源 □5つのカテゴリ別にサウンドを収録 LEAD:ハイエナジーなシンセリード、キーボード系サウンドなど、メロディ。シーケンスに最適なリード・サウンド/96種類 ARP :スタンダードなシンセウェーブからオリジナル・ウェーブまで、用途を特定しないシンセウェーブ/58種類 BASS:テクノ、トランスミュージック、ハウスなど、あらゆるベースサウンド/52種類 PAD :雰囲気作りに最適なバックグラウンド・アンビエント、スタンダードなシンセパッド、刻々と音色が変化するスウィープ・パッドなど/506種類 FX :ノイズ系エフェクト、デジタルシグナル、イントロ/ブレイク/などに最適なインパクトのあるエフェクトなど/126種類 □複数のプリセットをレイヤー/エディットしたマルチ・プリセットを収録/316種類 □収録総容量:約2.4GB(ギガバイト) 名前 コメント
https://w.atwiki.jp/vst_prog/pages/71.html
VST Tips(準備中) 自作VSTクラスの初期化ルール ここでは前項で定義したMyMinimumVSTの以下2つの関数のうち、コンストラクタについて詳細を記載する。 コンストラクタ void processReplacing() コンストラクタ AudioEffectXクラスを継承して作った自作クラスは必ずコンストラクタを持たなくてはならない。 自作したVSTクラスのコンストラクタでは最初に継承元(AudioEffectX)クラスのコンストラクタを呼び出す。 継承元コンストラクタは以下のとおり。 AudioEffectX(audioMasterCallback audioMaster, VstInt32 numPrograms, VstInt32 numParams) 継承元コンストラクタを呼び出した後はさらに以下の関数を呼び出さなければならない。 関数 概要 setNumInputs() VSTの入力数(ステレオ、モノラル等)を設定する関数。 setNumOutputs() VSTの出力数(ステレオ、モノラル等)を設定する関数。 setUniqueID() 全世界のVSTに一意に割り当てられたID設定する関数。自作したVSTを公開する場合は、http //ygrabit.steinberg.de/~ygrabit/public_html/index.htmlよりIDを取得しなければならない。 isSynth() 自作するVSTがシンセなのかエフェクタなのかを設定する関数。 canProcessReplacing() 自作するVSTが音声処理可能であることを設定する関数。 サンプルコード サンプルコードは以下のとおり。 #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を入力する。 //http //ygrabit.steinberg.de/~ygrabit/public_html/index.html #define MY_VST_PRESET_NUM 1 //プリセットプログラムの数#define MY_VST_PARAMETER_NUM 0 //パラメータの数 MyMinimumVST MyMinimumVST (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の設定 isSynth (false); //このVSTがSynthかどうかのフラグを設定。 //Synthの場合…true、Effectorの場合…false canProcessReplacing (); //このVSTが音声処理可能かどうかのフラグを設定。 //音声処理を行わないVSTはないので必ずこの関数を呼び出す。 //上記の関数を呼び出した後に初期化を行う } サンプルコードの解説 まず、1~9行目で必要なパラメータの定義を行っている。 次に12行目で継承元であるAudioEffectXのコンストラクタを呼び出し、audioMasterCallbackとプリセット数とパラメーター数を設定している。 MyMinimumVST MyMinimumVST (audioMasterCallback audioMaster) AudioEffectX (audioMaster, MY_VST_PRESET_NUM, MY_VST_PARAMETER_NUM) { audioMasterCallbackは作成するVSTの引数をそのまま渡せばよい。プリセット数とパラメーター数は作成するVSTにあわせて値を設定する。 引数 概要 audioMasterCallback audioMaster audioMasterをそのまま渡す。 VstInt32 numPrograms プリセットプログラムの数。1以上の必要がある。 VstInt32 numParams パラメータの数。0以上の必要がある。 次に自作VSTに関する音声の入力数や出力数、ユニークID等の情報を関数を呼び出すことで設定している。(18~26行目) なお、設定した情報はプログラムが終了するまで変更してはならない。 //以下の関数を呼び出して入力数、出力数等の情報を設定する。 //必ず呼び出さなければならない。 setNumInputs (MY_VST_INPUT_NUM); //入力数の設定 setNumOutputs (MY_VST_OUTPUT_NUM); //出力数の設定 setUniqueID (MY_VST_UNIQUE_ID); //ユニークIDの設定 isSynth (true); //このVSTがSynthかどうかのフラグを設定。 //Synthの場合…true、Effectorの場合…false canProcessReplacing (); //このVSTが音声処理可能かどうかのフラグを設定。 //音声処理を行わないVSTはないので必ずこの関数を呼び出す。 関数名 戻り値 引数 概要 setNumInputs なし VstInt32 inputs エフェクターの入力数の情報を設定する。ステレオの場合…2、モノラルの場合…1となる。 setNumOutputs なし VstInt32 outputs エフェクターの出力数の情報を設定する。ステレオの場合…2、モノラルの場合…1となる。 setUniqueID なし VstInt32 iD エフェクターのユニークIDを設定する。自作VSTを公開しない場合はどんな値でもよい。 isSynth なし bool state 作成するVSTがシンセかどうかを設定する。シンセの場合…True、エフェクタの場合…falseとする。 canProcessReplacing なし bool state 32ビット浮動小数点で音声処理できるか設定する。どんなVSTでも無条件で呼び出さなければならない。 自作したVST固有の変数初期化やバッファの確保等は上記関数を呼び出した後に行う。 サンプルでは以下のコメントの後に記載するとよい。 //上記の関数を呼び出した後に初期化を行う : : } 次へ 同一カテゴリのTips 項目 No. 概要 最小構成のVST No.1 最小構成の自作VSTに必要な関数等の説明。 No.2 最小構成の自作VSTの必須初期化項目について No.3 最小構成の自作VSTの音声処理関数について No.4 最小構成の自作VSTのサンプルソースコード全体
https://w.atwiki.jp/vst_prog/pages/85.html
VST Tips(準備中) 簡単な音源(VSTi)のについて ここではMIDIメッセージ処理(作成中)で作成したVSTを元に簡単な音源(VSTi)を作成する。 作成するに当たって、まずは音源の基本モデルとなるシンセサイザーの構成について記載する。 次に作成する音源(VSTi)について記載する。 なお、ここに記載している内容はシンセサイザーの用語(オシレーター、フィルター等)と三角関数についてある程度の知識があることを前提としている。 また、ここで作成するVSTiサンプルのソースコードはここにある シンセサイザーの構成 シンセサイザーの構成というと下記の図のようなシンセサイザーの音作りに関する部位がよくピックアップされる 実際にシンセサイザー(VSTi)を作成する際には上記のような音声信号に直接かかわる部位だけでなく、MIDIやオシレータ、パラメータを制御するさまざまなコントローラーが必要となる。(下記の図は参考例) 部位 説明 MIDI Controller 鍵盤やピッチベンド等からのMIDIメッセージの振り分けを行う。例:MIDI Note Onメッセージ→VoiceControllerへ転送、MIDI CC 74(ブライトネス)メッセージ→Parameter Controllerへ転送 など Voice Controller MIDI Note Onメッセージにより停止中のオシレーターを発音させたり、MIDI Note Offメッセージにより発音中のオシレータを停止させる。 Parameter Controller フィルタのカットオフ周波数の変更や、アンプリファイアのEnvelope Generatorの変更を行う Mixer 各Voice(Oscillator、Filter、Amplifierを1つにしたもの)からの出力を加算し、出力する また、上記のすべての機能をVSTiで実装する必要はない。 VSTiが処理を担当する部分、ホストアプリケーションが処理を担当する部分を示すと下記の図のようになる。 次へ 同一カテゴリのTips 項目 No. 概要
https://w.atwiki.jp/vst_prog/pages/81.html
VST Tips(準備中) VST GUIの作成 VST GUIのウィンドウが開かれるだけのサンプルです。 プロジェクトの作成時は以下のソースファイルもプロジェクトに加える必要がある。 (プロジェクトへの追加方法は「VC++ プロジェクトの準備 No.2」参照) vstcontrols.cpp vstgui.cpp aeffguieditor.cpp (vstsdk2.4\vstgui.sf\vstgui 配下に保存されている。) つまみを追加したサンプルはここ つまみをスライダーに変更したサンプルはここ サンプルコード全体 #define _CRT_SECURE_NO_DEPRECATE 1 #include stdio.h #include stdlib.h #include string.h #include math.h #include windows.h #include "audioeffectx.h"#include "vstcontrols.h" // ============================================================================================// 設計情報の記入// ============================================================================================#define MY_VST_VENDOR "test vendor" //作者(ベンダー)名#define MY_VST_VERSION 1 //このVSTバージョン#define MY_VST_PRODUCT_NAME "Sample VST GUI" //このVSTの製品名#define MY_VST_NAME "GUI" //このVSTの名前 #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を入力する。 //http //ygrabit.steinberg.de/~ygrabit/public_html/index.html #define MY_VST_PRESET_NUM 1 //プリセットプログラムの数#define MY_VST_PARAMETER_NUM 1 //パラメータの数 float midinum;// ============================================================================================// VST GUIクラス// ============================================================================================class VstGui public AEffGUIEditor, CControlListener{public VstGui (void* effect);virtual ~VstGui (); // GUIのWindowを開いたときと閉じたときに処理を行う関数virtual bool open (void *ptr);virtual void close (); // ボタンやつまみ等が動かされたときに処理を行う関数virtual void valueChanged (CDrawContext *pContext, CControl *pControl); protected }; VstGui VstGui (void* effect) AEffGUIEditor ((AudioEffect*)effect){// 継承元のにあるrect変数を初期化。// このrect変数にGUIのWindowsサイズを設定する。// (設定を行わないとWindowが開けない)rect.left = 0;rect.top = 0;rect.right = 512;rect.bottom = 256;} VstGui ~VstGui (){} void VstGui valueChanged (CDrawContext *pContext, CControl *pControl){} bool VstGui open (void *ptr){// まずは継承元の関数を呼び出す(必須)AEffGUIEditor open (ptr); // 次にフレーム(CFrame)を作成する。// ボタンやつまみ等はこのフレームの上に配置する形になる// ここではWindowと同じサイズのフレームを作成しているCRect size (rect.left, rect.top, rect.right, rect.bottom); CFrame* cframe = new CFrame (size, ptr, this);// 作成したフレームは継承元にあるframe変数に値を保存する必要がある。this- frame = cframe; // 処理に問題がなければtrueを返すreturn true;} void VstGui close (){// frameをdeleteすることを忘れないようにするif (frame){delete frame;}frame = 0;} // ============================================================================================// VSTの基本となるクラス// ============================================================================================class MyVSTGUI public AudioEffectX{public MyVSTGUI (audioMasterCallback audioMaster);~MyVSTGUI (); virtual void processReplacing (float** inputs, float** outputs, VstInt32 sampleFrames);}; // ============================================================================================// このVSTのを生成するための関数// ============================================================================================AudioEffect* createEffectInstance (audioMasterCallback audioMaster){//newでこのVSTを生成したポインタを返すreturn new MyVSTGUI (audioMaster);} // ============================================================================================// コンストラクタ、デストラクタ(VSTの初期化、終了処理を記述)// ============================================================================================MyVSTGUI MyVSTGUI (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の設定 isSynth (false); //このVSTがSynthかどうかのフラグを設定。 //Synthの場合…true、Effectorの場合…false canProcessReplacing (); //このVSTが音声処理可能かどうかのフラグを設定。 //音声処理を行わないVSTはないので必ずこの関数を呼び出す。 // GUIを設定するeditor = new VstGui(this); //このVSTのパラメータを初期化する。} MyVSTGUI ~MyVSTGUI (){//VSTの終了処理をする。//このVSTでは特に実行する処理はなし。 // GUIはdeleteしなくていいっぽい} // ============================================================================================// 音声信号を処理するメンバー関数// ============================================================================================void MyVSTGUI processReplacing (float** inputs, float** outputs, VstInt32 sampleFrames){float *inL = inputs[0]; //入力 左用float *inR = inputs[1]; //入力 右用float *outL = outputs[0]; //出力 左用float *outR = outputs[1]; //出力 右用 for (int i = 0; i sampleFrames ; i++){// 入力をそのまま出力へoutL[i] = inL[i];outR[i] = inR[i];}} VST Tipsトップページへ(準備中)
https://w.atwiki.jp/vst_prog/pages/82.html
VST Tips(準備中) VST GUIの作成 VST GUIのウィンドウが開かれるだけのサンプルにつまみを2つ追加したもの。 追加内容としては以下のとおり。 つまみクラス(Cknobクラス)へのポインターをGUIクラスの変数として定義 GUIクラスにsetParameter()関数を追加 GUIクラスのopen()関数につまみを作成するコードの追加 GUIクラスのvalueChanged()関数に操作されたつまみを特定しsetParameter()関数へ引き渡す処理の追加 GUIクラスのsetParameter()関数につまみの更新処理を追加 リソースファイルを追加する必要がある。リソースファイルの追加方法はCPPファイルを追加する方法と同じ。 なお今回つまみ用いた画像と作成したVSTは以下のとおり。(DLLファイルを利用するときはウィルスチェックをかけてください) ダウンロード サンプルコード全体 【resource.rc】 #include windows.h #include commctrl.h #include richedit.h #include "resource.h" BITMAP_KNOB_BACK BITMAP ".\\knob_back.bmp"BITMAP_KNOB_HANDLE BITMAP ".\\knob_handle.bmp" 【resource.h】 #define BITMAP_KNOB_BACK 100#define BITMAP_KNOB_HANDLE 101 【MyGuiVst2.cpp】 #define _CRT_SECURE_NO_DEPRECATE 1 #include stdio.h #include stdlib.h #include string.h #include math.h #include windows.h #include "resource.h"#include "audioeffectx.h"#include "vstcontrols.h" // ============================================================================================// 設計情報の記入// ============================================================================================#define MY_VST_VENDOR "test vendor" //作者(ベンダー)名#define MY_VST_VERSION 1 //このVSTバージョン#define MY_VST_PRODUCT_NAME "Sample VST GUI" //このVSTの製品名#define MY_VST_NAME "GUI" //このVSTの名前 #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を入力する。 //http //ygrabit.steinberg.de/~ygrabit/public_html/index.html #define MY_VST_PRESET_NUM 1 //プリセットプログラムの数#define MY_VST_PARAMETER_NUM 2 //パラメータの数 #define MYVST_VOLUME_L 0#define MYVST_VOLUME_R 1// ============================================================================================// VST GUIクラス// ============================================================================================class VstGui2 public AEffGUIEditor, CControlListener{public VstGui2 (void* effect);virtual ~VstGui2 (); // GUIのWindowを開いたときと閉じたときに処理を行う関数virtual bool open (void *ptr);virtual void close (); // ボタンやつまみ等が動かされたときに処理を行う関数virtual void valueChanged (CDrawContext *pContext, CControl *pControl);virtual void setParameter (VstInt32 index, float value); protected // ボリュームを操作するつまみCKnob* knobVolumeL;CKnob* knobVolumeR;}; VstGui2 VstGui2 (void* effect) AEffGUIEditor ((AudioEffect*)effect){// 継承元のにあるrect変数を初期化。// このrect変数にGUIのWindowsサイズを設定する。// (設定を行わないとWindowが開けない)rect.left = 0;rect.top = 0;rect.right = 512;rect.bottom = 256; // VstGui2クラス固有の初期化を行うknobVolumeL = 0;knobVolumeR = 0;} VstGui2 ~VstGui2 (){} void VstGui2 valueChanged (CDrawContext *pContext, CControl *pControl){// どのパラメーターが操作されたかを取得する。VstInt32 index = pControl- getTag(); // パラメーターの値を取得する。float value = pControl- getValue (); // 取得した値をパラメーターに反映させるthis- setParameter(index, value);} void VstGui2 setParameter (VstInt32 index, float value){switch (index){case MYVST_VOLUME_L // つまみに値を設定し、画面を更新する(描画させる。)knobVolumeL- setValue (value); // MyVstGui2(AudioEffectXを継承して作ったクラス)に// 操作されたパラメーターを通知して更新させる// (setParameterAutomatedは内部でsetParameterを呼び出す)effect- setParameterAutomated(index, value);break; case MYVST_VOLUME_R // MYVST_VOLUME_Lの処理とほぼ同様knobVolumeR- setValue (value);effect- setParameterAutomated(index, value);break; default break;}} bool VstGui2 open (void *ptr){// まずは継承元の関数を呼び出す(必須)AEffGUIEditor open (ptr); // 次にフレーム(CFrame)を作成する。// ボタンやつまみ等はこのフレームの上に配置する形になる// ここではWindowと同じサイズのフレームを作成しているCRect size (rect.left, rect.top, rect.right, rect.bottom); CFrame* cframe = new CFrame (size, ptr, this);// 作成したフレームは継承元にあるframe変数に値を保存する必要がある。this- frame = cframe; // -----------------------------------------------------------------// つまみを作成する。// つまみ用の画像をリソースから読み込みCBitmap *KnobBack = new CBitmap (BITMAP_KNOB_BACK);CBitmap *KnobHandle = new CBitmap (BITMAP_KNOB_HANDLE); // つまみの大きさを設定 CRect knobsize (0, 0, KnobBack- getWidth (), KnobBack- getHeight ()); // つまみの位置を設定knobsize.offset (16, 16); // つまみ画像をどこから表示するかの設定。基本的に0, 0でよいはず。CPoint point (0, 0); knobVolumeL = new CKnob (knobsize, this, MYVST_VOLUME_L, KnobBack, KnobHandle, point);// つまみの中心とハンドルまでの長さknobVolumeL- setInsetValue (7);// 現在のボリュームをMyVstGui2(AudioEffectXを継承して作ったクラス)から取得するknobVolumeL- setValue(effect- getParameter(MYVST_VOLUME_L));// つまみをframeに追加するframe- addView (knobVolumeL); // knobVolumeLとほぼ同様knobsize (0, 0, KnobBack- getWidth (), KnobBack- getHeight ());knobsize.offset (64, 16);knobVolumeR = new CKnob (knobsize, this, MYVST_VOLUME_R, KnobBack, KnobHandle, point);knobVolumeR- setInsetValue (7);knobVolumeR- setValue(effect- getParameter(MYVST_VOLUME_R));frame- addView (knobVolumeR); // つまみ用の画像を解放するKnobBack- forget();KnobHandle- forget(); // 処理に問題がなければtrueを返すreturn true;} void VstGui2 close (){// frameをdeleteすることを忘れないようにするif (frame){delete frame;}frame = 0;} // ============================================================================================// VSTの基本となるクラス// ============================================================================================class MyVstGui2 public AudioEffectX{public MyVstGui2 (audioMasterCallback audioMaster);~MyVstGui2 (); // エフェクターのパラメータに関するメンバー関数virtual void setParameter (VstInt32 index, float value); // 音声信号を処理するメンバー関数virtual void processReplacing (float** inputs, float** outputs, VstInt32 sampleFrames); protected float volumeL;float volumeR;}; // ============================================================================================// このVSTのを生成するための関数// ============================================================================================AudioEffect* createEffectInstance (audioMasterCallback audioMaster){//newでこのVSTを生成したポインタを返すreturn new MyVstGui2 (audioMaster);} // ============================================================================================// コンストラクタ、デストラクタ(VSTの初期化、終了処理を記述)// ============================================================================================MyVstGui2 MyVstGui2 (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の設定 isSynth (false); //このVSTがSynthかどうかのフラグを設定。 //Synthの場合…true、Effectorの場合…false canProcessReplacing (); //このVSTが音声処理可能かどうかのフラグを設定。 //音声処理を行わないVSTはないので必ずこの関数を呼び出す。 // GUIを設定するeditor = new VstGui2(this); //このVSTのパラメータを初期化する。volumeL = 0.0f;volumeR = 0.0f;} MyVstGui2 ~MyVstGui2 (){//VSTの終了処理をする。//このVSTでは特に実行する処理はなし。 // GUIはdeleteしなくていいっぽい} void MyVstGui2 setParameter (VstInt32 index, float value){switch (index){case MYVST_VOLUME_L volumeL = value;break; case MYVST_VOLUME_R volumeR = value;break; default break;}} // ============================================================================================// 音声信号を処理するメンバー関数// ============================================================================================void MyVstGui2 processReplacing (float** inputs, float** outputs, VstInt32 sampleFrames){float *inL = inputs[0]; //入力 左用float *inR = inputs[1]; //入力 右用float *outL = outputs[0]; //出力 左用float *outR = outputs[1]; //出力 右用 for (int i = 0; i sampleFrames ; i++){// 入力をそのまま出力へoutL[i] = volumeL * inL[i];outR[i] = volumeR * inR[i];}} VST Tipsトップページへ(準備中)
https://w.atwiki.jp/vst_prog/pages/92.html
トップページ VST GUIの作成 VST GUIのウィンドウが開かれるだけのサンプルにテキストラベルを追加したもの。 追加内容としては以下のとおり。 テキストラベルクラスCTextLabelクラス)へのポインターをGUIクラスの変数として定義 GUIクラスのopen()関数にテキストラベルを作成するコードの追加 なお作成したVSTは以下のとおり。(DLLファイルを利用するときはウィルスチェックをかけてください) ダウンロード サンプルコード全体 【MyGuiVst2.cpp】 #define _CRT_SECURE_NO_DEPRECATE 1 #include stdio.h #include stdlib.h #include string.h #include math.h #include windows.h #include "audioeffectx.h"#include "vstcontrols.h" // ============================================================================================// 設計情報の記入// ============================================================================================#define MY_VST_VENDOR "test vendor" //作者(ベンダー)名#define MY_VST_VERSION 1 //このVSTバージョン#define MY_VST_PRODUCT_NAME "Sample VST GUI" //このVSTの製品名#define MY_VST_NAME "GUI" //このVSTの名前 #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を入力する。 //http //ygrabit.steinberg.de/~ygrabit/public_html/index.html #define MY_VST_PRESET_NUM 1 //プリセットプログラムの数#define MY_VST_PARAMETER_NUM 2 //パラメータの数 #define MYVST_VOLUME_L 0#define MYVST_VOLUME_R 1// ============================================================================================// VST GUIクラス// ============================================================================================class VstGui4 public AEffGUIEditor, CControlListener{public VstGui4 (void* effect);virtual ~VstGui4 (); // GUIのWindowを開いたときと閉じたときに処理を行う関数virtual bool open (void *ptr);virtual void close (); // ボタンやつまみ等が動かされたときに処理を行う関数// 今回はテキストラベルのみのため、処理すべきことはないが、// valueChanged()関数は必ずオーバーライドしなければならない。virtual void valueChanged (CDrawContext *pContext, CControl *pControl) {}; protected // テキストラベルCTextLabel* textLabel;}; VstGui4 VstGui4 (void* effect) AEffGUIEditor ((AudioEffect*)effect){// 継承元のにあるrect変数を初期化。// このrect変数にGUIのWindowsサイズを設定する。// (設定を行わないとWindowが開けない)rect.left = 0;rect.top = 0;rect.right = 512;rect.bottom = 256;} VstGui4 ~VstGui4 (){} bool VstGui4 open (void *ptr){// まずは継承元の関数を呼び出す(必須)AEffGUIEditor open (ptr); // 次にフレーム(CFrame)を作成する。// ボタンやつまみ等はこのフレームの上に配置する形になる// ここではWindowと同じサイズのフレームを作成しているCRect size (rect.left, rect.top, rect.right, rect.bottom); CFrame* cframe = new CFrame (size, ptr, this);// 作成したフレームは継承元にあるframe変数に値を保存する必要がある。this- frame = cframe; // -----------------------------------------------------------------// テキストラベルの大きさを設定 CRect textsize (0, 0, 80, 25); // テキストラベルの位置を設定textsize.offset (16, 16); // テキストラベルを作成textLabel = new CTextLabel(textsize, "TextLabel", NULL, kLeft); // テキストラベルをframeに追加するframe- addView (textLabel); // 処理に問題がなければtrueを返すreturn true;} void VstGui4 close (){// frameをdeleteすることを忘れないようにするif (frame){delete frame;}frame = 0;} // ============================================================================================// VSTの基本となるクラス// ============================================================================================class MyVstGui4 public AudioEffectX{public MyVstGui4 (audioMasterCallback audioMaster);~MyVstGui4 (); // 音声信号を処理するメンバー関数virtual void processReplacing (float** inputs, float** outputs, VstInt32 sampleFrames);}; // ============================================================================================// このVSTのを生成するための関数// ============================================================================================AudioEffect* createEffectInstance (audioMasterCallback audioMaster){//newでこのVSTを生成したポインタを返すreturn new MyVstGui4 (audioMaster);} // ============================================================================================// コンストラクタ、デストラクタ(VSTの初期化、終了処理を記述)// ============================================================================================MyVstGui4 MyVstGui4 (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の設定 isSynth (false); //このVSTがSynthかどうかのフラグを設定。 //Synthの場合…true、Effectorの場合…false canProcessReplacing (); //このVSTが音声処理可能かどうかのフラグを設定。 //音声処理を行わないVSTはないので必ずこの関数を呼び出す。 // GUIを設定するeditor = new VstGui4(this); //このVSTのパラメータを初期化する。} MyVstGui4 ~MyVstGui4 (){//VSTの終了処理をする。//このVSTでは特に実行する処理はなし。 // GUIはdeleteしなくていいっぽい} // ============================================================================================// 音声信号を処理するメンバー関数// ============================================================================================void MyVstGui4 processReplacing (float** inputs, float** outputs, VstInt32 sampleFrames){float *inL = inputs[0]; //入力 左用float *inR = inputs[1]; //入力 右用float *outL = outputs[0]; //出力 左用float *outR = outputs[1]; //出力 右用 for (int i = 0; i sampleFrames ; i++){// 入力をそのまま出力へoutL[i] = inL[i];outR[i] = inR[i];}} VST Tipsトップページへ(準備中)
https://w.atwiki.jp/vst_prog/pages/23.html
Steinberg VST Audio Plug-Ins SDK 2.4のインストール方法(2010年4月14日) Steinberg VST Audio Plug-Ins SDK 2.4のダウンロード Steinberg 開発者ページへ移動 再度、下記URLへアクセスする。 URL http //www.steinberg.net/en/company/3rd_party_developer.html ページ左にある「SDK Download Portal」をクリックする。 Steinberg 開発者ページへログイン 登録したユーザとパスワードを入力し、「Login」をクリックする。 「You are now logged in as ユーザ名 」 と表示されるとログイン完了。 VST Audio Plug-Ins SDK(Version2.4)ダウンロードページへ移動 ページ左にある「VST2.4 Audio Plug-Ins SDK」をクリックする。 開いたページで「I agree to the license agreement」にチェックをいれ、「Download VST 2.4 Audio Plug-ins SDK」をクリックする。 VST Audio Plug-Ins SDK(Version2.4)のダウンロード 開いたページで「VST 2.4 Audio Plug-Ins SDK(Format zip, 6.74 MB)」をクリックする。 ダウンロード先フォルダを選択して、ダウンロードする。 ダウンロードされたファイルの解凍 ダウンロードされたファイルを解凍する。 解凍したフォルダを「C \」に移動させる。 (解凍したフォルダはどの場所でよいが、説明のためC \とする) 次へ 合計: - 今日: - 昨日: -
https://w.atwiki.jp/vst_prog/pages/21.html
Steinberg VST Audio Plug-Ins SDK 2.4のインストール方法(2010年4月14日) 手順概要 Steinberg VST Audio Plug-Ins SDKのインストールは大きく以下の手順で行う Steinberg 開発者アカウントの作成 Steinberg VST Audio Plug-Ins SDK 2.4のダウンロード Visual C++へのパス追加 次へ 合計: - 今日: - 昨日: -
https://w.atwiki.jp/vst_prog/pages/83.html
VST Tips(準備中) VST GUIの作成 つまみだけのVST GUIのつまみをスライダーに変更したもの スライダークラス(CSliderクラス)へのポインターをGUIクラスの変数として定義 GUIクラスのopen()関数にスライダーを作成するコードの追加 なお今回スライダー用の画像と作成したVSTは以下のとおり。(DLLファイルを利用するときはウィルスチェックをかけてください) ダウンロード サンプルコード全体 【resource.rc】 #include windows.h #include commctrl.h #include richedit.h #include "resource.h" BITMAP_SLIDER_BACK BITMAP ".\\slider_back.bmp"BITMAP_SLIDER_HANDLE BITMAP ".\\slider_handle.bmp" 【resource.h】 #define BITMAP_SLIDER_BACK 100#define BITMAP_SLIDER_HANDLE 101 【MyGuiVst2.cpp】 #define _CRT_SECURE_NO_DEPRECATE 1 #include stdio.h #include stdlib.h #include string.h #include math.h #include windows.h #include "resource.h"#include "audioeffectx.h"#include "vstcontrols.h" // ============================================================================================// 設計情報の記入// ============================================================================================#define MY_VST_VENDOR "test vendor" //作者(ベンダー)名#define MY_VST_VERSION 1 //このVSTバージョン#define MY_VST_PRODUCT_NAME "Sample VST GUI" //このVSTの製品名#define MY_VST_NAME "GUI" //このVSTの名前 #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を入力する。 //http //ygrabit.steinberg.de/~ygrabit/public_html/index.html #define MY_VST_PRESET_NUM 1 //プリセットプログラムの数#define MY_VST_PARAMETER_NUM 2 //パラメータの数 #define MYVST_VOLUME_L 0#define MYVST_VOLUME_R 1// ============================================================================================// VST GUIクラス// ============================================================================================class VstGui3 public AEffGUIEditor, CControlListener{public VstGui3 (void* effect);virtual ~VstGui3 (); // GUIのWindowを開いたときと閉じたときに処理を行う関数virtual bool open (void *ptr);virtual void close (); // ボタンやつまみ等が動かされたときに処理を行う関数virtual void valueChanged (CDrawContext *pContext, CControl *pControl);virtual void setParameter (VstInt32 index, float value); protected // ボリュームを操作するスライダーCSlider* sliderVolumeL;CSlider* sliderVolumeR;}; VstGui3 VstGui3 (void* effect) AEffGUIEditor ((AudioEffect*)effect){// 継承元のにあるrect変数を初期化。// このrect変数にGUIのWindowsサイズを設定する。// (設定を行わないとWindowが開けない)rect.left = 0;rect.top = 0;rect.right = 512;rect.bottom = 256; // VstGui3クラス固有の初期化を行うsliderVolumeL = 0;sliderVolumeR = 0;} VstGui3 ~VstGui3 (){} void VstGui3 valueChanged (CDrawContext *pContext, CControl *pControl){// どのパラメーターが操作されたかを取得する。VstInt32 index = pControl- getTag(); // パラメーターの値を取得する。float value = pControl- getValue (); // 取得した値をパラメーターに反映させるthis- setParameter(index, value);} void VstGui3 setParameter (VstInt32 index, float value){switch (index){case MYVST_VOLUME_L // スライダーに値を設定し、画面を更新する(描画させる。)sliderVolumeL- setValue (value); // MyVstGui3(AudioEffectXを継承して作ったクラス)に// 操作されたパラメーターを通知して更新させる// (setParameterAutomatedは内部でsetParameterを呼び出す)effect- setParameterAutomated(index, value);break; case MYVST_VOLUME_R // MYVST_VOLUME_Lの処理とほぼ同様sliderVolumeR- setValue (value);effect- setParameterAutomated(index, value);break; default break;}} bool VstGui3 open (void *ptr){// まずは継承元の関数を呼び出す(必須)AEffGUIEditor open (ptr); // 次にフレーム(CFrame)を作成する。// ボタンやつまみ等はこのフレームの上に配置する形になる// ここではWindowと同じサイズのフレームを作成しているCRect size (rect.left, rect.top, rect.right, rect.bottom); CFrame* cframe = new CFrame (size, ptr, this);// 作成したフレームは継承元にあるframe変数に値を保存する必要がある。this- frame = cframe; // -----------------------------------------------------------------// スライダーを作成する。// スライダー用の画像をリソースから読み込みCBitmap *sliderBack = new CBitmap (BITMAP_SLIDER_BACK);CBitmap *sliderHandle = new CBitmap (BITMAP_SLIDER_HANDLE); // スライダーの大きさを設定 CRect slidersize (0, 0, sliderBack- getWidth (), sliderBack- getHeight ()); // スライダーの位置を設定slidersize.offset (16, 16); // スライダー画像をどこから表示するかの設定。基本的に0, 0でよいはず。CPoint point (0, 0); // スライダーのハンドルの下限位置と上限位置を計算int minpos = slidersize.top;int maxpos = slidersize.top + sliderBack- getHeight () - sliderHandle- getHeight (); // 縦方向(下限位置が0.0、上限位置が1.0)のスライダーを作成する。sliderVolumeL = new CSlider (slidersize, this, MYVST_VOLUME_L, minpos, maxpos, sliderHandle, sliderBack, point, kBottom | kVertical);// 現在のボリュームをMyVstGui3(AudioEffectXを継承して作ったクラス)から取得するsliderVolumeL- setValue(effect- getParameter(MYVST_VOLUME_L));// スライダーをframeに追加するframe- addView (sliderVolumeL); // sliderVolumeLとほぼ同様slidersize (0, 0, sliderBack- getWidth (), sliderBack- getHeight ());slidersize.offset (64, 16);minpos = slidersize.top;maxpos = slidersize.top + sliderBack- getHeight () - sliderHandle- getHeight ();sliderVolumeR = new CSlider (slidersize, this, MYVST_VOLUME_R, minpos, maxpos, sliderHandle, sliderBack, point, kBottom | kVertical);sliderVolumeR- setValue(effect- getParameter(MYVST_VOLUME_R));frame- addView (sliderVolumeR); // スライダー用の画像を解放するsliderBack- forget();sliderHandle- forget(); // 処理に問題がなければtrueを返すreturn true;} void VstGui3 close (){// frameをdeleteすることを忘れないようにするif (frame){delete frame;}frame = 0;} // ============================================================================================// VSTの基本となるクラス// ============================================================================================class MyVstGui3 public AudioEffectX{public MyVstGui3 (audioMasterCallback audioMaster);~MyVstGui3 (); // エフェクターのパラメータに関するメンバー関数virtual void setParameter (VstInt32 index, float value); // 音声信号を処理するメンバー関数virtual void processReplacing (float** inputs, float** outputs, VstInt32 sampleFrames); protected float volumeL;float volumeR;}; // ============================================================================================// このVSTのを生成するための関数// ============================================================================================AudioEffect* createEffectInstance (audioMasterCallback audioMaster){//newでこのVSTを生成したポインタを返すreturn new MyVstGui3 (audioMaster);} // ============================================================================================// コンストラクタ、デストラクタ(VSTの初期化、終了処理を記述)// ============================================================================================MyVstGui3 MyVstGui3 (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の設定 isSynth (false); //このVSTがSynthかどうかのフラグを設定。 //Synthの場合…true、Effectorの場合…false canProcessReplacing (); //このVSTが音声処理可能かどうかのフラグを設定。 //音声処理を行わないVSTはないので必ずこの関数を呼び出す。 // GUIを設定するeditor = new VstGui3(this); //このVSTのパラメータを初期化する。volumeL = 0.0f;volumeR = 0.0f;} MyVstGui3 ~MyVstGui3 (){//VSTの終了処理をする。//このVSTでは特に実行する処理はなし。 // GUIはdeleteしなくていいっぽい} void MyVstGui3 setParameter (VstInt32 index, float value){switch (index){case MYVST_VOLUME_L volumeL = value;break; case MYVST_VOLUME_R volumeR = value;break; default break;}} // ============================================================================================// 音声信号を処理するメンバー関数// ============================================================================================void MyVstGui3 processReplacing (float** inputs, float** outputs, VstInt32 sampleFrames){float *inL = inputs[0]; //入力 左用float *inR = inputs[1]; //入力 右用float *outL = outputs[0]; //出力 左用float *outR = outputs[1]; //出力 右用 for (int i = 0; i sampleFrames ; i++){// 入力をそのまま出力へoutL[i] = volumeL * inL[i];outR[i] = volumeR * inR[i];}} VST Tipsトップページへ(準備中)
https://w.atwiki.jp/vst_prog/pages/75.html
トップページ MIDIメッセージを処理するVSTについて ここでは最小構成のVSTで作成したVSTを基にMIDIメッセージにあわせて動作するVSTを作成する。 作成するVSTはロードされると常にノイズを発生させる(音量注意)。このノイズのボリュームをMIDI CC7でコントロールできるVSTを作成する。 最小構成のVSTのソースコード全体はここにある。 MIDIメッセージを処理するに当たって最小構成のVSTに以下の追加を行う。 受け取ったMIDIメッセージを確保するための変数の追加 ホストアプリケーション(Cubase,Sonar等)からのMIDIメッセージを上記変数に保存するprocessEvents()関数の追加 processReplacing()関数内に受け取ったMIDIメッセージを処理するコードの追加 なお、ここに記載している内容についてはMIDIメッセージについてある程度の知識があることを前提としている。 また、ここで作成するVSTサンプルのソースコード全体はここにある。 MIDIメッセージ用の構造体の定義 まず始めにMIDIメッセージ用の構造体を定義する。 MIDIメッセージ用の構造体ではMIDIメッセージ・チャンネル番号・MIDIデータ1・MIDIデータ2に加え、MIDIメッセージの処理タイミングを示すVstInt32型の変数を定義するとよい。 (MIDIメッセージの処理タイミングを示すVstInt32型の変数の詳細は後述。) 具体的には以下のようになる。 struct MidiMessage{VstInt32 deltaFrames; //MIDIメッセージを処理するタイミングunsigned char message; //MIDIメッセージ番号unsigned char channel; //MIDIチャンネルunsigned char data1; //MIDIデータ1unsigned char data2; //MIDIデータ2}; VSTのクラス定義 続いてVSTの基本となるクラスを作成する。 最小構成のVSTに、先ほど定義したMidiMessage型のバッファとホストアプリケーションからMIDIメッセージを受け取るためのprocessEvents()関数を追加で定義する。 具体的には以下のようになる。 #define MIDIMSG_MAXNUM 255 class MyMidiSampleVST public AudioEffectX{protected int midimsgnum; //受け取ったMIDIメッセージの数MidiMessage midimsgbuf[MIDIMSG_MAXNUM]; //受け取ったMIDIメッセージを保管するバッファ // ノイズのボリュームfloat volume;public MyMidiSampleVST (audioMasterCallback audioMaster); // 音声信号を処理するメンバー関数virtual void processReplacing (float** inputs, float** outputs, VstInt32 sampleFrames); // MIDIメッセージをホストアプリケーションから受け取るためのメンバー関数VstInt32 processEvents (VstEvents* events);}; 次へ 同一カテゴリのTips 項目 No. 概要 MIDIメッセージ処理 No.1 MIDIメッセージ処理で最小構成の自作VSTに追加する変数・関数 No.2 VSTの初期化とMIDIメッセージ処理関連の変数の初期化 No.3 ホストアプリケーションからMIDIメッセージを受け取る方法 No.4 MIDIメッセージをprocessReplacing()関数中で処理する方法 No.5 MIDIメッセージ処理で作成したVSTのサンプルソースコード全体(暫定版)