「解析データ/サウンド」の編集履歴(バックアップ)一覧に戻る

解析データ/サウンド - (2008/10/23 (木) 03:08:41) のソース

**サウンド関係 

1.注意事項

この文章の中で使用されている数値は音楽用語を除いて基本的に16進数です。
2バイトの数値をバイナリに記述する場合は、すべてリトルエンディアンです。
基本的に制御コードはロマンシングサガ3と共通です。


2.曲データの構成

FF6の曲データは、大きく2つに分かれています。
1つは曲内で使用する波形データ(楽器)を指定する部分。
もう1つは音階を記述したシーケンスデータです。


3.波形データの指定

波形データそのものは、楽器の音を記録したPCMのデータなので基本的に変更できません。
ファイル内に記録されている波形データの中から、どの曲でどの波形を使用するかを指定することができます。

曲ごとの波形データを指定している場所は、0x053F95から1曲につき32バイト単位で並んでいます。

参考:プレリュードは053FB5~053FD4です。

1つの波形を2バイトの数値で指定しているため、1曲につき16の波形が使用できることになります。
ここで指定できる数値は01~FFだと思われます(未検証)が、効果音で使用される波形も含んでいるため
実際に音楽で使用できるものはそれほど多くありません。


4.シーケンスデータの探し方

0x053E96-0X053F94	シーケンスデータオフセット[size:3]
この値からC0000を引いた値がシーケンスデータのオフセットになります。
曲の順番は構造体を参照してください。
データの終端のすぐ後から次の曲データが始まっているので、絶対にはみ出さないようにして下さい。
参考:プレリュードのシーケンスデータは0x085CA0~0x8641D
   戦闘曲のシーケンスデータは、0x08FA15~0x08FE42です。


5.シーケンスデータの構造

先頭38バイトがヘッダ、残りが実データです。
ヘッダの内容は以下の通りです。(すべてリトルエンディアン)
 00,01 データ長。実データより長めに指定してかまいません。
 02,03 実データの開始アドレス下位2バイト
 04,05 シーケンスデータの終了アドレス+1の下位2バイト(ここを見ればデータの終端が分かります。)
 06,07 Channel1のシーケンス開始アドレス下位2バイト(00,01と同じになる)
 08,09 Channel2のシーケンス開始アドレス下位2バイト
 0A,0B Channel3のシーケンス開始アドレス下位2バイト
 0C,0D Channel4のシーケンス開始アドレス下位2バイト
 0E,0F Channel5のシーケンス開始アドレス下位2バイト
 10,11 Channel6のシーケンス開始アドレス下位2バイト
 12,13 Channel7のシーケンス開始アドレス下位2バイト
 14,15 Channel8のシーケンス開始アドレス下位2バイト
 16~25 不明。06~15と同じ値にしておけば問題ない。
SFCの音声出力チャンネルは全部で8チャンネルあり、音楽データで一応すべてのチャンネルを使用できます。
(8つの音を同時に出すことができます。)
ただし、効果音を出力するときにはChannel8から順に割り込みが入ります。最大で4Channel使用されるようです。
特に戦闘曲を変更する場合は、途中で途切れてもあまり気にならない音を8~5Channelに割り当てたほうが良いです。
また、あるチャンネルを全く使用しない場合は開始アドレスに、終了アドレス+1(02,03と同じ値)を指定します。

参考:戦闘曲のデータ構造は以下のようになっています。
	データ開始位置が08FA15なので、ヘッダは08FA15~08FA3Aです。
	各Channelの開始アドレスは	Channel1:08FA3B
					Channel2:08FABC
					Channel3:08FB35
					Channel4:08FBCD
					Channel5:08FC62
					Channel6:08FCC3
					Channel7:08FD28
					Channel8:08FD99
	※実際のデータがChannel番号順に並んでいる必要はありません。
	データの終端が0BB0CBなのでヘッダは以下のようになります。
	 2C 04 3B FA 43 FE 3B FA BC FA 35 FB CD FB 62 FC 
	C3 FC 28 FD 99 FD 3B FA BC FA 35 FB CD FB 62 FC 
	C3 FC 28 FD 99 FD


6.Channelごとのシーケンスデータ記述方法

