TOP > プログラミング関係解説&調査 > サウンドについて > シーケンスデータ調査

サウンドについて > シーケンスデータ調査

当ページの内容は、ある程度のプログラミングの知識を必要とする。
まず、プログラミング関係解説&調査をひととおり読んでいただきたい。

本作のシーケンスデータの仕様については不明であるが、色々と調べてみた結果は
シーケンスデータ
にまとめてある。
ここでは、シーケンスデータ一覧を調べた経緯などを記してある。

シーケンスデータはMIDIと似たようなものだと前に記したが、MIDIとの大きな相違点は、統一された規格はないということである。
シーケンスデータ(と、サンプリングデータ)はSPC700用のプログラムが処理してS-DSPにデータを送る。
ゲーム毎にSPC700用のプログラムがあり(本作なら$C3:0746~$C3:1F0EからARAM$0200~$19C8に入るデータ)、シーケンスデータはSPC700用のプログラムで処理できるように作られている。
では本作の仕様はどうなっているのか。
まったくヒントがないわけではなく、同時期に発売されたスクウェアのRPGの中で幾つかは先達による研究により、シーケンスデータの内容を解説したウェブサイトもいくつかある。

スクウェアのスーパーファミコンのRPGのシーケンスデータ・コマンドの詳細は、ありがたいことに下に一覧があった。
(しかも日本語である、スーファミのデータといえば海外の英語のデータが大半なので本当に助かる……)

上ウェブサイト様には、「ファイナルファンタジー」4~6(ファイナルファンタジーは以降「FF」と省略する)、「クロノ・トリガー」、「ロマンシング・サガ」1~3(ロマンシング・サガは以降「ロマサガ」と省略する)のシーケンスデータの解説がある。
これらのゲームのサウンド・プログラムを手掛けた赤尾実氏(赤尾実 - Wikipedia)は「ライブ・ア・ライブ」のサウンド・プログラム担当でもあるため、ある程度までは共通した仕様があるようだ。

なお、上ウェブサイト様の解説は、かなり専門的な部分まで踏み込んだ内容なので、やや難解な部分については、以下で筆者が個人的にわかりやすいような表記にした(つもり)。

では、「ライブ・ア・ライブ」は上で紹介されているゲームの中で、どのゲームのサウンドプログラムに近いのだろうか。
「ライブ・ア・ライブ」発売前後について、FF、ロマサガ、クロノトリガーの発売順と、データ容量を並べてみると、以下のようになる。
参照:スクウェア (ゲーム会社) - Wikipedia 他

発売日タイトル容量
1992年12月6日ファイナルファンタジーV16メガビット
1993年12月10日ロマンシング サ・ガ216メガビット
1994年4月2日ファイナルファンタジーVI24メガビット
1994年9月2日ライブ・ア・ライブ16メガビット
1995年3月11日クロノ・トリガー32メガビット

「ライブ・ア・ライブ」は「FF6」と「クロノ・トリガー」の間だから、この2作品に近いシーケンスの構造だろう。
ただ、「FF6」と「クロノ・トリガー」は、「ライブ・ア・ライブ」よりもゲームデータの容量が大きいので、「ライブ・ア・ライブ」よりサウンドプログラムも大きい可能性がある。つまり、仕様がそこそこ違うかもしれない。
「ライブ・ア・ライブ」の前年発売、かつ容量が同じ16メガビットの「ロマサガ2」の方に近い可能性も考えられる。

3作品のシーケンスデータの内容を比較してみると、実はあまり大きな違いはない。
シーケンスデータに使えるコマンドは$00~$FFの256種類割り振られているのだが、$00~$E9までは3作品で共通であることがわかる。
その後の$EA以降には差がある(コマンド指定値が異なるだけで内容は同じものもあるが)。

後々で説明していくが、おそらく本作は「ロマサガ2」とほぼ共通のシーケンスコマンドを使っている。
容量が同一なこともあり、仕様がかなり近いのだろう。
余談だが、「FF5」と「ロマサガ2」では、シーケンスコマンドの配置がかなり変更されており、「FF5」と「ロマサガ2」の間でサウンドプログラムにはそれなりに仕様変更が行われたようだ。
(仕様が変わったといってもスーパーファミコンのハード自体に変更はないので、メーカー側でスーパーファミコンのサウンドに関する研究が進み、サウンドプログラムもより洗練されていった、という意味である)

