トップ小ネタPrince of Persia > BGMデータ


※まだわかっていない部分もありますが、とりあえず判明済みなものだけを載せておきます。
  FM音源に対する知識がほとんどないので、間違ったことを書いてある可能性があります。

BGMデータ

音楽データが格納されているファイルです。拡張子は「MUS」です。
以下のファイルが該当します。
MUSIC1.MUS LEVEL4〜6,10〜11とデモ面
MUSIC2.MUS LEVEL1〜3,7〜9
MUSIC3.MUS LEVEL12-3
MUSIC4.MUS LEVEL12-1〜2
FIGHT.MUS 戦闘
FIGHTF.MUS 戦闘(ラスボス)
FIGHTK.MUS 戦闘(骸骨)
FIGHTS.MUS 戦闘(分身)
VICT1.MUS 戦闘勝利
EXIT.MUS 出口が開いた時の曲
CLEAR.MUS クリア
DEAD.MUS ミス(落下・トラップなど)
DEAD2.MUS ミス(敵にやられた時)
OPEN.MUS オープニング1
ROOM1.MUS オープニング2
ROOM2.MUS 中間デモ
END1.MUS エンディング1
END2.MUS エンディング2
END3.MUS エンディング3
TIMEOUT.MUS タイムオーバー
MENU.MUS メニュー画面
APPEAR.MUS ラスボス戦イントロ
APPEAR2.MUS ボス・分身出現
PICKUP.MUS 剣取得
KUSURI.MUS 薬(体力回復)
POWUP.MUS 薬(体力上限アップ)

データ構造
おおまかに分けると次のようなります。
 ・演奏情報
 ・フレーズ
 ・音色定義
音程などの譜面に相当する情報はフレーズ部に(フレーズ単位で)格納されています。
演奏情報部ではこれらのフレーズを呼び出す形で(フレーズを組み合わせて)再生していきます。
(例えば「フレーズAを再生」→「フレーズBを4回繰り返す」→「フレーズAを再生」→「最初に戻る」
 のような情報で構成されています。)
なお演奏情報は各パート(チャンネル)ごとに独立しています。

・演奏情報
<ヘッダ部>
最初にデータの開始位置や使用するチャンネルの情報が格納されています。
アドレス情報
$0 音色情報開始アドレス
$4 使用するチャンネル
$5〜各パートごとの演奏情報開始アドレス(2byte単位)
「使用するチャンネル」はbit単位の指定で、
bit0(+$1) … SSG1
bit1(+$2) … SSG2
bit2(+$4) … SSG3
bit3(+$8) … FM1
bit4(+$10) … FM2
bit5(+$20) … FM3
となります。 「各パートの開始アドレス」では開始アドレスの情報がパート数分(=使用するチャンネル数)だけ
続きますが、この時使用しないチャンネルはスキップします。
つまり、全チャンネル使用時は
$5 SSG1開始アドレス
$7 SSG2
$9 SSG3
$B FM1
$D FM2
$F FM3
となりますが、例えば$4の値が$2A(SSG2とFM1,3のみ使用)の場合
$5 SSG2
$7 FM1
$9 FM3
となります。

<演奏情報>
$5以降に記載されているアドレスから各パートの演奏情報が格納されています。
基本的に3byteのデータが連続しており、
1byte目 再生回数(0だと無限ループ?)
2,3byte目 再生するフレーズのアドレス(2byte)
となっています。
(例えば「02 40 01」なら$140に格納されているフレーズを2回繰り返して再生)
例外として、
1byte目が$FEの場合、(演奏情報の再生位置が)指定したアドレスへ移動します。(曲のループ時に使う)
1byte目が$FFの場合、そのパートは再生を終了します。(この場合のみ1byteのデータです)

・フレーズ
いわゆる譜面に相当するデータがフレーズ単位で細切れに格納されています。
このフレーズを組み合わせて一つの曲が構成されています。
データ自体はテキスト形式(というかMML形式)で、各データは$00で区切られています。
(ただし、一般的なMMLデータとは異なる点もあるので注意)

・一般的なMMLデータとの主な違い
コマンド一般的なMMLMUSデータ
T(テンポ指定) 1分あたりの4部音符の数 FM音源のTimer-Bの値
(=音長1あたりの時間に影響)
音長指定 1小節のn/1の長さ(=○付音符) 指定した値に正比例
(音長1の長さ*指定値)
※ちなみにLコマンドは存在せず、
 音長省略値は前回の値が使われる
