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

VST Tips(準備中)


MySynthSampleVSTクラスの実装

ここでは音源に必要なクラスの定義で定義したMySynthSampleVSTクラスについて説明する。

MySynthSampleVSTの初期化

MySynthSampleVSTの初期化では初期化ルールに従い初期化を行っている。

  1. MySynthSampleVST::MySynthSampleVST (audioMasterCallback audioMaster)
  2. : AudioEffectX (audioMaster, MY_VST_PRESET_NUM, MY_VST_PARAMETER_NUM)
  3. {
  4. //VSTの初期化を行う。
  5.  
  6. //以下の関数を呼び出して入力数、出力数等の情報を設定する。
  7. //必ず呼び出さなければならない。
  8. setNumInputs (MY_VST_INPUT_NUM); //入力数の設定
  9. setNumOutputs (MY_VST_OUTPUT_NUM); //出力数の設定
  10. setUniqueID (MY_VST_UNIQUE_ID); //ユニークIDの設定
  11.  
  12. isSynth (true); //このVSTがSynthかどうかのフラグを設定。
  13. //Synthの場合…true、Effectorの場合…false
  14.  
  15. canProcessReplacing (); //このVSTが音声処理可能かどうかのフラグを設定。
  16. //音声処理を行わないVSTはないので必ずこの関数を呼び出す。
  17.  
  18. //上記の関数を呼び出した後に初期化を行う
  19. }

ただし、作成するものが音源(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)させ、停止中ボイスの検索を打ち切る。
  1. void MySynthSampleVST::onMidiKeyOn (unsigned char channel, unsigned char noteNo, unsigned char velo)
  2. {
  3. // OFF状態のボイスを探す
  4. for(int i = 0; i < MAX_VOICES; i++)
  5. {
  6. if(cvoice[i].getStatus() == VOICE_STATE_OFF)
  7. {
  8. // OFF状態のボイスをONにして検索終了
  9. cvoice[i].start(noteNo);
  10. break;
  11. }
  12. }
  13. }
なお、上記のコードはすべて発音中の場合、それ以上音が出ないという不具合(仕様)がある。(この仕様の修正についてはそのうち説明予定。)

次にノートOnメッセージを受け取った場合であるが、これは発音中(ON状態)かつ音程(ノートナンバー)が一致するものを探し出し、見つかればそのボイスを停止(stop)させるという処理を実施している。

  1. void MySynthSampleVST::onMidiKeyOff (unsigned char channel, unsigned char noteNo, unsigned char velo)
  2. {
  3. // ON状態でかつノートNoと一致するボイスを探す
  4. for(int i = 0; i < MAX_VOICES; i++)
  5. {
  6. if(cvoice[i].getStatus() == VOICE_STATE_ON && cvoice[i].getNoteNo() == noteNo)
  7. {
  8. // ON状態のボイスをOFFにして検索終了
  9. cvoice[i].stop();
  10. break;
  11. }
  12. }
  13. }

processReplacing()関数

作成中





同一カテゴリのTips


項目 No. 概要


javascript plugin Error : このプラグインで利用できない命令または文字列が入っています。