サウンド関係


1.注意事項

この文章の中で使用されている数値は音楽用語を除いて基本的に16進数です。
2バイトの数値をバイナリに記述する場合は、すべてリトルエンディアンです。
SFCのサウンド形式は共通フォーマットが存在しないため、この解析結果はほかのソフトには全く応用できません。


2.曲データの構成

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


3.波形データの指定

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

曲ごとの波形データを指定している場所は、0610DAから1曲につき32バイト単位で並んでいます。
曲の並び順は「サウンド関連のデータなど.txt」に記載しました。

参考:戦闘曲は0610FA〜061119です。

1つの波形を2バイトの数値で指定しているため、1曲につき16の波形が使用できることになります。
ここで指定できる数値は01〜FFだと思われます(未検証)が、効果音で使用される波形も含んでいるため
実際に音楽で使用できるものはそれほど多くありません。
詳細は不明ですが、同時に使用できない波形もあるようです。
たとえば05と28の波形を1つの曲の中で使おうとしたところ、全く音が出なくなりました。 
ここで指定した波形は、後述のシーケンスデータの中で20〜2Fとして指定できます。
この文書の最後に6スレ713さんが調べてくれた、波形番号と楽器の対応を載せておきました。

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

0x060FC6 - 0x0610D9 [size: 3]シーケンスデータオフセット
0x5E1960 - 0x5E19BF [size: 3]拡張シーケンスデータオフセット(5C-7B)
0x5A6750 - 0x5A68DB [size: 3]拡張シーケンスデータオフセット(7C-FE)

例:ラストダンジョン
01番にあるため、
0x060FC9、0x060FCA、0x060FCB
が対象になる。
それぞれの値は
9C、A8、CB
これをアドレス値の大きいものから読む。
CBA89C
この得た値から、 C00000 を引くと、シーケンスデータの始まりのアドレスが得られる(多くは最初のCを取るだけでよい)。
つまり、
0x0BA89C
からがラストダンジョンのアドレス値となる。
拡張領域のものの場合、C00000を引く必要はない。
得た値がそのままアドレス値となる。

シーケンスデータの位置も「サウンド関連のデータなど.txt」に記載しました。
データの終端のすぐ後から次の曲データが始まっているので、絶対にはみ出さないようにして下さい。

参考:戦闘曲のシーケンスデータは、0BA89C〜0BB0CBです。


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

先頭38バイトがヘッダ、残りが実データです。
ヘッダの内容は以下の通りです。(すべてリトルエンディアン)
SPCファイルの場合は、0x2300番地に、以下02の所から配置される。
Romancing Saga2は、0x1D00番地に、以下02の所から配置される。
 00,01 データ長。実データより長めに指定してかまいません。
 02,03 実データの開始アドレス下位2バイト
 04,05 シーケンスデータの終了アドレス+1の下位2バイト(ここを見ればデータの終端が分かります。)
 06,07 Channel1のシーケンス開始アドレス下位2バイト(02,03と同じになる)
 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と同じ値)を指定します。

参考:戦闘曲のデータ構造は以下のようになっています。
データ開始位置が0BA89Dなので、ヘッダは0BA89D〜0BA8C1です。
各Channelの開始アドレスは	Channel1:0BA8C2
				Channel2:0BAAC3
				Channel3:0BAF50
				Channel4:0BAC16
				Channel5:0BAA58
				Channel6:0BACA8
				Channel7:0BAD48
				Channel8:0BADF1
※実際のデータがChannel番号順に並んでいる必要はありません。
データの終端が0BB0CBなのでヘッダは以下のようになります。
2E 08 C2 A8 CC B0 C2 A8 C3 AA 50 AF 16 AC 58 AA 
A8 AC 48 AD F1 AD C2 A8 C3 AA 50 AF 16 AC 58 AA 
A8 AC 48 AD F1 AD


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が最大です。
ロマサガ2は、00〜FFで、FFが最大。
各Channelの先頭で最低1回は設定する必要があります。
曲の途中で変更することもできます。

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