シャープ 音程指定の「後ろ」につける(例:C#) 音程指定の「前」につける(例:#C)

・各コマンドの解説
 {n}の部分には任意の値が入ります。
コマンド 意味 解説
A〜G{n} 指定した音を鳴らす n=音長(大きいほど長い、音長1あたりの時間は後述)
C,D,E,F,G,A,Bの順でド〜シに対応
前に#をつけると(例:#C)半音上がる
音長省略値は前回の発音と同じ長さになる
R{n} 休符 n=長さ(A〜Gと同じ)
& スラー? 「C&D&E」のように各発音の間に入れて使う
&で結ばれた部分は発音しなおさずに音程のみを変更する
(音量エンベロープが初期化されずにそのまま継続される)
同じ音程の場合はタイと同様になる
※ビブラートのエンベロープも継続させたい場合は[,]を併用すること
[ ] &でのビブラート継続 [ ]で囲まれた部分は&でのスラー時、
次の音になってもビブラートのエンベロープが初期化されず、
そのまま継続される
T{n} テンポ指定 詳細は後述
※一般的なテンポ指定の方法である
 「1分あたりの四分音符の数」ではないので注意
 なお、値が大きいほどテンポが遅くなる
V{n} 音量指定 0〜15の間で指定
O{n} オクターブ指定
+ 1オクターブ上げる
- 1オクターブ下げる
^ 音量を1段階上げる
_ 音量を1段階下げる
){n} ピッチシフト 音源レジスタの音程に関係する値を(本来の値から)指定値分だけ加算する
!   (APPEAR、ROOM1で使用)
多分BGMと演出の同期をとるためのもの
Tコマンドでは、音源レジスタの$27(TIMER-B)に(255−指定値)の値が書き込まれます。
また、音長1あたりの時間=(Tの値+1)*288[μs]となります。
(μs(マイクロ秒):100万分の1秒、ミリ秒(1/1000秒)のさらに1/1000の長さ)
Tコマンドの指定値をT、4分音符分の音長をL、4分音符でのテンポをT'とすると、
TとT’は次のような式で変換できます。
T =(60000000÷ T' ÷288÷L)-1
T'=(60000000÷(T+1)÷288÷L)

・音色定義
ヘッダ部(上記参照)に書かれている音色定義開始アドレスからデータが格納されます。
始めは各音色番号ごとの定義データ開始位置が2byte単位で格納されます。
(音色番号は0からなので0→1→2...と続いていきます)
ここで示されたアドレスから実際の音色定義データが始まるのですが、
SSGとFMではデータ内容が異なります。

※以下の表は現在判明しているもののみです。(まだ未解明な部分もあります)
  また、値の有効範囲なども調べてはいません。
※アドレスはデータ先頭位置からの相対アドレスです。
※音源の各パラメータについてはここでは説明しきれないので、他のサイトを参照してください。

・SSG
アドレスデータ
$00アタック(音の立ち上がり)の長さ
(値が大きいほど長い)
$01ディケイ(減衰)の長さ
$02アタック・ディケイでの音量変化量
$03詳細は不明
$80以上でノイズ(値によって音の鳴り方が異なる)
$04ビブラート 音程変化量
$05ビブラート 音程変化の周期(変化の速さ)
$06ビブラート 音程変化パターン
bit単位での指定のようだが詳細は不明
$07ビブラート 開始までの時間

・FM
ビブラート以外の各パラメータは、基本的に音源レジスタに書き込まれる値が
そのまま格納されています。
アドレスデータ
$00 フィードバック(FB)/アルゴリズム(ALG)
$01〜04 ディチューン(DT)/マルチプル(ML)
(1byteごとにオペレータ(OP)1,2,3,4の順)
$05〜08 トータルレベル(TL) (OP1〜4)
$09〜0C キースケール(KS)/アタックレート(AR) (OP1〜4)
$0D〜10 ディケイレート(DR) (OP1〜4)
$11〜14 サスティンレート(SR) (OP1〜4)
$15〜18 サスティンレベル(SL)/リリースレート(RR) (OP1〜4)
$19〜1a ???(不明)
$1b ビブラート 音程変化量
$1c ビブラート 音程変化の周期(変化の速さ)
$1d ビブラート 開始までの時間
$1e ???(不明)
2つのパラメータが記載されているアドレスは、以下のようにbit単位での指定になります。
アドレス bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0
$00(FB/ALG) FB ALG
$01〜(DT/ML) DT ML
$09〜(KS/AR) KS AR
$15〜(SL/RR) SL SR

戻る