その他のウェブサイトも参考にさせていただいた。
まとめてみるとだいたい以下のようになる。

BGM用シーケンスデータのヘッダ

本作の場合、BGM用シーケンスデータの頭の2バイトは容量(バイト)で、それ以降の値がARAMに入るが、データの冒頭、つまりヘッダはだいたい、

  • シーケンスデータのサイズ(2バイト)
  • チャネル0~7の開始アドレス(各2バイト)

が、入るようである。
ここの「開始アドレス」は、元々のシーケンスデータの入っているアドレスのことで、ARAMに転送後のことではない。
「ライブ・ア・ライブ」ならバンク$C5~$C6にBGMのシーケンスデータが入っているが、このシーケンスデータのアドレス部にあたる。
つまり、シーケンスデータの中で、チャネル0のデータはここから、チャネル1のデータはここから、……という指示がヘッダに入っている。

シーケンスコマンド

「シーケンスコマンド」とは、シーケンスデータ内に記された、「この値ならこの音をこの時間鳴らせ」とか、「ここからエコーをかけろ」といったコマンドのこと。ある種のプログラムである。
シーケンスコマンドはゲーム毎にプログラマーが独自に決めているが、先に記したとおり、「ライブ・ア・ライブ」の頃のスクウェアのRPGのサウンドプログラムは赤尾実氏が多数担当していたため(Wikipediaによれば、氏は「スクウェアの黎明期から同社作品においてほとんどのサウンドプログラムを一手に引き受けていた」そうである)、氏がサウンドプログラムを担当したゲームのシーケンスコマンドには共通点が多い。

シーケンスコマンドは大きく2種類あると考えて良い。
ひとつは楽譜でいうところの音符や休符にあたる演奏記号。
もうひとつはそれ以外、S-DSPでかけられるエフェクト(エコー、ノイズ)、ピッチ変更、ループ位置の指示、演奏停止指示……などなど。

音符・休符・タイ

「ロマサガ2」「FF6」「クロノ・トリガー」なら、音符の記述方法は以下のようになる。
(「ライブ・ア・ライブ」も共通と見てよいようだ)

値内容
$00~$0DC(ド)を演奏
$0E~$1BC#(ド#)を演奏
$1C~$29D(レ)を演奏
$2A~$37D#(レ#)を演奏
$38~$45E(ミ)を演奏
$46~$53F(ファ)を演奏
$54~$61F#(ファ#)を演奏
$62~$6FG(ソ)を演奏
$70~$7DG#(ソ#)を演奏
$7E~$8BA(ラ)を演奏
$8C~$99A#(ラ#)を演奏
$9A~$A7B(シ)を演奏
$A8~$B5タイ(前の音を伸ばす)
$B6~$C3休符(音演奏なし)

音符や休符1個につき1バイトの値ということなのだが、なぜ同じ「C(ド)」の音なのに値が$00~$0Dと14段階分の幅があるのか?
それは、値が音の演奏の長さになるからである。休符なら休符の長さで、タイの音の演奏長さも同じ。
(なお、タイの指示をする場合、ひとつ前に何かの音を出していなければ何の意味もない)

例えば「C(ド)」なら、$00~$0Dは以下を示す。
ティック数はデジタルサウンド・MIDIにおける音の長さの単位のこと。詳しくは後述。
分数は1小節に占める長さ(相対比)のようなものと思っていただきたい。

値ティック数相対比音符名
$00$C01/1全音符
$01$601/22分音符
$02$401/3-
$03$483/8付点4分音符
$04$301/44分音符♩
$05$201/6-
$06$243/16付点8分音符
$07$181/88分音符♪
$08$101/12-
$09$0C1/1616分音符
$0A$081/24-
$0B$061/3232分音符
$0C$041/48-
$0D$031/6464分音符

