約 3,950,957 件
https://w.atwiki.jp/ninjatrader/pages/94.html
定義 取引可能な銘柄 注記:このクラス中のプロパティは、Initialize()メソッドの中で アクセスされるべきではない 。 メソッドとプロパティ Expiry 先物契約の満期日 FullName 銘柄のフルネーム MasterInstrument.Compare() 銘柄のTickSizeに関して2つの価格を比較する MasterInstrument.InstrumentType 銘柄の種類 MasterInstrument.Name データベース上の銘柄名 (例えば"MSFT") MasterInstrument.PointValue 1ポイントの動きに対する通貨価値 MasterInstrument.Round2TickSize() 最も近い有効値に四捨五入する
https://w.atwiki.jp/musichouse/pages/13.html
VST Instruments Synth 名前 価格 デモ曲(link) コメント Rob papen BLUE € 199/$ 239 〇 お勧め Albino3 $ 239 〇 BLUEと並んで定番シンセ Predator € 149/$ 179 〇 ダンス・トランス系の太い音が得意 RG € 149/$ 179 〇 リズムギターシンセ SubBoomBass € 99/$ 119 - ベースシンセ linplug Albino3 239 US$ 〇 linplugでも売ってます Alpha3 USD 99 〇 アナログ系 シンプルで安いがなかなか良い CronoX3 USD 149 〇 Sample synth Sophistry USD 199 〇 Ambient Synth CronX3のAmbient音色特化版 Octopus USD 129 〇 Dual-Matrix Synthesizer LennarDigital Sylenth1 Euro 139 〇 フィルターの効きがすごい Cakewalk D-pro $ link サンプルプレイバックシンセ Z3ta+ $ 〇 変態系が得意 Rapture $ link FutureAudioWorkshop future_a_w_fawcir-.jpgCircle $199.00 / €149.00 〇 最近では珍しいパッケージ発売 GForce impOSCar €99 〇 自分は使った事ないけどかなり評判良い M-Tron €139 〇 Tron Oddity €99 〇 Oddity Minimonsta €149 〇 Minimonsta Melohman VSM €129 〇 Virtual String Machine M-Tron Pro 〇 サンプルプレイバックシンセ D-pro http //www.cakewalk.jp/ 〇 サンプルプレイバックシンセ D-pro http //www.cakewalk.jp/ 〇 サンプルプレイバックシンセ D-pro http //www.cakewalk.jp/ 〇 サンプルプレイバックシンセ screenshotthumb.jpg AA #seeqpod Drums DrumCore KitCore Horn/Brass オーケストラ/ストリングス KirkHunter Sampler Kontackt E-mu ボーカル音源 VOCALOID 初音ミク 鏡音リン・レン MEIKO KAITO 総合音源 UVIworkstaion SampleTank SonikSynth
https://w.atwiki.jp/acitys/pages/532.html
MAXIMIZER INSTRUMENTとは、山夢町に本社を置く会社。 概要 駅の案内、清掃などのロボットを開発・量産している。
https://w.atwiki.jp/ninjatrader/pages/90.html
定義 銘柄の種類を返す。 プロパティ値 銘柄の種類を表す InstrumentType 取り得る値は次の通り: InstrumentType.Currency InstrumentType.Future InstrumentType.Index InstrumentType.Option InstrumentType.Stock 構文 Instrument.MasterInstrument.InstrumentType 追加のアクセス情報 このプロパティは、null参照のチェック無しにOnBarUpdate()イベント・ハンドラの中でアクセスすることができる。OnBarUpdate()イベントがトリガされた時、Instrumentオブジェクトは常に存在する。他の場所でこのプロパティにアクセスしたい場合は、null参照のチェックを最初に行うべきである。その例は: if (Instrument != null)
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/74.html
トップページ MIDIメッセージ処理 MIDIメッセージにあわせて動作するVSTのサンプルである。 下記VSTはSynthとしてロードされ、常にノイズを発生させる。実行時は音量に注意してほしい。 ノイズのボリュームをMIDI CC7でコントロールできる。 サンプルコード全体 ソースコードのダウンロード→ここをクリック // ============================================================================================// インクルードファイル// ============================================================================================#include stdlib.h #include string.h #include "audioeffectx.h" // ============================================================================================// 設計情報の記入// ============================================================================================#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 //パラメータの数 // ============================================================================================// MIDI処理用の定義// ============================================================================================#define MIDIMSG_MAXNUM 255 struct MidiMessage{VstInt32 deltaFrames; //MIDIメッセージを処理するタイミングunsigned char message; //MIDIメッセージ番号unsigned char channel; //MIDIチャンネルunsigned char data1; //MIDIデータ1unsigned char data2; //MIDIデータ2}; // ============================================================================================// VSTの基本となるクラス// ============================================================================================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);}; // ============================================================================================// このVSTのを生成するための関数// ============================================================================================AudioEffect* createEffectInstance (audioMasterCallback audioMaster){//newでこのVSTを生成したポインタを返すreturn new MyMidiSampleVST (audioMaster);} MyMidiSampleVST MyMidiSampleVST (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 (true); //このVSTがSynthかどうかのフラグを設定。 //Synthの場合…true、Effectorの場合…false canProcessReplacing (); //このVSTが音声処理可能かどうかのフラグを設定。 //音声処理を行わないVSTはないので必ずこの関数を呼び出す。 //上記の関数を呼び出した後に初期化を行うmidimsgnum = 0;memset(midimsgbuf, 0, sizeof(MidiMessage) * MIDIMSG_MAXNUM); volume = 1.0f;} void MyMidiSampleVST processReplacing (float** inputs, float** outputs, VstInt32 sampleFrames){//入力、出力は2次元配列で渡される。//入力は-1.0f~1.0fの間で渡される。//出力は-1.0f~1.0fの間で書き込む必要がある。//sampleFramesが処理するバッファのサイズfloat* outL = outputs[0]; //出力 左用float* outR = outputs[1]; //出力 右用 // midieventlistの読み込み位置int midimsg_cursol = 0; for (int i = 0; i sampleFrames; i++){//ここで音声処理を行う。 // MIDIメッセージがあるか確認if ( midimsgnum 0){// MIDIメッセージを処理するタイミングかどうかを確認する。if( midimsgbuf[midimsg_cursol].deltaFrames = i){// MIDIメッセージがコントロールチェンジのボリューム変更(CC7)であった場合if( midimsgbuf[midimsg_cursol].message == 0xB0 midimsgbuf[midimsg_cursol].data1 == 7){volume = (float)( midimsgbuf[midimsg_cursol].data2) / 127.0f;} // midimsgbufからMIDIメッセージを読み出したので// 読み込み位置を進め、MIDIメッセージの数を減らすmidimsgnum--;midimsg_cursol++;}} //出力バッファへ書き込む。outL[i] = volume * (float)((rand() % 256) -128) / 255.0f;outR[i] = volume * (float)((rand() % 256) -128) / 255.0f;}} // MIDIメッセージを処理するメンバー関数// processReplacing()の前に必ず1度だけ呼び出される。// VstInt32 MyMidiSampleVST processEvents (VstEvents* events){// MIDIのリストを初期化します。midimsgnum = 0;memset(midimsgbuf, 0, sizeof(MidiMessage) * MIDIMSG_MAXNUM); // VSTイベントの回数だけループをまわす。int loops = (events- numEvents);for (int i = 0;i loops; i++){// 与えられたイベントがMIDIならばmidimsgbufにストックするif ((events- events[i])- type == kVstMidiType){VstMidiEvent *midievent = (VstMidiEvent*)(events- events[i]); midimsgbuf[midimsgnum].deltaFrames = midievent- deltaFrames;midimsgbuf[midimsgnum].message = midievent- midiData[0] 0xF0; // MIDIメッセージmidimsgbuf[midimsgnum].channel = midievent- midiData[0] 0x0F; // MIDIチャンネルmidimsgbuf[midimsgnum].data1 = midievent- midiData[1]; // MIDIデータ1midimsgbuf[midimsgnum].data2 = midievent- midiData[2]; // MIDIデータ2midimsgnum++; // MIDIメッセージのバッファがいっぱいの場合はループを打ち切る。if (i = MIDIMSG_MAXNUM){break;}}} // 1を返しておくreturn 1;} VST Tipsトップページへ 同一カテゴリのTips 項目 No. 概要 MIDIメッセージ処理 No.1 MIDIメッセージ処理で最小構成の自作VSTに追加する変数・関数 No.2 VSTの初期化とMIDIメッセージ処理関連の変数の初期化 No.3 ホストアプリケーションからMIDIメッセージを受け取る方法 No.4 MIDIメッセージをprocessReplacing()関数中で処理する方法 No.5 MIDIメッセージ処理で作成したVSTのサンプルソースコード全体(暫定版)
https://w.atwiki.jp/vst_prog/pages/84.html
VST Tips(準備中) 簡単な音源(VSTi)の作成(暫定版) (2011/4/14更新) 【注意】 本サンプルはSynthesizerの基本的な処理を追いやすくするために書かれたコードです。以下の点が大きなバグとして残っておりますのでご注意ください。(小さなバグも多数あります) ノートOFF時に振幅が急激に変化するため、不快なノイズが入ります。(基本的には問題ないと思いますが大きな音量の場合、耳やスピーカーを痛める可能性があります。) なお、本サンプル利用を使用したことによって生じたすべての障害・損害・不具合等に関しては、一切の責任を負いません。各自の責任においてご使用ください。 サンプルコード全体 ソースコードのダウンロード→ ここをクリック (dllファイルも同梱しております。dllファイルのウィルスチェックはしておりませんのでdllファイル利用の前には必ずチェックをお願いいたします。) MIDIの処理部分についてはこちらの【CMidiMsg.h】と【CMidiMsg.cpp】をご覧ください。 【MySynthSampleVST.h】 // ============================================================================================// インクルードファイル// ============================================================================================#include stdlib.h #include "audioeffectx.h" #include "CMidiMsg.h"#include "CVoice.h" // ============================================================================================// 設計情報の記入// ============================================================================================#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 //パラメータの数 #define MAX_OSCILLATORS 8 // オシレータの数(最大発音数)// ============================================================================================// VSTの基本となるクラス// ============================================================================================class MySynthSampleVST public AudioEffectX , public CMidiMsg{protected CVoice osc[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);}; // ============================================================================================// このVSTを生成するための関数// ============================================================================================AudioEffect* createEffectInstance (audioMasterCallback audioMaster){//newでこのVSTを生成したポインタを返すreturn new MySynthSampleVST (audioMaster);} // ============================================================================================// このVSTの初期化// ============================================================================================MySynthSampleVST MySynthSampleVST (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 (true); //このVSTがSynthかどうかのフラグを設定。 //Synthの場合…true、Effectorの場合…false canProcessReplacing (); //このVSTが音声処理可能かどうかのフラグを設定。 //音声処理を行わないVSTはないので必ずこの関数を呼び出す。 //上記の関数を呼び出した後に初期化を行う} // ============================================================================================// 音声信号処理部分// ============================================================================================void MySynthSampleVST 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]; //出力 右用 // 処理されたフレーム数VstInt32 processedFrames = 0; while(getMidiMessageNum() 0){// 処理すべきフレーム数VstInt32 Frames = getNextDeltaFrames() - processedFrames;processReplacing2 (inL, inR, outL, outR, Frames); // MIDIメッセージの処理を行うmidiProc(); // 処理されたフレーム数を計算// 同時に音声信号バッファのポインタについても進める。processedFrames += Frames;inL += Frames;inR += Frames;outL += Frames;outR += Frames;} processReplacing2 (inL, inR, outL, outR, sampleFrames - processedFrames);} void MySynthSampleVST processReplacing2 (float* inL, float* inR, float* outL, float* outR, VstInt32 sampleFrames){for (int i = 0; i sampleFrames; i++){//ここで音声処理を行う。float out = 0.0f;float volume = 1.0 / (double)MAX_OSCILLATORS; // 各オシレータの振幅を取得し、出力に足し合わせる。for(int j = 0; j MAX_OSCILLATORS; j++){// オシレータの振幅を取得。out += osc[j].amplitude(); // オシレータの状態を更新する。osc[j].update();} //出力バッファへ書き込む。outL[i] = out * volume;outR[i] = out * volume;}} // MIDIメッセージをVSTに保存する。// processReplacing()の前に必ず1度だけ呼び出される。VstInt32 MySynthSampleVST processEvents (VstEvents* events){// MIDIのリストを初期化します。clearMidiMsg(); int loops = (events- numEvents); // VSTイベントの回数だけループをまわす。for (int i = 0;i loops; i++){// 与えられたイベントがMIDIならばmidimsgbufにストックするif ((events- events[i])- type == kVstMidiType){VstMidiEvent *midievent = (VstMidiEvent*)(events- events[i]);if( !addMidiMsg(midievent) ){break;}}} // 1を返さなければならないreturn 1;} // ============================================================================================// MIDIメッセージを処理する// ============================================================================================void MySynthSampleVST onMidiKeyOn (unsigned char channel, unsigned char noteNo, unsigned char velo){// OFF状態のオシレータを探すfor(int i = 0; i MAX_OSCILLATORS; i++){if(osc[i].getStatus() == VOICE_STATE_OFF){// OFF状態のオシレータをONにして検索終了osc[i].start(noteNo);break;}}} void MySynthSampleVST onMidiKeyOff (unsigned char channel, unsigned char noteNo, unsigned char velo){// ON状態でかつノートNoと一致するオシレータを探すfor(int i = 0; i MAX_OSCILLATORS; i++){if(osc[i].getStatus() == VOICE_STATE_ON osc[i].getNoteNo() == noteNo){// ON状態のオシレータをOFFにして検索終了osc[i].stop();break;}}} 【COscillator.h】 #pragma once#include math.h #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; }; }; CVoice CVoice(){// 初期化を実施init();} CVoice ~CVoice(){} void CVoice init(){// メンバ変数を初期化するelapsedFrames = 0.0;status = VOICE_STATE_OFF;noteNo = 0;sampleRate =44100.0f;} float CVoice amplitude(){// オシレータの振幅を返すif(status == VOICE_STATE_ON){// オシレータの状態がONの時float pi = 3.14159265f; // ノートNoから周波数を計算するfloat freq = (float)(440.0 * pow(2.0, ((double)noteNo - 69.0)/12.0));; // 現在の振幅量を返すreturn (float)sin(2.0 * pi * freq * elapsedFrames / sampleRate);}else{// オシレータの状態がOFFの時 // 0を返すreturn 0.0f;}} void CVoice update(){// 経過時間を進めるelapsedFrames += 1.0f;} void CVoice start(int note){status = VOICE_STATE_ON;noteNo = note;} void CVoice stop(){init();} void CVoice setSampleRate(float newSampleRate){sampleRate = newSampleRate;} VST Tipsトップページへ(準備中) 同一カテゴリのTips 項目 No. 概要
https://w.atwiki.jp/vst_prog/pages/89.html
VST Tips(準備中) MySynthSampleVSTクラスの実装 ここでは音源に必要なクラスの定義で定義したMySynthSampleVSTクラスについて説明する。 MySynthSampleVSTの初期化 MySynthSampleVSTの初期化では初期化ルールに従い初期化を行っている。 MySynthSampleVST MySynthSampleVST (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 (true); //このVSTがSynthかどうかのフラグを設定。 //Synthの場合…true、Effectorの場合…false canProcessReplacing (); //このVSTが音声処理可能かどうかのフラグを設定。 //音声処理を行わないVSTはないので必ずこの関数を呼び出す。 //上記の関数を呼び出した後に初期化を行う} ただし、作成するものが音源(VSTi)のためisSynth()関数の引数にtrueを入れている。 isSynth (true); //このVSTがSynthかどうかのフラグを設定。 //Synthの場合…true、Effectorの場合…false MIDIメッセージをホストアプリケーションから受け取る processEvents()関数でMIDIメッセージを受け取る。 詳細については省略する。(詳しくはMIDIメッセージをホストアプリケーションから受け取る関数参照) 受け取ったMIDIメッセージの振り分け 受け取ったMIDIメッセージをメッセージごとに処理を振り分ける。 今回の音源のMIDI Controllerにあたる部分となる。 実装についてはCMidiMsgクラスからオーバーライドしたMidiProc()関数が該当する。 詳細については省略する。 MIDI ノードOn/Offメッセージを受け取った時の処理 今回の音源のVoice Controllerにあたる部分を実装する。 今回の音源の仕様で記述したとおり、ノートOnメッセージを受け取った場合、まず停止中(OFF状態)のボイスを探す。 停止中のボイスが見つかれば、そのボイスを発音(start)させ、停止中ボイスの検索を打ち切る。 void MySynthSampleVST onMidiKeyOn (unsigned char channel, unsigned char noteNo, unsigned char velo){// OFF状態のボイスを探すfor(int i = 0; i MAX_VOICES; i++){if(cvoice[i].getStatus() == VOICE_STATE_OFF){// OFF状態のボイスをONにして検索終了cvoice[i].start(noteNo);break;}}} なお、上記のコードはすべて発音中の場合、それ以上音が出ないという不具合(仕様)がある。(この仕様の修正についてはそのうち説明予定。) 次にノートOnメッセージを受け取った場合であるが、これは発音中(ON状態)かつ音程(ノートナンバー)が一致するものを探し出し、見つかればそのボイスを停止(stop)させるという処理を実施している。 void MySynthSampleVST onMidiKeyOff (unsigned char channel, unsigned char noteNo, unsigned char velo){// ON状態でかつノートNoと一致するボイスを探すfor(int i = 0; i MAX_VOICES; i++){if(cvoice[i].getStatus() == VOICE_STATE_ON cvoice[i].getNoteNo() == noteNo){// ON状態のボイスをOFFにして検索終了cvoice[i].stop();break;}}} processReplacing()関数 作成中 次へ(準備中) 同一カテゴリのTips 項目 No. 概要
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のサンプルソースコード全体(暫定版)
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トップページへ(準備中)