モーフィング,波形設定
モーフィングは波形データを圧縮していって、変化させる機能になります。
波形設定コマンドで、波形番号のb7を1にすることでモーフィング設定となります。
波形番号はゲーム全体で使用する番号で、ゴーファーの野望の場合0-26番までが登録されています。
コマンド
[通常波形設定]データ | オフセット | 内容 |
---|---|---|
F8H | +0 | 波形設定 |
+1 | 波形番号.0-127 |
データ | オフセット | 内容 |
---|---|---|
F8H | +0 | 波形設定 |
+1 |
波形番号 b7=1 |
|
+2 |
モーフィング増分値データ b7=0なら(+0D)b4[モーフィングモード選択ビット0?]=0 b7=1なら(+0D)b4[モーフィングモード選択ビット0?]=1 b6=0なら(+0D)b5[モーフィングモード選択ビット1?]=0 b6=1なら(+0D)b5[モーフィングモード選択ビット1?]=1 b5-b4,b3-b0を固定小数点整数2bit+小数4bitとして (+32H)[モーフィング増分加算値]に保存 |
動作
モーフィングの[モーフィング波形アドレス増分]更新処理は、エンベロープと同じく音処理中に行われます。
音を出して1回目の処理では(+33H)[モーフィング増分計算テンポラリ]を10Hに初期化して、後はそこに(+32H)[モーフィング増分加算値]を加えていきます。
[モーフィング増分計算テンポラリ]は整数4bit+小数4bitの固定小数点で、その整数部分を取り出して、(+31H)[モーフィング波形アドレス増分]に書き込んでいきます。
[モーフィング増分計算テンポラリ]は固定小数点なので、最初の10Hは[モーフィング波形アドレス増分]1という意味になります。
加算していくと、整数4bitが溢れますがその時は、5bit目をフラグで判別し[モーフィング波形アドレス増分]に反映させます。
しかし次のクロックでは整数部分を4bitに制限するので、[モーフィング波形アドレス増分]は値の変化を繰り返すことになります。
例えば(+32H)[モーフィング増分加算値]が20Hとすると、[モーフィング波形アドレス増分]は、16進数表記で3,5,7,9,B,D,F,11,3,5,7…とループします。
これら処理ではすこし甘い部分があり、初期化して増分1以上となるのが発音した次のクロックです。
なので発音した直後の1クロックでは増分が0となり、SCCの波形データエリアが同じ値で埋められます。
また、増分加算値が1.0H未満の場合、ループした時に増分が0の期間が生じるので、これもまた波形データが同じ値で埋められることになり、そうなるとその間は音が出ないという現象が発生します。
この処理の最初で(+0D)の[モーフィングモード選択ビット?]2つを参照して分岐しますが、ジャンプ先が同じなために実質的には意味がなく用途は分かりません。
同じく、(+30H)b7[モーフィング処理停止フラグ]をチェックし1なら処理をやめるようなコードもありますが、このビットも1にしている箇所が無いようなので詳細不明です。
何かで使用する予定だったのか、プログラム修正後の残骸のようなものなのでしょうか。
内容をまとめると、モーフィング処理では徐々に増分値が増えるという内容になっています。そしてゆっくり増加させるために固定小数点で管理しているのだと思われます。
サンプル
データ | 意味 |
---|---|
FEH 01H | (+09H)を01Hにセットする。音名音長のデータ形式指定 |
E9H 1EH | 基本音長30 |
D4H | O2 |
EAH 0FH | V15 |
F8H 85H 38H | 波形転送5番からモーフィング.増分加算値3.8H |
03H | O2C |
EAH 00H | V0 |
03H | O2C(休符の代用) |
EAH 0FH | V15 |
D2H | O4 |
03H | O4C |
EAH 00H | V0 |
03H | O4C(休符の代用) |
EAH 0FH | V15 |
D4H | O2 |
F8H 80H 03H | 波形転送0番からモーフィング.増分加算値0.3H |
03H | O2C |
EAH 00H | V0 |
03H | O2C(休符の代用) |
EAH 0FH | V15 |
F8H 85H 03H | 波形転送5番からモーフィング.増分加算値0.3H |
03H | O2C |
EAH 00H | V0 |
03H | O2C(休符の代用) |
EAH 0FH | V15 |
F8H 94H 03H | 波形転送20番からモーフィング.増分加算値0.3H |
03H | O2C |
FFH | 曲データ終了 |
このデータでは、
- ゲーム中で使用されるモーフィングの増分加算値を3.8Hと極端に大きくしてみる
- その設定でオクターブを高くしてみる
- モーフィング速度はゆっくりに0.3Hとして、オクターブも戻し、モーフィング開始波形を0番からにしてみる
- モーフィング開始波形を5番にしてみる
- モーフィング開始波形を20番にしてみる
ということを試しています。
また、モーフィング中では休符が使えないので、音量0の音を出して休符のかわりにして音を区切っています。
(1)では少し新しい発見になりました。SCCは32サンプルを繰り返すのでどうしても規則性が強くなってしまってノイズ音が作れないのが普通です。
しかし転送アドレスを飛ばし飛ばしに、しかもその間隔をどんどん大きくしていくことで規則性が減り、ノイズのような音に聞こえるまでになっています。
(2)ではオクターブを上げたことで、波形切り替えの間に、SCCの波形ループが増えてしまい規則性が出てノイズから遠くなってしまいました。
ゲームでもモーフィングは低い音程で使われているので、周波数が高いと波形切り替えより波形ループの方が強くなって、あまり面白い音にならないのかも知れません。
(3)-(5)ではそう大きな違いは出ないようです。また(5)では確実に波形データエリアを超えて演奏データが鳴っています。