値が小さいほど演奏する時間は長い、ということである。
1/3や1/6、1/12といった長さの音符は三連符などに使うのだろう。

ティック(Tick)数は、デジタルサウンド・MIDIにおける音の長さの単位というか、分解能。
「4分音符の長さを何ティックに分割するか」で定義される数値で、分割数が大きいほど、より小さな時間で音を変化させられ、複雑な音の表現ができる。
詳しいことは何かしらで検索していただきたい。
とりあえず音の長さの単位と思っていただければ良い。

また、音の範囲は1オクターブ分ということになる。
オクターブを上げる、または下げる場合は後述のコマンドで行っている。

効果など

「ロマサガ2」「FF6」「クロノ・トリガー」いずれも、シーケンスコマンド$C4以降は効果など各種演奏の指示である。
色々と調べた結果、「ライブ・ア・ライブ」のコマンド$C4以降は「ロマサガ2」とほぼ共通のようである。

シーケンスコマンドの内容によっては引数がある。
例えば、シーケンスコマンド$C4はトラック音量設定(演奏曲全体の音量設定ではない)で、

C4 xx

のように、設定したい音量を引数としてxxに続ける。

xx : トラック音量 ($00~$7F)

となる。
一方、シーケンスコマンド$C5はトラック音量変化。音量設定と同じように見えるが内容は変わり、

C5 xx yy
xx : 変化処理回数 ($00~$FF)
yy : トラック音量 ($00~$7F)

引数が2種類ある。要するに処理回数分滑らかに音量を変化させるためのコマンドである。
その他のシーケンスコマンドについての詳細な説明は、
シーケンスコマンド一覧 - Romancing Sa・Ga 2 - スーパーファミコンのサウンドドライバ - Gnilda のページ
にあるので参照していただきたい。

本作の例

実際に「ライブ・ア・ライブ」のシーケンスデータについて調べてみよう。
まず、一番簡単そうなシーケンスデータである、近未来編のオルガン関係をあたってみることにする。
1曲だけでは比較対象もなくわかりにくいため、まずは、

  • BGMID$40「効果音(近未来編・オルガン むすんでひらいて)」
  • BGMID$43「効果音(近未来編・オルガン チョコボのテーマ)」

を見てみよう。
どちらの曲もサンプリングデータはオルガンのみで単音が続き、曲の長さもたった2小節である。
筆者が聞いた感じだと以下のような楽譜になる、と思う。

  • BGMID$40は「ラ ラ ソ ファ ファ ソ ソ ファ」
  • BGMID$43は「レ シ ソ ミ レ シ ソ ソ ソ ラ ソ ファ ソ」

で合っていると思う。リズムはズレているかもしれない。
休符が挟まる可能性もあるが、音符の総数は合っているはずだ。

BGMID$40のシーケンスデータは$C6:BD2B~$C6:BD72で、最初の2バイトはデータ容量($0046バイト)。
BGMID$43のシーケンスデータは$C6:BE13~$C6:BE63で、最初の2バイトはデータ容量($004Fバイト)。
16バイト区切りで並べると以下のようになる。

;BGMID$40
46 00 51 BD 73 BD 51 BD 73 BD 73 BD 73 BD 73 BD
73 BD 73 BD 73 BD 51 BD 73 BD 73 BD 73 BD 73 BD
73 BD 73 BD 73 BD F0 96 F2 28 F4 46 00 D4 C6 80
D9 F9 DC 20 C4 F0 D6 05 3F BD 3D 24 07 BD 07 BD
23 BD 23 BD 03 BD F8 EB 

;BGMID$43
4F 00 39 BE 64 BE 39 BE 64 BE 64 BE 64 BE 64 BE
64 BE 64 BE 64 BE 39 BE 64 BE 64 BE 64 BE 64 BE
64 BE 64 BE 64 BE F0 8A F2 28 F4 46 00 D4 C6 80
DC 20 C4 D2 D6 05 23 BD D8 A1 6A C0 3F D7 24 C0
D8 A2 C0 6A C0 6B BF 6B 87 6B BF 4F BF 65 BD F8
EB 