C6 xx
パンポット指定。
設定できる値は01〜7Fで、01=左より、3F=中央、7F=右より、となります。
ロマサガ2は、00〜FFで、80が中央。
各Channelの先頭で最低1回は設定する必要があります。
曲の途中で変更することもできます。

C7 xx yy
パンポットを速度xx[ticks]でyyの値に変化させます。

C8 XX YY
ポルタメント開始。
XX[ticks]で、音程がYY×100[cent]推移させます。

C9 XX YY ZZ
音程LFOの指定。
XXがディレイで、YYが周期、ZZが振幅です。

CA
音程LFO解除。

CB xx yy zz
音量LFOの指定。
xxがディレイで、yyが周期、zzが変動幅です。

CC
音量LFO解除。

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

CE
パンポットLFO解除。

CF XX
ノイズ発生器のクロック

D0
ノイズon

D1
ノイズoff

D2
ピッチモジュレーションon

D3
ピッチモジュレーションoff

D4
リバーブ on

D5
リバーブ off

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

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

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

D9 XX
移調
指定した音程から、XX×100[cent]ずれます。

DA XX
相対移調。D9コマンドで指定した音程からXX×100[cent]ずれます。

DB XX
ディチューン

DC xx
波形(楽器)指定。
指定できる値は00〜FFだと思われます(未検証)。
項番3.で登録した波形データは20〜2Fで使用できます。それ以外の値はPSG音源の機械的な音になります。
各Channelの先頭で最低1回は設定する必要があります。
曲の途中で変更することもできます。

DD xx
ハードウェアエンベロープ:Attack Rate

DE xx
ハードウェアエンベロープ:Decay Rate

DF xx
ハードウェアエンベロープ:Sustain Level

E0 xx
ハードウェアエンベロープ:Sustain Rate

E1
ハードウェアエンベロープを、音色の規定値に戻す。

E2 xx
リピート開始点
xxで、リピート回数-1を指定する。

E3
リピート終了店
たとえば E2 07 25 E2 と記述するとレの16分音符を8回繰り返します。
リズムパートなどはこれをうまく使えばデータ量をかなり減らすことができます。

F5 xx yy zz
(ロマサガ2は、F6 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のアドレス)
と書くことができます。
ループカウンタは正常に破棄してくれるようです。

E4
スラー/レガート開始
音符間のキーオフをなくし、音程の変化をスムーズにします。
ただし、途中で休符をはさむと解除されます。

E5
スラー/レガート終了

E6
スラー/レガート開始(再発音あり)
音符間のギャップをなくして演奏をスムーズにします。
E4とは異なり、発音時にはエンベロープが通常通りリセットされます。
たとえばティンパニのロール奏法などに使用できます。

E7
スラー/レガート終了(再発音あり)

E8 XX
次の音符・休符(0x00〜0xC3コマンド)の音長を、強制的にXX[ticks]にする。

E9 XX
効果音のch1を鳴らす?
具体的には APU RAM の $3100+A*4 に書かれたアドレスにジャンプします。

EA XX
効果音のch2を鳴らす?
具体的には APU RAM の $3102+A*4 に書かれたアドレスにジャンプします。

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

EC〜EE、FE〜FF
未使用(EBと効果は同じ)

EF
未使用、ch7とch8の状態を変更します。通常の用途には使い道がなさそうです。

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

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

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

F3 xx yy
エコー・ボリュームを、xx[ticks]で、yyの値まで変化させます。

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

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

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

F8 xx
(ロマサガ2は、F9 xx?)
FIRフィルタ係数指定。低音強調、高音強調などのフィルタが使用できるようです。
値の範囲は00〜03で、特に使用しない場合は00で良いです。
Channel1の先頭で最低1回は設定する必要があります。
曲の途中で変更することもできます。

00: 7F 00 00 00 00 00 00 00
01: 0C 21 2B 2B 13 FE F3 F9
02: 58 BF DB F0 FE 07 0C 0C
03: 34 33 00 D9 E5 01 FC EB

