(1)モジュール間I/F
「13. 基礎アーキテクチャ」でも解説しましたが、VGSの場合、音源ドライバが音源モジュールに対して、オペレーションを入力し、音源モジュールが発音処理を行います。
音源ドライバ・音源モジュール間のI/F |
(2)オペレーション
オペレーションとは、「発音せよ」「消音せよ」といった感じの指令です。
実際、VGSのオペレーションには幾つかの種類がありますが、先ずは最低限必要な発音(KEY-ON)と消音(KEY-OFF)と待機(WAIT)のオペレーションだけ実装することを目標にします。
(3)WAITオペレーション
楽譜記号のオタマジャクシには、全音符(白い丸)、半音符(白抜きの♩)、四分音符(♩)、八分音符(♪)などの種類があります。その名の通り、半音符は全音符の1/2の長さ、四分音符は全音符の1/4の長さ、八分音符は全音符の1/8の長さという具合です。全音符の長さはテンポにより異なります。
つまり、WAITオペレーションというのは、音や無音(休符)の長さを待機する為のパラメータです。
「それならば、KEY-ONオペレーションに長さのパラメータを持たせれば良いのでは?」と思われるかもしれませんが、「逐次オペレーション」で複数のチャネル(声部)のKEY-ONとKEY-OFFを並列に管理する場合、WAITオペレーションを分離しておいた方が、シンプルに実装できます。(この理屈は、現段階では理解できなくても問題ありません)
(4)音源ドライバの状態遷移
音源ドライバは、下図のような状態遷移をします。
音源ドライバの処理の状態遷移 |
(5)オペレーション・レコードの設計
それでは、オペレーション・レコードの構造体について考えてみます。
レコード設計をする場合、主キーとそれに関連するプロパティが何かを考えます。
主キーは「オペレーションの種類」です。
そして、オペレーションの種類毎に必要なプロパティ情報(=オペランド)は、次の通りです。
- Wait: ①時間(周波数と同じとする:1秒=22,050)
- KEY-ON: ①チャネル番号(0~5)、②音程(0~84)
- KEY-OFF: ①チャネル番号(0~5)
/* オペレーションレコード */ #define NOTE_WAIT 0 /* WAIT */ #define NOTE_KEYON 1 /* KEY-ON */ #define NOTE_KEYOFF 2 /* KEY-OFF */ struct _NOTE { unsigned char type; /* 種別 */ unsigned char op1; /* オペランド1 */ unsigned char op2; /* オペランド2 */ unsigned char op3; /* オペランド3 */ unsigned int val; /* 値 */ }; |
0 件のコメント:
コメントを投稿