前半部分に明らかな共通点が見られる。
ヘッダとして最初の2バイトはデータ容量、以降がチャネル0~7の開始アドレス(各2バイト)と仮定して、最初のデータ容量部分は除いて4バイト区切りで並べてみる。

;BGMID$40
51 BD 73 BD
51 BD 73 BD
73 BD 73 BD
73 BD 73 BD
73 BD 73 BD
51 BD 73 BD
73 BD 73 BD
73 BD 73 BD
73 BD 73 BD
;…… 

;BGMID$43
39 BE 64 BE
39 BE 64 BE
64 BE 64 BE
64 BE 64 BE
64 BE 64 BE
39 BE 64 BE
64 BE 64 BE
64 BE 64 BE
64 BE 64 BE
;…… 

サンプリングデータはオルガンの1種類しか使っていないから、チャネル0~7の開始アドレスが16バイト続くとしたら、チャネル0(オルガン)の開始位置は、

  • BGMID$40:アドレス$BD51から開始
  • BGMID$43:アドレス$BE64から開始

と、いうことだと思う。
最初の2バイトはアドレス開始位置、次の2バイトはアドレス終了位置として、次からの16バイトはチャネル0~7の開始アドレス。ただしなぜか2セットある。

;BGMID$40
51 BD 73 BD ;データ開始・終了位置指定

51 BD 73 BD ;チャネル0~7の開始アドレス
73 BD 73 BD ;
73 BD 73 BD ;
73 BD 73 BD ;ここまで

51 BD 73 BD ;チャネル0~7の開始アドレス
73 BD 73 BD ;
73 BD 73 BD ;
73 BD 73 BD ;ここまで

こう区切れば、まあまあわからなくはないのだが……
これは他の曲のデータも見なければ、なぜアドレスをこれだけの容量を割いて指定しているのやら、よくわからない。

シーケンスデータ

では、チャネル0開始位置以降を見てみよう。
実質、ここからデータ終わりまで、チャネル0のデータのみのはずだ。
「ロマサガ2」のシーケンスコマンドをそのまま当てはめてみると、うまくいくかどうか? の確認をしてみた。
用語も
シーケンスコマンド一覧 - Romancing Sa・Ga 2 - スーパーファミコンのサウンドドライバ - Gnilda のページ
を、そのまま流用させていただいた。
ただ、音階だけは筆者の耳コピの値を書き入れている。後で説明していく。

;BGMID$40
F0 96      ;音楽演奏速度基本値設定 ($01~$FF)
F2 28      ;エコーボリューム設定 ($00~$FE)
F4 46 00   ;エコーフィードバック設定
D4         ;エコー オン
C6 80      ;パン(左右の音)設定 $00 (左) ~ $80 (中央・モノラル) ~ $FF (右) 
D9 F9      ;キートランスポーズ値設定($80~$7F)
DC 20      ;サンプリングデータ選択(ARAMに入ったサンプリングデータの位置の番号)
C4 F0      ;トラック音量 ($00~$FF)
D6 05      ;オクターブ設定 ($00~$0F)
;チャネル0演奏(音符)
3F         ;ラ 8分音符
BD         ;8分休符
3D         ;ラ
24         ;ソ
07         ;ファ 8分音符
BD         ;8分休符
07         ;ファ 8分音符
BD         ;8分休符
23         ;ソ 8分音符
BD         ;8分休符
23         ;ソ 8分音符
BD         ;8分休符
03         ;ファ
BD         ;8分休符
F8         ;?
EB         ;演奏終了