F9 XX
FAに関係、通常の用途では使用しません。
FA XX YY ZZ
CPUから設定される変数の値とXXを比較し、条件を満たせばZZYYにジャンプします。
術戦車戦の走行音で使用されています。

FB
(ロマサガ2は、ドラムセット機能無し)
ドラムセット適用。
各音程に打楽器があてがわれます。
設定方法は文末の付録2を参照してください。

FC
(ロマサガ2は、ドラムセット機能無し)
ドラムセット解除。

FD XX
効果音XXを鳴らします。オリジナルではXXに80前後の値が使われています。
「プロローグ〜死食の脅威」「ジャングル」で使用されています。

●付録1

【波形データと楽器の対応】(未完成)
01 管楽器
02 ホルン系
03 弦楽器
04 Harp
05 ボイス系
06 Finger Bass
07 Slap Bass
12 Trumpet
16 ギター系
17 弦楽器
19 ブラス系
1A ホルン系
1B MusicBox
1C Celesta
1D エレキギター系
22 Whistle
28 Synth Strings
29 Strings
2A エレキギター系
2B Clavi
2C ギター系
2D ギター系
2E Xylophone
30 弦楽器
31 ボイス系
33 ボイス系
35 Pick Bass
38 Acoustic Bass
39 Santur
3B ボイス系
3C 管楽器
3E Ocarina
4B Organ?

08 Bass Drum
09 Tom
0A Cymbal
0B Hi-hat Open
0C Hi-hat Closed
0D Snare Drum
0E Snare Drum
0F Cymbal
10 Timpani
11 Conga
13 Maracas
14 コンガのようなタム
15 Brush?
18 銅鑼
1E Vibraslap
1F Agogo
20 Snare Soft
21 Bell?
23 Bass Drum Soft
24 Hi-hat Closed
25 Hi-hat Pedal
26 Electric Bass
27 Electric Snare
2F 金属的な音
32 金属的な音
34 効果音
36 効果音
37 効果音
3A 効果音
3D 効果音
3F 効果音
51 Jingle Bell

ROM拡張パッチを当てると以下の追加波形(楽器)が組み込まれます。

53 オーケストラヒット(拡張パッチv4.1)
54 ドラム(拡張パッチv4.1)
55 マリンバ(713さん作、拡張パッチv4.2)
56 エレキギター(拡張パッチv5.0)
57 エレキギター(拡張パッチv5.0)
58 オーケストラヒット(拡張パッチv5.0)
59 ピアノ(拡張パッチv5.0)
5A ストリングス(713さん作、拡張パッチv6.2)
5B 笛(713さん作、拡張パッチv6.2)
5C ブラス(713さん作、拡張パッチv6.2)
5D フルート(713さん作、拡張パッチv6.2)
5E フィドル(◆SLOWgTTrWoさん作、拡張パッチv8.0)
5F オルガン(◆SLOWgTTrWoさん作、拡張パッチv8.0)
60 バストロンボーン(◆SLOWgTTrWoさん作、拡張パッチv8.0)
61 ピアノ(拡張パッチv9.1)
62 サックス(拡張パッチv9.1)


●付録2

【ドラムセットの設定方法】
ドラムセットの設定は0x061C5Aから曲番号順に36バイト固定長で並んでいます。
このデータの中身は、ド〜シの音に各3バイトで以下のようになっています。
1バイト目:波形番号(シーケンスデータ内で指定する方)
2バイト目:音の高さ
3バイト目:ボリューム
音の高さは、オクターブ0のドが00、オクターブ0のド#が01という風に続きます。
ド=0 ド#=1 レ=2 レ#=3 ミ=4 ファ=5 ファ#=6 ソ=7 ソ#=8 ラ=9 ラ#=10 シ=11
として、オクターブ*12の値を足せば計算で割り出すことができます。
オクターブ5のレなら、5 * 12 + 2 = 62(0x3E)となります。



スペシャルサンクス
6スレ713さん いろいろ解析を進めてもらったり、間違いを指摘してもらっています。いつも乙です。
6-357さん ツール製作中に発見された制御コードの情報を提供してもらっています。
最終更新:2013年06月16日 14:56