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

VST Tips(準備中)


音源に必要なクラスの定義

ここでは前項を実装するため以下2つのクラスを定義している。
  • VSTiの基本となるMySynthSampleVSTクラス(AudioEffectXから継承するクラス)
  • 波形を生成するCVoiceクラス

VSTiのクラス定義

まず、VSTiの基本となるクラスを定義する。

クラスを定義する際はMIDIの処理ができるよう、AudioEffectXに加え、CMidiMsgも同時に継承する

  1. #define MAX_OSCILLATORS 8 // オシレータの数(最大発音数)
  2.  
  3. class MySynthSampleVST : public AudioEffectX , public CMidiMsg
  4. {
  5. protected:
  6. CVoice cvoice[MAX_OSCILLATORS];
  7. public:
  8. MySynthSampleVST (audioMasterCallback audioMaster);
  9.  
  10. // 音声信号を処理するメンバー関数
  11. virtual void processReplacing (float** inputs, float** outputs, VstInt32 sampleFrames);
  12. virtual void processReplacing2 (float* inL, float* inR, float* outL, float* outR, VstInt32 sampleFrames);
  13.  
  14. // MIDIメッセージをホストアプリケーションから受け取るためのメンバー関数
  15. VstInt32 processEvents (VstEvents* events);
  16.  
  17. virtual void onMidiKeyOn (unsigned char channel, unsigned char noteNo, unsigned char velo);
  18. virtual void onMidiKeyOff (unsigned char channel, unsigned char noteNo, unsigned char velo);
  19. };

サンプルコードの解説

まず始めに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クラスを定義する。今回は以下のように定義している

  1. #define VOICE_STATE_OFF 0
  2. #define VOICE_STATE_ON 1
  3.  
  4. class CVoice
  5. {
  6. protected:
  7. float elapsedFrames; //オシレータが発音を始めてから経過したフレーム数
  8. int status; //オシレータ発音中の場合はTrue
  9. int noteNo; //オシレータの音程
  10. float sampleRate; //サンプルレート(デフォルト 44100)
  11. public:
  12. inline CVoice(void);
  13. inline ~CVoice(void);
  14. // オシレータを初期化するメンバー関数
  15. inline void init();
  16. // 現在のオシレータの振幅を返すメンバー関数
  17. inline float amplitude();
  18. // オシレータの状態を更新するメンバー関数
  19. inline void update();
  20. // オシレータの動作を開始・停止させるメンバー関数
  21. inline void start(int note);
  22. inline void stop();
  23. // オシレータのメンバ変数を設定するメンバー関数
  24. inline void setSampleRate(float newSampleRate);
  25. // オシレータの状態を取得するメンバー関数
  26. inline int getStatus() { return status; };
  27. inline int getNoteNo() { return noteNo; };
  28. };

定義しているメンバー変数はそれぞれ以下のとおり

変数 説明
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. 概要


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