;BGMID$43
F0 8A      ;音楽演奏速度基本値設定 ($01~$FF)
F2 28      ;エコーボリューム設定 ($00~$FE)
F4 46 00   ;エコーフィードバック設定
D4         ;エコー オン 
C6 80      ;パン(左右の音)設定 $00 (左) ~ $80 (中央・モノラル) ~ $FF (右) 
DC 20      ;サンプリングデータ選択(ARAMに入ったサンプリングデータの位置の番号)
C4 D2      ;トラック音量 ($00~$FF)
D6 05      ;オクターブ設定 ($00~$0F)
;チャネル0演奏(音符)
23         ;レ 8分音符
BD         ;8分休符
D8         ;オクターブ-1
A1         ;シ 8分音符
6A         ;ソ
C0         ;休符
3F         ;ミ 8分音符
D7         ;オクターブ+1
24         ;レ
C0         ;休符
D8         ;オクターブ-1
A2         ;シ
C0         ;休符
6A         ;ソ
C0         ;休符
6B         ;ソ 16分音符
BF         ;16分休符
6B         ;ソ 16分音符
87         ;ラ 16分音符
6B         ;ソ 16分音符
BF         ;16分休符
4F         ;ファ 16分音符
BF         ;16分休符
65         ;ソ 付点4分音符
BD         ;8分休符
F8         ;?
EB         ;演奏終了

筆者の見た限り、「ロマサガ2」のシーケンスコマンドはほぼそのまま使えているようである。
「DC 20」で指定されたサンプリングデータの位置の番号は、BGMの場合$20からナンバリングされ、どちらもサンプリングデータが同一(オルガン)であることを示しているし、音符や休符については、メロディは耳コピと同じで(後述)、音を途切れさせるために音と音の間に休符が入っていることがわかる。
ちなみにこのデータを「FF6」のシーケンスコマンドで読んでいくと、コマンド$F4でつまずくことになる。

  • ロマサガ2:
    F4 xx yy エコーフィードバック設定・FIR フィルタ係数テーブル選択
  • FF6:
    F4 xx 音楽音量設定

と、内容も引数の種類も異なる。
「F4 46 00 D4」を「FF6」のシーケンスコマンドで読むと「F4 46」が音楽音量設定で、次が「00」だから「ド」の音になってしまうのだが、どちらの曲も最初の音は「ド」ではない。
このため、この時点で、コマンド$F4について「FF6」のシーケンスコマンドとは内容が異なることが確定である。

問題は、コマンド$F8という、「ロマサガ2」一覧にはなかったシーケンスコマンドが最後にあるという点。
どちらも「F8 EB」で終了しているのだが、これだけでは、

  • コマンド$F8がEBという引数を取っているのか?
  • コマンド$F8, コマンド$EB(演奏終了)という2つのコマンドに分かれるのか?

がわからない。
他のシーケンスデータと比較して判断するより他なさそうだ。

ということで、以降もひとまずは、「ロマサガ2」のシーケンスコマンドで読み進めていく。

その他についても説明していく。

音符

音符についてだが、BGMID$43(チョコボの曲)については音階が「ロマサガ2」のシーケンスコマンドと一致する。
BGMID$40(むすんでひらいて)は耳コピとズレている。
例えば筆者が「ラ」と聞き取った$3Fは、実際には「ミ」の8分音符である。
このズレはBGMID$40だけ設定されている、

D9 F9      ;キートランスポーズ値設定($80~$7F)

ここに起因している。
キートランスポーズ値というのは、カラオケでいうところのキー設定のことだと考えていただきたい。
調(キー)の変更で音階自体を上げ下げしているのである。

D9の引数に$F9が設定されているが、キートランスポーズ値設定の値が$80~$7Fなのは、引数に設定できるのが符号付き8ビット整数(10進数の-127から+127)だからであって、$F9は-7にあたる。
「ミ」から半音ずつ下げていくと「#レ」→「レ」→「#ド」→「ド」→「シ」→「#ラ」→「ラ」と、-7した時点で「ラ」になる。
ということで、本来より半音ずつ-7したキーで演奏した結果が耳コピの音になっていたのである。
また、キートランスポーズ値を設定しない場合は自動的に「D9 00」、つまりキー変化なしという設定になるそうである。

シーケンスコマンドの仕様上、ド~シの1オクターブ分の範囲外の音を演奏したい場合は、まずオクターブ変更(コマンド$D7か$D8)を使わなければならない。
BGMID$40(むすんでひらいて)は、楽譜のままだと、演奏中にド~シの1オクターブ分をはみ出すのでオクターブ変更が必要になるが、「調(キー)を予め変更した楽譜を作って、実際の演奏では調(キー)を最初の楽譜通りに設定する」ことでオクターブ変更を回避しているのだと思う。この方がデータ量が少なくて済む。

