◆qw.Y80Jhqg氏が過去にスレで投下した情報です。
ロマサガ1におけるサウンド関係情報として有益だと思ったので
掲載させていただきました。
解析等をして新情報を得た方がいましたら
この記事は加筆、訂正等ご自由になさってください。


ロマンシングサガ1 音楽解析結果

謝辞
この資料を書くにあたり、ロマシングサガ3の解析結果が大変参考になりました。
作者である2-658氏に感謝いたします。



1.波形データ

24980(+200h)から32バイト/曲で波形データを指定しています。
番号と指定される楽器の関係は未調査です。
ちなみに音のデータ(PCM)そのものは21941(+200h)から記録されているようです。
波形形式は他のロマサガ等のものと一緒です。

楽器の番号なかったので調べたの一応書いておきます。
自分で分からなかったものは一部2-658氏のtxtを引用しております。

0x05 下水道シンセ音
0x06 トランペット
0x07 フルート
0x08 オルゴール?

01 ストリングス
02 アコーディオン
03 コーラス
04 イングリッシュホルン(下水道・船旅の金管楽器)
05 ハープ
06 スチールギター?(南エスタミル)
07:?
08 スラップベース
09 ピックベース
0A オルゴール(ダンジョン1・クローディア)
0B バスドラ1(南エスタミル・下水道)
0C コンサートスネア
0D タム
0E オープンハイハット
0F クローズハイハット
10 シンバル
11 マラカス(アイシャ)
12 リムショット
13 タンバリン(迷いの森の謎音も)
14 コンガ(ボンゴ)
15:?
16 ウッドブロック
17 ティンパ二
18 バスドラ2(戦闘)
19 スネア
1A フルート(騎士の誇り)
1B:ストリングス
1C ソプラノサックス

2.シーケンスデータ

APU RAMのアドレス2000からがシーケンスデータになっています。
先頭18バイトがヘッダです。
ヘッダの内容は
 00,01 シーケンスデータの長さ(この2バイトを除いた長さになります)
 00,01 Channel1のシーケンス開始アドレス下位2バイト(APU RAM上のアドレス)
 02,03 Channel2のシーケンス開始アドレス下位2バイト
 04,05 Channel3のシーケンス開始アドレス下位2バイト
 06,07 Channel4のシーケンス開始アドレス下位2バイト
 08,09 Channel5のシーケンス開始アドレス下位2バイト
 0A,0B Channel6のシーケンス開始アドレス下位2バイト
 0C,0D Channel7のシーケンス開始アドレス下位2バイト
 0E,0F Channel8のシーケンス開始アドレス下位2バイト

SPCファイルにはヘッダがあるので、SPCファイルでの実際のアドレスは+100hされたものになります。
効果音はChannel8に割り込むようです(曲によってはChannel7にも割り込みます)

※シーケンスデータのある場所について
シーケンスデータが格納されているアドレスは24800(+200h)から3バイトずつで記されています
(リトルエンディアン)。ただ、ここのアドレス記載は少々特殊で、場合分けがあります。
記載されているアドレスが
050000以下の場合→そのままの値がアドレスになります
050001-058000の場合→+8000した値がアドレスになります
058000-060000の場合→+18000した値がアドレスになります

例えばオールドキャッスルなどで流れる曲はC0 D2 04 となっており、$04:D2C0=0252C0(+200h)が
シーケンスデータの場所になります。


3.音符の記述法則

━━━━━━━━━━━━━
バイトコード / 0F の商が音の高さで、余りが音の長さになります。


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

4.制御コード

調べた範囲で記載します。




①曲全体に関するコード

Channel1の先頭で指定されています。

D2 XX テンポ指定
    (BPMを0.9216倍した値で指定します。値が大きいほど早くなります。)
D3 YY XX テンポ推移
    YY 推移時間[ticks]
    XX 推移先のテンポ(計算式はD2と同じ)

D8 XX エコー・ボリューム(標準は3C)
D9 YY XX エコー・ボリューム推移
    YY 推移時間[ticks]
    XX 推移先のエコー・ボリューム

E6 XX YY エコーフィードバック強度、FIRフィルタ指定
    XX エコーフィードバック強度(符号付き8bit、負数で位相反転)
    YY FIRフィルタパターン(00~03)
     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

