音量と分周比の処理
音量の処理
音名音長形式でコマンドで指定された音量は(+15H)[マスターボリューム]に格納されます。
発音データの処理で(+15H)から読み出され、Eレジスタにセットしてフェードアウト中ならフェードアウト処理を呼び出します。フェードアウト中でなければそのままです。
その値を(+12H)[チャンネルボリューム]に保存します。
発音初期設定時に(+12H)を読み出して、(+0EH)b7[音量減算フラグ]をチェックし、フラグが立っていたら(+12H)の値から(+2FH)[チャンネルボリューム減算値]を引きます。0以下になった場合は0に補正されます。フラグが立っていなければそのままです。
その値を(+0CH)[音量データ]に書き込みます。
(+0CH)に保存された値が、音源に書き込まれることになります。
エンベロープ等の音量操作は、この(+0CH)の値を読み出して更新し、(+0CH)に書き戻すことで行われます。
直接指定形式では、データから取得した音量値を+2して(+12H)[チャンネルボリューム]に一旦保存します。
ハードウェアエンベロープ使用の場合は、+2ではなく+12H(b4を1にする)として(+12H)に保存されます。
その後、(+12H)から取り出しEレジスタにセットし、上記と同じフェードアウト処理を行い(+12H)に書き戻します。
以降は発音初期設定で音名音長形式と同じ処理がされます。
フェードアウト中の処理
Eレジスタに音量値が入って処理がやってきます。
SEの場合フェードアウトを適用しません。そのまま戻ります。
SEかどうかのチェックは、PSG Ch.BとPSG Ch.Cの曲番号を調べて異なる場合SEを鳴らしている状態であることが判明します。
その時に処理しているチャンネルがPSG Ch.CかSCC Ch.Aなら、SEと判定されます。
次にハードウェアエンベロープを使用していれば音量は0に。
Eレジスタから(E297H)[フェードアウト減算値]を引き0以下なら0に補正して返します。
戻るときもEレジスタに音量値が入って戻ります。
分周比の処理
こちらも音量の処理と同じような内容です。
音名音長形式の場合、テーブルから引いて算出した値は(+11H)(+10H)[データから取得した分周比値]に格納します。
発音初期設定で、(+11H)(+10H)の値を読み出しデチューン処理を行い、(+0BH)(+0AH)[分周比データ]に書き込みます。
(+0BH)(+0AH)に保存された値が、音源に書き込まれることになります
ビブラートなどの周波数操作は、この(+0BH)(+0AH)を読み出して更新し、(+0BH)(+0AH)に書き戻すことで行われます。
直接指定形式でも同じようにデータから読み込んだ値を(+11H)(+10H)に格納して、発音初期設定でデチューン処理後、(+0BH)(+0AH)に保存されます。
デチューン処理
デチューン処理は加算しかできないので、音を低くする働きのみになります。
(+0EH)b1[デチューンフラグ]をチェックし1なら(+11H)(+10H)の値に(+26H)[デチューン値]を加算した値を、0なら(+11H)(+10H)そのままの値を返します。