ループする曲

次は、比較的データ量は少ないがループする曲を見てみよう。
ここでは、BGMID$0C「猛者達…」($C5:EE73~$C5:F0BE, $024Bバイト)を見てみることにした。
現代編の対戦相手セレクト画面の曲で、4小節(8小節?)でループする。
楽譜の構造でいえば8小節だと下のような感じ(楽譜1段分)。
(実際は4小節の気がするが、8小節の方がループをわかりやすくできそうなので……)

ループが短いためか、8音すべて使っているにも関わらずシーケンスデータ量は少なめの方である。
こちらでも、「ロマサガ2」のシーケンスコマンドをそのまま使ってみることにする。
ループのジャンプ先をわかりやすくするため、ループ位置に①~④と丸数字をつけている。

;ヘッダ
4B 02       ;容量$024Bバイト
99 EE C0 F0 ;データ位置

99 EE 32 EF ;チャネル0設定$C5:EE99, チャネル1設定$C5:EF32
76 EF 89 EF ;チャネル2設定$C5:EF76, チャネル3設定$C5:EF89
AF EF D5 EF ;チャネル4設定$C5:EFAF, チャネル5設定$C5:EFD5
0E F0 4E F0 ;チャネル6設定$C5:F00E, チャネル7設定$C5:F04E

99 EE 32 EF ;
76 EF 89 EF ;
AF EF D5 EF ;
0E F0 4E F0 ;

;チャネル0設定$C5:EE99
F5 B8       ;音楽音量設定
F0 80       ;音楽演奏速度基本値設定
C6 80       ;パン(左右の音)設定
F2 50       ;エコーボリューム設定
F4 5A 00    ;エコーフィードバック設定
;$C5:EEA4①
E2 01       ;ループ開始位置
DC 20       ;サンプリングデータ選択
C4 DE       ;トラック音量設定
D6 06       ;オクターブ設定

;チャネル0演奏$C5:EEAC
07          ;ド 8分音符
C4 C2       ;トラック音量設定
07          ;ド 8分音符
DC 21       ;サンプリングデータ選択
C4 F6       ;トラック音量設定
07          ;ド 8分音符
DC 20       ;サンプリングデータ選択
C4 C2       ;トラック音量設定
09          ;ド 16分音符
DC 21       ;サンプリングデータ選択
C4 B2       ;トラック音量設定
09          ;ド 16分音符
DC 20       ;サンプリングデータ選択
C4 C2       ;トラック音量設定
09          ;ド 16分音符
DC 21       ;サンプリングデータ選択
C4 B2       ;トラック音量設定
09          ;ド 16分音符
DC 20       ;サンプリングデータ選択
C4 C2       ;トラック音量設定
07          ;ド 8分音符
DC 21       ;サンプリングデータ選択
C4 F6       ;トラック音量設定
07          ;ド 8分音符
DC 20       ;サンプリングデータ選択
C4 C2       ;トラック音量設定
09          ;ド 16分音符
C4 DE       ;トラック音量設定
09          ;ド 16分音符
BF          ;16分休符
DC 21       ;サンプリングデータ選択
C4 B2       ;トラック音量設定
09          ;ド 16分音符
DC 20       ;サンプリングデータ選択
C4 DE       ;トラック音量設定
07          ;ド 8分音符
DC 21       ;サンプリングデータ選択
C4 F6       ;トラック音量設定
07          ;ド 8分音符
DC 20       ;サンプリングデータ選択
C4 B2       ;トラック音量設定
09          ;ド 16分音符
DC 21       ;サンプリングデータ選択
C4 C2       ;トラック音量設定
09          ;ド 16分音符
F6 02 12 EF ;②ループ内条件ジャンプ 処理回数$02 ジャンプ先$EF12
DC 20       ;サンプリングデータ選択
07          ;ド 8分音符
DC 21       ;サンプリングデータ選択
09          ;ド 16分音符
DC 20       ;サンプリングデータ選択
C4 B2       ;トラック音量設定
09          ;ド 16分音符
DC 21       ;サンプリングデータ選択
C4 F6       ;トラック音量設定
07          ;ド 8分音符
DC 20       ;サンプリングデータ選択
C4 C2       ;トラック音量設定
09          ;ド 16分音符
DC 21       ;サンプリングデータ選択
09          ;ド 16分音符
E3          ;③繰り返し・ループ終了
;$C5:EF12
DC 20       ;サンプリングデータ選択
C4 DE       ;トラック音量設定
09          ;ド 16分音符
DC 21       ;サンプリングデータ選択
C4 C2       ;トラック音量設定
09          ;ド 16分音符
C4 92       ;トラック音量設定
09          ;ド 16分音符
DC 20       ;サンプリングデータ選択
C4 C2       ;トラック音量設定
09          ;ド 16分音符
DC 21       ;サンプリングデータ選択
C4 F6       ;トラック音量設定
07          ;ド 8分音符
C4 92       ;トラック音量設定
09          ;ド 16分音符
C4 C2       ;トラック音量設定
09          ;ド 16分音符
F7 A4 EE    ;④$EEA4へジャンプ

