データの構造/音長指定直接変化
このデータ形式にするには、コマンドFEHで(+09H)[データフラグ]のb2:[音長指定直接変化0]からb4:[音長指定直接変化2]までのどれかのビットを1にします。
データは1バイトで上位4bitはテーブルインデックス値、下位4bitは音名音長形式と同じ音長値です。
インデックス値の範囲はコマンドとの切り分けのため0H-CHの範囲になると思われます。
インデックス値に規定の音データが対応し、その音を指定音長で鳴らすという動作になります。
テーブルは(+16H)[オクターブ値]と[音長指定直接変化0]-[音長指定直接変化2]のどれを選択しているのかによって決まります。
組み合わせは多いですが、オクターブ値は 0,1の2種が有効なので実際は6個のテーブルから選択します。
更には[音長指定直接変化0]とオクターブ値0以外のテーブルはダミーデータしか用意されていないように見えるので、実際使用するのは、[音長指定直接変化0]とオクターブ値0の組み合わせのみかと思われます。
その1つのテーブルですらもインデックス値0-9の10種類しか設定されていないので、可能な登録数にはかなり余裕がありそうです。
インデックス値と選択される音一覧
インデックス値 | 音 |
---|---|
0 | |
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 |
データの流れ
音長指定直接変化形式のデータの流れは以下のようになります(実際のデータからの抜粋です)。
アドレス | データ | 内容 |
---|---|---|
9578 | FE 04 | 音長指定直接変化形式 |
957A | D0 | O6 |
957B | E9 04 | 基本音長4 |
957D | F9 F7 99 | 曲データアドレス99F7呼び出し |
99F7 | 91 | インデックス9,音長クロック8 |
インデックス9から曲データアドレス747Fに変更 | ||
747F | E2 01 | ノイズオフ、トーンオン、クロック値1設定 |
7481 | E5 09 00 0A |
ハードウェアエンベロープセット パターン9 エンベロープ周期000AH |
7485 | 94 50 | v9+2=v11 分周比450H,1クロック鳴らす。 ハードウェアエンベロープにより音が出ます。割り込み処理ここまで |
7487 | 96 00 | v9+2=v11 分周比600H,1クロック鳴らす。 ハードウェアエンベロープが消音していて解除していないので実際はここ以降音が出ません。 割り込み処理ここまで |
7489 | 97 00 | v9+2=v11 分周比700H,1クロック鳴らす。割り込み処理ここまで |
748B | 98 00 | v9+2=v11 分周比800H,1クロック鳴らす。割り込み処理ここまで |
748D | FF | データ終了。ハードウェアエンベロープ解除 |
残り4クロック、消音のまま | ||
99F8 | 00 | 次の音のデータ読み込み、インデックス0,音長4 |
インデックス0から曲データアドレス73BDに変更 | ||
73BD | E1 01 | ノイズオン、トーンオフ、クロック値1設定 |
73BF | E4 00 | ノイズ周波数0 |
73C1 | 07 | v7+2=v9 1クロック鳴らす。割り込み処理ここまで |
73C2 | 05 | v5+2=v7 1クロック鳴らす。割り込み処理ここまで |
73C3 | FF | データ終了 |
残り2クロック、消音のまま | ||
99F9 | 00 | 次の音のデータ読み込み、インデックス0,音長4 |
処理的には上のように曲データアドレスが目まぐるしく入れ替わりますが、データを作る立場から見れば以下のようになります。
アドレス | データ | 内容 |
---|---|---|
99F7 | 91 | インデックス9の音を8クロック鳴らす |
99F8 | 00 | インデックス0の音を4クロック鳴らす |
99F9 | 00 | インデックス0の音を4クロック鳴らす |
複雑に変化する音を1音として扱うデータになるので、スッキリ短く表現できます。