Channelごとのシーケンスデータは音符をバイトコードに変換したものと、
テンポや音量などを指定する制御コードを羅列した楽譜のようなものです。
C3以下の値が音の高さと長さを表す音符で、C4以上の値が制御コードになります。
制御コードは後ろに続く0~3バイトの引数を持つので注意してください。


7.音符の記述方法

音符の変換式は以下のようになります。
	バイトコード / 0E = 音の高さ
	 0=ド
	 1=ド#
	 2=レ
	 3=レ#
	 4=ミ
	 5=ファ
	 6=ファ#
	 7=ソ
	 8=ソ#
	 9=ラ
	 A=ラ#
	 B=シ
	 C=タイ(直前の音を切らずに伸ばす)
	 D=休符

	バイトコード / 0E の余り = 音の長さ
	 0=全音符
	 1=2分音符
	 2=3分音符
	 3=付点4分音符
	 4=4分音符
	 5=6分音符
	 6=付点8分音符
	 7=8分音符
	 8=12分音符
	 9=16分音符
	 A=24分音符
	 B=32分音符
	 C=48分音符
	 D=64分音符

たとえば2Eの場合 2E / 0E = 3 余り 4 となるのでレ#の4分音符となります。

計算結果を一覧表にすると以下のようになります。(4.は付点4分音符)

					音の高さ
       ド     ド#   レ     レ#    ミ    ファ  ファ#  ソ    ソ#    ラ     ラ#   シ    タイ   休符
   1   00    0E    1C    2A    38    46    54    62    70    7E    8C    9A    A8    B6
   2   01    0F    1D    2B    39    47    55    63    71    7F    8D    9B    A9    B7
   3   02    10    1E    2C    3A    48    56    64    72    80    8E    9C    AA    B8
   4.  03    11    1F    2D    3B    49    57    65    73    81    8F    9D    AB    B9
 音 4   04    12    20    2E    3C    4A    58    66    74    82    90    9E    AC    BA
 の 6   05    13    21    2F    3D    4B    59    67    75    83    91    9F    AD    BB
 長 8.  06    14    22    30    3E    4C    5A    68    76    84    92    A0    AE    BC
 さ 8   07    15    23    31    3F    4D    5B    69    77    85    93    A1    AF    BD
   12  08    16    24    32    40    4E    5C    6A    78    86    94    A2    B0    BE
   16  09    17    25    33    41    4F    5D    6B    79    87    95    A3    B1    BF
   24  0A    18    26    34    42    50    5E    6C    7A    88    96    A4    B2    C0
   32  0B    19    27    35    43    51    5F    6D    7B    89    97    A5    B3    C1
   48  0C    1A    28    36    44    52    60    6E    7C    8A    98    A6    B4    C2
   64  0D    1B    29    37    45    53    61    6F    7D    8B    99    A7    B5    C3


8.制御コードの記述方法

制御コードについては、すべてのコードは調査していません。
テンポなどの曲全体に対する設定はChannel1で指定することに注意してください。
xx yy zzと表記しているのものは制御コードに続いて値を指定する必要があるものです。

C4 xx
ボリュームレベル指定。指定できる値は00~7Fで、7Fが最大です。
各Channelの先頭で最低1回は設定する必要があります。
曲の途中で変更することもできます。

C5 xx yy
ボリュームを速度xxでyyの値に変化させます。

C6 xx
ボリュームバランス指定。
設定できる値は01~7Fで、01=左より、3F=中央、7F=右より、となります。
各Channelの先頭で最低1回は設定する必要があります。
曲の途中で変更することもできます。

C7 xx yy
ボリュームバランスを速度xxでyyの値に変化させます。

C8 xx yy
ピッチベンド指定。
直後の音の高さをスライドさせます。
xxが速度でyyがスライド幅。
xx=7Fの時音符全体の長さを使ってスライドします。xx=40なら音符の前半のみでスライドします。
yyは半音単位で、符号付き整数で指定します。
01なら半音上げる。FFなら半音下げる。
E4~E5では滑らかに変化できないほどゆっくり音をスライドさせたいときにはこちら使います。

C9 XX YY ZZ
ビブラート指定。
XXがディレイで、YYが周期、ZZが振幅です。

CA
ビブラート解除。

CB xx yy zz
音量を上下に振動させます。
xxがディレイで、yyが周期、zzが変動幅です。

CC
音量振動解除。