まず、ヘッダとチャネル0の演奏部分だけ取り上げる。
ヘッダは容量やチャネル0~チャネル7の開始アドレスなど、オルガンの曲と同じなので、やはり「ライブ・ア・ライブ」においてヘッダは38バイト(そのうち容量を記した冒頭2バイトを除く36バイトをARAMに転送)と考えて良いようである。

$C5:EE99からチャネル0設定で、オルガンの曲にはなかった設定がいくつかある。

;チャネル0設定$C5:EE99
F5 B8       ;音楽音量設定
F0 80       ;音楽演奏速度基本値設定
C6 80       ;パン(左右の音)設定
F2 50       ;エコーボリューム設定
F4 5A 00    ;エコーフィードバック設定
;$C5:EEA4①
E2 01       ;ループ開始位置
DC 20       ;サンプリングデータ選択
C4 DE       ;トラック音量設定
D6 06       ;オクターブ設定

まず、シーケンスコマンド$F5の音楽音量設定がある。
これは曲に使う8チャネル全体の音量設定になる。
「ロマサガ2」だと、シーケンスコマンド$F5を設定しない場合、デフォルト値として$FFが音量設定になるそうである。

もうひとつはシーケンスコマンド$E2、ループ開始位置の指定。
$E2が書き込まれたアドレスが開始位置指定で、引数は「カウントダウンカウンタの初期値 ($00~$FF)」。
シーケンスコマンド$E2は$E3, $F6, $F7と合わせて使うのだが(演奏順により使う必要のないコマンドもある)、「猛者達…」は以下のような構造になっている。

E2 xx       ;①ループ開始位置
            ;xx : カウントダウンカウンタ初期値
            ;コマンドF6のカウントアップカウンタ値 (コマンド処理回数) を 0 に初期化する
;(処理1)
F6 aa bbbb  ;②ループ内条件ジャンプ
            ;aa : 処理回数, bbbb : ジャンプ先
;(処理2)
E3          ;③ループ終了位置
            ;カウントダウンカウンタが0なら無限ループ、1ならループ抜ける、2以上ならカウンタを-1してループ開始位置ジャンプ
;(処理3)
F7 zzzz     ;④ジャンプ zzzz : ジャンプ先

「猛者達…」だと、

E2 01       ;①EEA4 ループ開始位置 カウントダウンカウンタ初期値$01
;(処理1)
F6 02 12 EF ;②ループ内条件ジャンプ 処理回数$02 ジャンプ先$EF12
;(処理2)
E3          ;③繰り返し・ループ終了
;$EF12~(処理3)
F7 A4 EE    ;④$EEA4へジャンプ

こうなっている。
演奏順は、

  1. ①
  2. 処理1
  3. ②ループ内条件ジャンプの1回目通過(処理回数$02のため、通過させる)
  4. 処理2
  5. ③ループ抜けて①戻る
  6. 処理1
  7. ②ループ内条件ジャンプの2回目ジャンプ(処理回数$02のため、処理3にジャンプさせる)
  8. 処理3
  9. ④ループ頭に戻り処理1から無限ループ

