音源に必要なクラスの定義
ここでは
前項を実装するため以下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; //オシレータ発音中の場合はTrue
int 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正弦波の振幅を計算するときに利用。 |
関数名 |
戻り値 |
引数 |
説明 |
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
javascript plugin Error : このプラグインで利用できない命令または文字列が入っています。
最終更新:2011年04月17日 23:23