②個々のチャンネル毎に設定されるコード

D4 XX 音量指定(値が大きいほど大きくなる。最大値FF)
D5 YY XX ボリュームレベル推移
    YY 推移時間[ticks]
    XX 推移先の音量

D6 XX パンポット(00なら左からのみ、7Fで右からのみ聞こえるようになる)
D7 YY XX パンポット推移
    YY 推移時間[ticks]
    XX 推移先のパンポット

DA XX 移調(指定した値からXX[semitones]ずれる、負数も可)

DB XX YY ZZ ピッチスライド設定(ポルタメント等)
    XX 音程変化[semitones]
    YY ディレイ[ticks]
    ZZ 処理時間[ticks]

DC ピッチスライド解除

DD XX YY ZZ 音程LFO(弦楽器等のビブラート)on
    XX 振幅
    YY ディレイ[ticks]
    ZZ 周期 ZZ×48/40[ticks]
    ビブラート:音声を細かくふるわせる奏法。震動音。

DE 音程LFO(ビブラート)off

DF XX YY ZZ 音量LFO(管楽器等のビブラート)on
    XX 振幅
    YY ディレイ[ticks]
    ZZ 周期 ZZ×48/40[ticks]

E0 音程LFO(ビブラート)off

E1 XX ノイズ発生器のクロック
E2 ノイズon
E3 ノイズoff

E4 ピッチモジュレーションon
E5 ピッチモジュレーションoff

E7 これ以降エコーを有効にする
E8 これ以降エコーを無効にする

E9 XX ZZ パンポットLFO on
    XX 振幅
    ZZ 周期 ZZ×48/40[ticks]

EA パンポットLFO off

EB XX オクターブ指定(通常は04)
EC オクターブ・アップ
ED オクターブ・ダウン

EE XX リピート開始点 XXは、リピート回数
EF リピート終了点
F0 XX PPPP リピート内条件ジャンプ
    XXは、条件ジャンプするリピート回数
    PPPPは、条件ジャンプ先へのアドレス(下位16bit)

F1 PPPP 無条件ジャンプ(下位16bitのみ指定)
    無限ループ等に使われる。

F2 スラー開始
F5 スラー終了

F3 XX 楽器指定
F4 XX ソフトウェアエンベロープパターン設定

F6 PPPP 条件付きジャンプ
    メインCPUと協調するためのものと推測されるが、使用されていない。

F7 XX ディチューン(XX/16[semitones]ずらす)

F8 終止コード(ループせずに終わる曲[宿屋の曲など]の各チャンネル末尾に置かれる)

F9-FA 未使用、F8と同じ

5.参考例

例として南エスタミルの曲について解説します。
シーケンスデータは02C3FD(+200h)から始まっています。
Channel1はSPCデータの2010(+100h)から始まっており、これはROMでは02C40Dに当たります。
Channel1の先頭7バイトは以下のようになっています
D2 70 D8 3C E6 3C 00
これらは曲全体に関わる制御コードで、Channel1でのみ設定されます。
D2 70 テンポを70に設定
D8 3C エコーボリュームを3Cに設定
E6 3C 00 エコーフィードバック強度を3C、FIRをパターン0に設定

次の11バイトは以下のようになっています。
F3 20 D4 3C D6 1C F4 00 E7 EB 05

F3 20 波形20番を使用する
D4 3C ボリュームを3Cに設定
D6 1C ボリュームバランスを1C(左寄り)に設定
F4 00 エンベロープパターンを0に設定
E7 エコーを有効にする
EB 05 オクターブを05に設定


この後は音符データになります
0A ED AF 73 EC 0A

0A ド16分音符
ED 以降1オクターブ下がる
AF シ16分音符
73 ソ16分音符
EC 以降1オクターブ上がる
0A ド16分音符


Channel1の終端は以下のようになっています。
EC 26 B6 F1 20 20

EC 以降1オクターブ下がる
26 レ8分音符
B6 付点2分休符
F1 20 20 アドレス2020(+100h)にジャンプ

ロマサガ3ではROM上のアドレスを指定していましたが、1では
APU RAM上でのアドレスを指定します。この点に注意が必要です。
最終更新:2013年06月15日 19:29