こうなる。
さきほどの楽譜の、

処理1が楽譜でいうところの①~③で、処理2が楽譜④、処理3が楽譜⑤になる。丸数字が混ざりまくって申し訳ない。

ということで、ループ関係の処理も、「ロマサガ2」のシーケンスコマンドがそのまま使えるようだ。

音符部分だが、サンプリングデータNo.20と21を切り替えながら、8分音符または16分音符の「ド」をひたすら演奏している。
「猛者達…」サンプリングデータNo.20と21だが、サンプリングデータID$35と$34にあたり、ドラムセットの何かしらのドラムの音2種である(スネアドラムとかバスドラムとか)。筆者がドラムに詳しくないので、何がどれなのかわからないのは申し訳ない。

以降、チャネル1~7の演奏データが続くことになる。
なのだが、チャネル1~7にはシーケンスコマンド$E2, $E3, $F6によるループ位置の指定がない。
唯一$F7だけは指定がある。

例えばチャネル2は以下である。

;チャネル2設定$C5:EF76
DC 24       ;サンプリングデータ選択 ID$28低音のベース系?
C6 1C       ;パン設定
C4 8C       ;トラック音量設定
D6 04       ;オクターブ設定
D4          ;エコー オン
;チャネル2演奏 $EF7F
7E          ;ラ 全音符
AB          ;タイ 付点4分
B1          ;タイ 16分
89          ;ラ 32分音符
C1          ;32分休符
3C          ;ミ 4分音符
66          ;ソ 4分音符
F7 7F EF    ;$EF7Fへジャンプ

さきほどの楽譜の、

①~②で流す部分が、③~④も③~⑤でも共通だから、①~②をひたすらループ演奏しているので演奏部分がとても短いのである。
ただ、どのチャネルもループだけはするので、最後にシーケンスコマンド$F7で冒頭にジャンプする処理が必ず入っている。

……と、すべてのチャネル処理を見ても、先程のオルガンの曲で謎だったコマンド$F8が見当たらない。
どのチャネルも必ずコマンド$F7で終わっている。
コマンド$F8はループ処理のない曲でのみの何かしらなのだろうか?

他にループのない曲だと、同じく現代編に、BGMID$4C「Versus!」がある。
戦闘開始前のジングル的に使われている曲である。
アドレスは$C6:FA16~$C6:FBECなのだが、確認したところ、コマンド$F8はない。
ただ、コマンド$EB(演奏終了)はチャネル7以外の終わりに必ずついているので、コマンド$F8は引数を取らない単独コマンドである可能性が考えられる。

色々と調べてみたが、結局、コマンド$F8は「何も割り振られていない」か、効果音用の何かしら? という可能性がある。
シーケンスコマンド一覧 - Romancing Sa・Ga 2 - スーパーファミコンのサウンドドライバ - Gnilda のページ
にある、コマンド$EC~$EF, $FB~$FFの「演奏終了 2」も、実際には「何もしないコマンド」なのである。
おそらくだが$F8もそれではないだろうか。
例えば「開発中には何かを割り振っていたが使わなくなった」とか、「何かの指示を入れていたがやめたため、変更した場所に印をつけるために入れた」とか。
実際のところはわからないが。

ということで、まとめると、やはり「ライブ・ア・ライブでは、ロマサガ2のシーケンスコマンドがほぼそのまま使える」と考えて良い、と思う。
ここまでのまとめや一覧は、シーケンスデータに整理したので参照していただきたい。

残った謎だが、効果音についてのシーケンスデータ構造、コマンドについて確認していない上、
シーケンスコマンド一覧 - Romancing Sa・Ga 2 - スーパーファミコンのサウンドドライバ - Gnilda のページ
にある、

E9 xx 効果音演奏 1
EA 効果音演奏 2

このふたつについての解説はない。
ということで、次ページでは効果音のシーケンスデータについて調べてみている。

※当ページの楽譜画像の作成・編集は、ScoreTail様を使用しました。



このページをシェアする

上へ