約 2,010,455 件
https://w.atwiki.jp/vst_prog/pages/26.html
VST(エフェクター)作り概要 エフェクター設計 VST基本情報の決定 エフェクターを設計する前に以下の項目を決めておく必要がある。 項目 説明 例 作者(ベンダー)名 作成した人や会社の名前半角英数63文字以内 VSTバージョン 作成するVSTのバージョン(32ビット整数で表せるように) 1.0.0 (32ビット整数で100にする)120100401 等 VSTの製品名 VSTの製品名半角英数63文字以内 DelayDistortion 等 VSTの名前 VSTの名前。半角英数31文字以内 (VSTの製品名と何が違うのかは不明。文字数に問題がなければVSTの製品名と同じでよい。) 入力の数 エフェクターの入力の数 モノラルの場合…1ステレオの場合…2 出力の数 エフェクターの出力の数 モノラルの場合…1ステレオの場合…2 ユニークID VSTを区別するためのID作成したVSTを公開する場合は以下URLで登録を行い、発行されたユニークIDを入力する。http //ygrabit.steinberg.de/~ygrabit/public_html/index.html プリセットの数 プリセットプログラムの数 以下のプリセットプログラムを持つディレイの場合…3- Long Delay- Short Delay- Cross Delay パラメータの数 Hostプログラム(Cubase、Sonarなど)がコントロールできるパラメータの数(パラメーターに関してはさらに設計の必要がある(後述)) 以下のパラメータを持つディレイの場合…4- Delay Type- Delay Time- Feedback Level- Delay Level パラメーター情報の決定 各パラメーターごとに以下の項目を決めておく必要がある 項目 説明 パラメーター名 パラメーターの名前半角英数8文字 表示方法 パラメーターの値をどう表示するか(整数で表示するのか?文字列で表示するのか? 等)半角英数8文字 単位 パラメーターの単位半角英数8文字 範囲 パラメータのとりうる範囲 デフォルト値 パラメータのデフォルトの値 例:Delayの場合 No. パラメーター名 表示方法 単位 範囲 デフォルト値 0 Type ディレイタイプ(文字列) なし mono,stereo,cross stereo 1 Time ディレイタイム(小数点表示) ms 100~1000 500 2 Feedback フィードバック量(小数点表示) % 0~100 30 3 Level 出力音量(小数点表示) % 0~100 25 その他設計 作成するVSTにあわせて、アルゴリズムや内部変数等の設計を行う。 例: どのようなアルゴリズムで実装するか? 内部で使用する変数はどうするか? 等 次へ 合計: - 今日: - 昨日: -
https://w.atwiki.jp/vst_prog/pages/45.html
VST(エフェクター)作成例 音声処理 音声の処理 入力音声信号を加工して出力する関数を作成する。 processReplacing関数について 入力音声信号の加工と出力はprocessReplacing関数で行われる。 processReplacing関数の引数は3つあり、以下のようになっている。 引数 説明 float** inputs 入力音声信号のバッファ。2次元配列で渡される。1次元目の大きさはVSTの初期化時にsetNumInputsで指定したサイズ。2次元目の大きさは後述のsampleFramesとなる。書き込まれている音声信号は-1.0~+1.0の範囲 float** outputs 出力音声信号のバッファ。2次元配列で渡される。1次元目の大きさはVSTの初期化時にsetNumOutputsで指定したサイズ。2次元目の大きさは後述のsampleFramesとなる音声信号は-1.0~+1.0の範囲で書き込まなければならない。 VstInt32 sampleFrames 入力音声信号、出力音声信号のバッファサイズ processReplacing関数ではinputsの音声信号を加工した値をoutputsに代入すればよい。 サンプルエフェクターの処理内容 サンプルエフェクターでは次のようにしている。 void MyTremoloVST processReplacing (float** inputs, float** outputs, VstInt32 sampleFrames){//入力、出力は2次元配列で渡される。//入力は-1.0f~1.0fの間で渡される。//出力は-1.0f~1.0fの間で書き込む必要がある。//sampleFramesが処理するバッファのサイズfloat* inL = inputs[0]; //入力 左用float* inR = inputs[1]; //入力 右用float* outL = outputs[0]; //出力 左用float* outR = outputs[1]; //出力 右用 float dt = 1.0f / getSampleRate (); //1フレームで進む秒数float pi = 3.14159265f; //円周率 while (sampleFrames = 0){//ここで音声処理を行う。 //dt分時間を進める。//トレモロ周期を超えた場合は、周期分戻す。fTime = fTime + dt;if (fTime fTremoloSpeed){fTime -= fTremoloSpeed;} //出力バッファへ書き込む。(*outL) = (*inL) * ( 1.0f - fTremoloDepth * (0.5f + 0.5f*sin(2.0f*pi*fTime/fTremoloSpeed)));(*outR) = (*inR) * ( 1.0f - fTremoloDepth * (0.5f + 0.5f*sin(2.0f*pi*fTime/fTremoloSpeed))); inL++;inR++;outL++;outR++;sampleFrames--;} } まず、引数は以下のようになっている。 inputs[MY_VST_INPUT_NUM][sampleFrames] //MY_VST_INPUT_NUM=2 outputs[MY_VST_OUTPUT_NUM][sampleFrames] //MY_VST_OUTPUT_NUM=2 (VSTの初期化時にsetNuminputs(MY_VST_INPUT_NUM)、setNumOutputs(MY_VST_OUTPUT_NUM)としているため。「MY_VST_INPUT_NUM」 「MY_VST_OUTPUT_NUM」の詳細は宣言部に記載。) 上記引数をわかりやすいよう、サンプルエフェクターでは入力音声信号・出力音声信号ともにチャンネルごとに別の変数へ代入している。 float* inL = inputs[0]; //入力 左用 float* inR = inputs[1]; //入力 右用 float* outL = outputs[0]; //出力 左用 float* outR = outputs[1]; //出力 右用 次に音声処理で使用するローカル変数も定義・設定している。 float dt = 1.0f / getSampleRate (); //1フレームで進む秒数 float pi = 3.14159265f; //円周率 (getSampleRate関数は継承元クラス(AudioEffect)のメンバー関数。ホストアプリケーションで設定されているサンプルレートを返す。多くの場合44100が返されると思われる。) 最後に、出力音声信号をoutputsに代入するため、sampleFrames分処理するループ(while分)を作成する。 while (sampleFrames = 0) { //ここで音声処理を行う。 } ループ内ではまずトレモロ用の経過時間(fTime)を更新している。 fTime = fTime + dt; if (fTime fTremoloSpeed) { fTime -= fTremoloSpeed; } 次に入力音声信号バッファにトレモロの現在のボリュームを掛け合わせたものを出力音声信号バッファに代入してる。 //出力バッファへ書き込む。 (*outL) = (*inL) * ( 1.0f - fTremoloDepth * (0.5f + 0.5f*sin(2.0f*pi*fTime/fTremoloSpeed))); (*outR) = (*inR) * ( 1.0f - fTremoloDepth * (0.5f + 0.5f*sin(2.0f*pi*fTime/fTremoloSpeed))); (sin()関数の戻り値は-1.0~1.0のため、0.5倍し0.5を足すことで0~1.0の範囲にしている。) 最後に入力・出力音声信号のバッファのポインタ位置を1つ進め、sampleFramesの値を一つ減らしている。 inL++; inR++; outL++; outR++; sampleFrames--; 次へ 合計: - 今日: - 昨日: -
https://w.atwiki.jp/vst_prog/pages/34.html
VST(エフェクター)作成例 VST SDKのCPPファイルの追加 VSTエフェクターを作るうえで必要なVST SDKのCPPファイルをプロジェクトに追加する。 プロジェクトに必要なVST SDKのCPPファイルは以下のとおりである。 audioeffect.cpp audioeffectx.cpp vstplugmain.cpp 既存の項目の追加 画面右側のソリューションエクスプローラで「リソースファイル」を選択し、右クリックを押す。 開いたポップアップメニューで「追加」→「既存の項目」を選択する。 追加するファイルの選択 vstsdk2.4\public.sdk\source\vst2.xの配下にある以下3つのファイルを選択し、「追加」を押す。 audioeffect.cpp audioeffectx.cpp vstplugmain.cpp 「リソースファイル」の配下に3つのファイルが追加されれば完了。 次へ 合計: - 今日: - 昨日: -
https://w.atwiki.jp/vst_prog/pages/32.html
VST(エフェクター)作成例 エフェクターの設計 サンプルエフェクターを作成するにあたり、基本情報やパラメーター情報を決定しておく。 今回作成するサンプルエフェクターについては以下の情報を持つものとする。 VST基本情報 項目 サンプルエフェクターに設定する値 備考 作者(ベンダー)名 test vendor VSTバージョン 1 VSTの製品名 Sample Tremolo VST VSTの名前 Tremolo 入力の数 2 出力の数 2 ユニークID SMPL VSTを公開しないので適当な値を入力している。公開する場合は以下で登録を行う。http //ygrabit.steinberg.de/~ygrabit/public_html/index.html プリセットの数 1 パラメータの数 2 パラメーター情報 No. パラメーター名 表示方法 単位 範囲 デフォルト値 0 Speed トレモロのスピード(小数点表示) Hz 1.0~30.0 4.0 1 Depth トレモロの深さ(小数点表示) なし 0.0~1.0 0.5 次へ 合計: - 今日: - 昨日: -
https://w.atwiki.jp/vst_prog/pages/57.html
VSTエフェクタ作成例 Tips VST Tipsトップページ(準備中) Effector Tipsトップページ 同一カテゴリのTips VST作成にあたって その他 リンク 管理者へのメール テストページ ここを編集
https://w.atwiki.jp/vst_prog/pages/44.html
VST(エフェクター)作成例 VSTパラメーターの処理 ホストアプリケーション(Cubase,Sonar等)がVSTのパラメーターを変更、表示するための関数を作成する。 パラメーターの値の設定 ホストアプリケーション(Cubase,Sonar等)が作成したVSTにパラメータを設定するための関数。 引数のVstInt32 indexはパラメーターの番号。float valueは与えられたパラメーター。 float valueは0.0~1.0の範囲で与えられるため、作成するVSTで利用する範囲に変換する必要がある。 サンプルエフェクターでは以下のように処理している。 index 変更する変数 変更内容 TREMOLO_SPEED(=1 宣言部で定義済み。) fTremoloSpeed トレモロのスピードを変更。0.0~1.0の範囲で与えられたvalueを1秒~30秒(1Hz~30Hz)に変更し代入する。 TREMOLO_DEPTH(=2 宣言部で定義済み。) fTremoloDepth トレモロの深さを変更。valueの値をそのまま代入。 void MyTremoloVST setParameter (VstInt32 index, float value){//indexで指定されたパラメータに値を設定する。//valueは0.0f~1.0fで与えられる。switch (index){case TREMOLO_SPEED fTremoloSpeed = 1.0f / (29.0f*value +1.0f); //1秒~1/30秒の範囲にするbreak;case TREMOLO_DEPTH fTremoloDepth = value;break;}} パラメーターの値の通知 作成したVSTのパラメーターの現在の値をホストアプリケーション(Cubase,Sonar等)に通知するための関数。 引数のVstInt32 indexで指定されたパラメーターの値を返す関数を作成しなければならない。 また返す値は0.0~1.0の範囲にする必要がある。 サンプルエフェクターでは以下のように処理している。 index 返す値の内容 TREMOLO_SPEED(=1 宣言部で定義済み。) トレモロのスピードを返す。1秒~30秒(1Hz~30Hz)に設定されたfTremoloSpeedを0.0~1.0の範囲にして返す TREMOLO_DEPTH(=2 宣言部で定義済み。) トレモロの深さを変更。fTremoloDepthの値をそのまま返す。 float MyTremoloVST getParameter (VstInt32 index){//indexで指定されたパラメータの値を//0.0f~1.0fの範囲で返すfloat value = 0.0f;switch (index){case TREMOLO_SPEED value = (1 / fTremoloSpeed - 1.0f) / 29.0f; //1秒~1/30秒を0.0f~1.0fの範囲にするbreak;case TREMOLO_DEPTH value = fTremoloDepth;break;}return value;} パラメーター名の通知 作成したVSTのパラメーターの名前をホストアプリケーション(Cubase,Sonar等)に通知するための関数。 引数のVstInt32 indexで指定されたパラメーターの名前をchar* textに格納する関数を作成しなければならない。 引数のchar* textは8バイト。NULL文字で終端させる必要がある。 サンプルエフェクターでは以下のように処理している。 void MyTremoloVST getParameterName (VstInt32 index, char* text){//indexで指定されたパラメータの名前をtextに格納する//kVstMaxParamStrLenは「vstsdk2.4\pluginterfaces\vst2.x\aeffect.h」に//定義されている。(kVstMaxParamStrLen = 8)switch (index){case TREMOLO_SPEED vst_strncpy (text, "Speed", kVstMaxParamStrLen);break;case TREMOLO_DEPTH vst_strncpy (text, "Depth", kVstMaxParamStrLen);break;}} パラメーターの単位の通知 作成したVSTのパラメーターの単位をホストアプリケーション(Cubase,Sonar等)に通知するための関数。 引数のVstInt32 indexで指定されたパラメーターの単位をchar* labelに格納する関数を作成しなければならない。 引数のchar* labelは8バイト。NULL文字で終端させる必要がある。 サンプルエフェクターでは以下のように処理している。 void MyTremoloVST getParameterLabel (VstInt32 index, char* label){//indexで指定されたパラメータの単位をlabelに格納する//kVstMaxParamStrLenは「vstsdk2.4\pluginterfaces\vst2.x\aeffect.h」に//定義されている。(kVstMaxParamStrLen = 8)switch (index){case TREMOLO_SPEED vst_strncpy (label, "Hz", kVstMaxParamStrLen);break;case TREMOLO_DEPTH vst_strncpy (label, "dB", kVstMaxParamStrLen);break;}} パラメーターの単位の通知 作成したVSTのパラメーターの表示内容をホストアプリケーション(Cubase,Sonar等)に通知するための関数。 引数のVstInt32 indexで指定されたパラメーターの表示内容をchar* textに格納する関数を作成しなければならない。 引数のchar* textは8バイト。NULL文字で終端させる必要がある。 サンプルエフェクターでは以下のように処理している。 void MyTremoloVST getParameterDisplay (VstInt32 index, char* text){//indexで指定されたパラメータの表示内容をtextに格納する//kVstMaxParamStrLenは「vstsdk2.4\pluginterfaces\vst2.x\aeffect.h」に//定義されている。(kVstMaxParamStrLen = 8)switch (index){case TREMOLO_SPEED float2string (1.0f / fTremoloSpeed, text, kVstMaxParamStrLen);break;case TREMOLO_DEPTH float2string (fTremoloDepth, text, kVstMaxParamStrLen);break;}} float2string関数は継承元クラス(AudioEffectクラス)で定義されている関数。 他にも以下のような関数がある 関数 戻り値 引数 説明 dB2string なし float value,char* text,VstInt32 maxLen valueの値をデシベル単位に変換してchar* textにmaxLen文字分書き込む float2string なし float value,char* text,VstInt32 maxLen valueの値を文字列に変換してchar* textにmaxLen文字分書き込む Hz2string なし float samples,char* text,VstInt32 maxLen samplesの値を周波数に変換してchar* textにmaxLen文字分書き込む int2string なし VstInt32 value,char* text,VstInt32 maxLen valueの値を文字列に変換してchar* textにmaxLen文字分書き込む ms2string なし float samples,char* text,VstInt32 maxLen samplesの値をミリ秒単位に変換してchar* textにmaxLen文字分書き込む (詳細はaudioeffect.hで定義されている) 次へ 合計: - 今日: - 昨日: -
https://w.atwiki.jp/vstdev/pages/15.html
VST plug-in ver 3.1.0での変更点の詳細はこちら VST 2.x系 基本的なエフェクト処理ならこちらで十分 1イン・1アウト (mono/stereo) 対応DAW多し VST 3.x系 サイドチェイン入力に対応 2.xからプログラミングモデルが激変 対応DAWは少なめ
https://w.atwiki.jp/vst_prog/pages/56.html
VSTエフェクタ作成例 Tips VST Tipsトップページ(準備中) Effector Tipsトップページ 同一カテゴリのTips プロジェクトの作成 プロジェクトへのVST SDKファイル追加 vstplug.defの作成 プロジェクトの設定 コンパイル時の注意 その他 リンク 管理者へのメール テストページ ここを編集
https://w.atwiki.jp/vst_prog/pages/14.html
Steinberg VST Audio Plug-Ins SDK 2.4のインストール方法(2010年4月14日) 手順概要 Steinberg 開発者アカウントの作成 Steinberg VST Audio Plug-Ins SDK 2.4のダウンロード 手順詳細 Steinberg 開発者アカウントの作成 Steinberg 開発者ページへ移動 下記URLへアクセスする。 URL http //www.steinberg.net/en/company/3rd_party_developer.html ページ下部にある「VST Audio Plug-Ins SDK(Version 2.3 and 2.4)」の横の画像をクリックする。(画像はリンク切れ) 開発者ページへ移動する。 画面左メニューから「Create 3rd Party Developer Account」をクリックする。 開発者アカウントの作成1 開いたページ中央の「Country Prease choose」から「Japan」を選択し、「Next Step」をクリックする。 開発者アカウントの作成2 開いたページで必要事項を入力し、「I accept Steinberg's ~~~」にチェックをいれsecurity codeを入力し、「Create account now」をクリックする。 開発者アカウントの作成3 次のページが開けば問題なく登録は完了。 メールボックスに以下のメールが届いたことを確認する。 件名 「Steinberg 3rd Party Developer Acount」 送信者「Steinberg Media Technologies GmbH noreply@steinberg.net 」 開発者アカウントの有効化 届いたメールの「To activate your account please click on this link 」の部分にあるリンクをクリックするとアカウントの作成は完了する。 アカウントを作成からダウンロードページへのログイン可能になるまでしばらく時間がかかる模様 また、ダウンロードページはInternet Explorer以外のブラウザでは正常に動作しない可能性がある 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)」をクリックする。 ダウンロード先フォルダを選択して、ダウンロードする。 ダウンロードされたファイルの解凍 ダウンロードされたファイルを解凍する。 解凍したフォルダを任意の場所におく。 合計: - 今日: - 昨日: - 誤字、脱字、内容の不備等あれば教えてください。 名前 コメント
https://w.atwiki.jp/vst_prog/pages/87.html
VST Tips(準備中) 音源に必要なクラスの定義 ここでは前項を実装するため以下2つのクラスを定義している。 VSTiの基本となるMySynthSampleVSTクラス(AudioEffectXから継承するクラス) 波形を生成するCVoiceクラス VSTiのクラス定義 まず、VSTiの基本となるクラスを定義する。 クラスを定義する際はMIDIの処理ができるよう、AudioEffectXに加え、CMidiMsgも同時に継承する #define MAX_OSCILLATORS 8 // オシレータの数(最大発音数) class MySynthSampleVST public AudioEffectX , public CMidiMsg{protected CVoice cvoice[MAX_OSCILLATORS];public MySynthSampleVST (audioMasterCallback audioMaster); // 音声信号を処理するメンバー関数virtual void processReplacing (float** inputs, float** outputs, VstInt32 sampleFrames);virtual void processReplacing2 (float* inL, float* inR, float* outL, float* outR, VstInt32 sampleFrames); // MIDIメッセージをホストアプリケーションから受け取るためのメンバー関数VstInt32 processEvents (VstEvents* events); virtual void onMidiKeyOn (unsigned char channel, unsigned char noteNo, unsigned char velo);virtual void onMidiKeyOff (unsigned char channel, unsigned char noteNo, unsigned char velo);}; サンプルコードの解説 まず始めにVSTiクラスの中でが最大同時発音数分のボイスクラスを定義する。(CVoiceクラスについては後述) CVoice cvoice[MAX_OSCILLATORS]; 続いてMIDI Note On/Offメッセージを処理するため、CMidiMsgクラスからonMidiKeyOn()、onMidiKeyOff()の 2つの関数をオーバーライドする virtual void onMidiKeyOn (unsigned char channel, unsigned char noteNo, unsigned char velo); virtual void onMidiKeyOff (unsigned char channel, unsigned char noteNo, unsigned char velo); CVoiceクラスの定義 次にCVoiceクラスを定義する。今回は以下のように定義している #define VOICE_STATE_OFF 0#define VOICE_STATE_ON 1 class CVoice{protected float elapsedFrames; //オシレータが発音を始めてから経過したフレーム数int status; //オシレータ発音中の場合はTrueint noteNo; //オシレータの音程float sampleRate; //サンプルレート(デフォルト 44100)public inline CVoice(void);inline ~CVoice(void);// オシレータを初期化するメンバー関数inline void init();// 現在のオシレータの振幅を返すメンバー関数inline float amplitude();// オシレータの状態を更新するメンバー関数inline void update();// オシレータの動作を開始・停止させるメンバー関数inline void start(int note);inline void stop();// オシレータのメンバ変数を設定するメンバー関数inline void setSampleRate(float newSampleRate);// オシレータの状態を取得するメンバー関数inline int getStatus() { return status; };inline int getNoteNo() { return noteNo; };}; 定義しているメンバー変数はそれぞれ以下のとおり 変数 型 説明 elapsedFrames float ボイスが発音を始めてから経過したフレーム数。正弦波の振幅を計算するときに利用。 status int ボイスが発音中かどうかのフラグ。0…OFF、1…ONとする。 noteNo int Note Onメッセージで渡されるノートナンバーを保存する。正弦波の周波数を計算するのに利用。 sampleRate float サンプリングレート。デフォルトは44100正弦波の振幅を計算するときに利用。 またメンバー関数については簡単な音源(VSTi)で処理すべき内容を元に以下を定義する。 関数名 戻り値 引数 説明 amplitude() float なし processReplacing()関数内で呼び出されることを想定。オシレータが発音を始めてからの時間(elapsedFrames)とノートナンバー(noteNo)からオシレータの振幅値を返す。 update() なし なし processReplacing()関数内で呼び出されることを想定。経過時間(elapsedFrames)を進める start() なし int note onMidiKeyOn()関数内で呼び出されることを想定。オシレータを発音させる。 stop() なし なし onMidiKeyOff()関数内で呼び出されることを想定。発音中のオシレータを停止させる。 setSampleRate なし float newSampleRate サンプルレートを設定する。今回のVSTiサンプルの中では利用していない。 getStatus int なし オシレータの状態(ON/OFF)を返す。(詳細な説明は省略) getNoteNo int なし オシレータの現在のノートナンバーを返す。(詳細な説明は省略) 次へ 同一カテゴリのTips 項目 No. 概要