CD xx yy
自動変動バランス指定。
xxが変動幅、yyが変動速度です。
一回指定するだけで音が左右に振れ続けます。
有効な値は、どちらもD0辺りから怪しくなってきます。

CE
自動変動バランス解除。

CF xx 
xx: 00-1F(不明)

D0,D1,D2,D3
(不明)

D4
これ以降エコーを有効にする。

D5
これ以降エコーを無効にする。

D6 xx
オクターブ指定。
通常の音の高さは04です。
各Channelの先頭で最低1回は設定する必要があります。
曲の途中で変更することもできますが、実際にD6を使用することはありません。D7とD8で充分です。

D7
これ以降1オクターブ上がる。

D8
これ以降1オクターブ下がる。

D9 xx
音程補正 xx として設定する(0x0C で 1 オクターブ)

DA xx
音程補正に xx を加算する。

DB xx
(微小音程補正) xx として設定する。
(D9 xx のものとは別)

DC xx
波形(楽器)指定。
0x00-0x3F は効果音用に用いられます(0x00-0x07のみ)
0x40 以降がその曲で選択した波形になります。
各Channelの先頭で最低1回は設定する必要があります。
曲の途中で変更することもできます。

DD xx
フェードイン(Attack rate)指定。
値が小さいほど音の立ち上がりが緩やかになります。
xx: 0F(早)~00(遅)

DE xx
Decay rate設定。
xx: 07(早)~00(遅)

DF xx
Sustain Level設定。
xx: 07(普)~00(小)

E0 xx
フェードアウト(Sustain rate)指定。
値が大きいほど音の減衰が急になります。値は0x00~0x1F

E1
ADSR の値を初期値に戻す(DD xx ~ E0 xx の解除)

E2 xx ~ E3
~の部分をxx+1回繰り返します。2重ループが可能です。
たとえば E2 07 25 E2 と記述するとレの16分音符を8回繰り返します。
リズムパートなどはこれをうまく使えばデータ量をかなり減らすことができます。

E4 ~ E5
~の部分にポルタメントがかかり、音程の変化がスムーズになります。
ただし、途中で休符をはさむと解除されます。

EB
ループしない場合のデータ終端。

F0 xx
テンポ指定。指定できる値は00~FFで、00=遅い、FF=早い、となります。
音楽記号のテンポ指定とほぼ同じ値で良いようです。
Channel1の先頭で最低1回は設定する必要があります。
曲の途中で変更することもできます。

F1 xx yy
テンポを速度xxでyyの値に変化させます。

F2 xx
エコーボリューム指定。指定できる値は00~7Fです。
Channel1の先頭で最低1回は設定する必要があります。
曲の途中で変更することもできます。

F4 xx
エクスプレッション指定。指定できる値は00~7Fで、7Fが最大です。
ボリュームレベルと併せて音量を調節できます。
曲の途中で変更することもできます。

F5 xx yy zz
E2~E3の中で使用し、xx回目のループ時にアドレスyyzzへジャンプします。
通常は途中でループを抜けるときに使います。
アドレスは下位2バイトのみ指定します。
例えば 0A 0B 0C 0D 0B 0C 0E のようなメロディのとき、0B 0C の部分は同じですが、
0D 0Eが邪魔でループにできません。
この場合に
0A E2 01 0B 0C F5 02 yy zz 0D E3 0E (yy zzは0Eのアドレス)
と書くことができます。
ループカウンタは正常に破棄してくれるようです。

F6 xx xx
指定するアドレス(下位2バイトのみ指定)へジャンプする。
曲をループさせる必要があるため、各Channelの最後でループ開始位置へ戻してやる必要があります。

F7 xx
エコーフィードバック強度指定。指定できる値は00~FFで、FFが最強です。
戦闘曲に対するエコー設定は効果音にも影響するので、変えないほうが良いです。
Channel1の先頭で最低1回は設定する必要があります。
曲の途中で変更することもできます。

F8 xx
FIRフィルタ係数指定。低音強調、高音強調などのフィルタが使用できるようですが、詳細は不明です。
特に使用しない場合は00で良いようです。
Channel1の先頭で最低1回は設定する必要があります。
曲の途中で変更することもできます。

FC xx yy
イベントコードでF7が設定されている場合に限り、xxyyにジャンプします。
記事メニュー
目安箱バナー