TOP > プログラミング関係解説&調査 > シーケンスデータ

シーケンスデータ

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

サウンドについて及び、サウンドデータも参照のこと。

このページには、シーケンスデータ(BGM・効果音の楽譜データ)における、シーケンスデータの構造と、シーケンスコマンドの一覧・説明を掲載している。
調査過程や実際のシーケンスデータの例などはシーケンスデータ調査にあるので合わせて参照していただきたい。

シーケンスデータの構造

BGM用 シーケンスデータ一覧も参照のこと。

シーケンスデータは、BGMだとバンク$C5・$C6に格納されていて、演奏時にARAMのアドレス$1C00~に転送される。
曲によりシーケンスデータ量は変動するが、ARAMのアドレス$1C00~$2BFFがBGM用シーケンスデータ領域なので、サイズは$1000バイト以下でなければならない。
ARAMのアドレス$2C00~$47FFは、効果音用シーケンスデータの領域であり、タイトル画面をロードした時点で書き込まれている。
だが、エンディング曲の「Live for Live」だけ容量が$2AB7バイトで、サイズが$1000バイトを越えている。
この場合どうなるかというと、ARAMのアドレス$1C00を転送開始位置として、ARAMのアドレス$2C00を越えて上書きする。
「Live for Live」の後は各キャラの効果音を鳴らして終了となりタイトル画面に戻るため、効果音関係のデータを上書きしても問題ないようである。

シーケンスデータはヘッダ部分とシーケンスコマンド部分に分かれる。

BGMのヘッダ

BGMのヘッダはすべて2バイトのデータ。
バンク$C5・$C6に格納されている時は最初に2バイト分、容量を記したデータがついているが、ARAMアドレス$1C00~に転送されるのは下表の$02以降なので、ARAMでのヘッダは$24バイト(36バイト)。

No.内容
$00~$01容量
$02~$03シーケンスコマンド開始位置アドレス
$04~$05シーケンスコマンド終了位置アドレス
$06~$07チャネル0開始位置アドレス
$08~$09チャネル1開始位置アドレス
$0A~$0Bチャネル2開始位置アドレス
$0C~$0Dチャネル3開始位置アドレス
$0E~$0Fチャネル4開始位置アドレス
$00~$11チャネル5開始位置アドレス
$12~$13チャネル6開始位置アドレス
$14~$15チャネル7開始位置アドレス
$16~$17チャネル0開始位置アドレス
$18~$19チャネル1開始位置アドレス
$1A~$1Bチャネル2開始位置アドレス
$1C~$1Dチャネル3開始位置アドレス
$1E~$1Fチャネル4開始位置アドレス
$10~$21チャネル5開始位置アドレス
$22~$23チャネル6開始位置アドレス
$24~$25チャネル7開始位置アドレス

アドレスはバンク$C5・$C6に格納されている時のアドレス(2バイト)で、ARAMのアドレスではない。

スーパーファミコンでは8音まで同時に演奏できるので、これらをチャネル0~チャネル7としている。楽譜でいえば8段。
開始位置アドレスがシーケンスコマンド終了位置アドレスと同じである場合、そのチャネルのシーケンスデータはなしということであり、該当チャネルは演奏しない。

効果音のヘッダ

ゲーム開始時(リセット時)に、効果音のシーケンスデータ$C3:23C8~$C3:3FC7はARAMアドレス$2C00~$47FFにコピーされるが、この中で$C3:23C8~$C3:27C7(ARAMアドレス$2C00~$3000)がヘッダ部分で、効果音256個のARAMでのアドレスが記されている。
効果音はチャネル6とチャネル7の2チャネルで演奏されるため、ヘッダ部を4バイトずつ区切ると、効果音ID$00~$FFのチャネル6とチャネル7のアドレスが2バイトずつ入っている。
実際の値は、サウンド(BGM・効果音) > 効果音一覧に掲載している。
シーケンスコマンド開始位置はARAMアドレス$3000だが、アドレスに$0000が書き込まれている場合、該当チャネルの演奏は「なし」の意味。

シーケンスコマンド

本作のシーケンスコマンドは、スーパーファミコンソフト「ロマンシング・サガ2」のシーケンスコマンドとほとんど同一のようである。
また、「ロマンシング・サガ2」のシーケンスコマンドについては、詳細な解説サイト様が既に存在している。

上ウェブサイト様の解説は専門的で詳しいので参考にしていただいた方が良いのだが、デジタルサウンドやMIDIの知識がないとややわかりにくい箇所があるため、MIDIの素人の筆者がほどほどに頑張って説明してみたのが当ページである。
他にも、
MIDI機能/音色を作る/SPCエディタ - PukiWiki
なども参考にさせていただいた。
感謝する次第である。

ティック(Tick)数について
デジタルサウンド・MIDIにおける音の長さの単位。分解能。
「4分音符の長さを何ティックに分割するか」で定義される数値で、分割数が大きいほど、より小さな時間で音を変化させられ、複雑な音の表現ができる。
とりあえず、音の演奏時間のことを考えて差し支えない。
ティック数一覧表は、$C3:1D8C~$C3:1D99→ARAMアドレス$1846~$1853にコピーされて使われている。
音符の長さ(4分音符とか)は、ティック(Tick)数で決められている。

引数について
シーケンスコマンドの中には、コマンドの後に引数(パラメータ)で何らかの数値を指定するものがある。
例えばトラック音量設定はコマンド$C4で、引数にxx(1バイト値)が必要。
引数は音量で、$00~$FFを設定を設定する。
シーケンスデータ内に「C4 80」という記述があったら、「トラック音量を$80に設定」ということである。
引数でアドレスが指定されている場合、BGMは、シーケンスデータが格納されているバンク$C5・$C6におけるアドレス基準で計算されている。効果音はARAMでのアドレス値。

$00~$C3 サウンド演奏(音符、休符、タイ)

内容
指定サウンド(Note)の演奏、サウンドを伸ばす、休符
値内容
$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休符(音演奏なし)
ティック数$C0$60$40$48$30$20$24$18$10$0C$08$06$04$03
音符名全音符2分音符-付点
4分音符
4分音符-付点
8分音符
8分音符-16分音符-32分音符-64分音符
ド$00$01$02$03$04$05$06$07$08$09$0A$0B$0C$0D
ド#$0E$0F$10$11$12$13$14$15$16$17$18$19$1A$1B
レ$1C$1D$1E$1F$20$21$22$23$24$25$26$27$28$29
レ#$2A$2B$2C$2D$2E$2F$30$31$32$33$34$35$36$37
ミ$38$39$3A$3B$3C$3D$3E$3F$40$41$42$43$44$45
ファ$46$47$48$49$4A$4B$4C$4D$4E$4F$50$51$52$53
ファ#$54$55$56$57$58$59$5A$5B$5C$5D$5E$5F$60$61
ソ$62$63$64$65$66$67$68$69$6A$6B$6C$6D$6E$6F
ソ#$70$71$72$73$74$75$76$77$78$79$7A$7B$7C$7D
ラ$7E$7F$80$81$82$83$84$85$86$87$88$89$8A$8B
ラ#$8C$8D$8E$8F$90$91$92$93$94$95$96$97$98$99
シ$9A$9B$9C$9D$9E$9F$A0$A1$A2$A3$A4$A5$A6$A7
タイ$A8$A9$AA$AB$AC$AD$AE$AF$B0$B1$B2$B3$B4$B5
休符$B6$B7$B8$B9$BA$BB$BC$BD$BE$BF$C0$C1$C2$C3

ティック(Tick)数については上の「ティック(Tick)数について」参照。

音符やタイなどは、実際にはS-DSPのI/Oポートアドレス$4C(キーオン KON)にキー(鍵盤)を押すという指示をし、規定のティック数後にI/Oポートアドレス$5C(キーオフ KOFF)にキーを押すことをやめろ、という指示(サブルーチン)をひとまとめにしたもの。
ゲーム開発時、毎回そういうサブルーチンを書いていたら面倒だから、シーケンスコマンドを決めて、シーケンスコマンドを読み取ったら規定のサブルーチンを実行、というようなことをしている(はず)

$C4 xx トラック音量設定

引数
xx:音量 $00~$FF
内容
対象チャネルの音量をxxに設定する。

$C5 xx yy トラック音量変化

引数
xx:変化処理回数 $00~$FF
yy:音量 $00~$FF
内容
対象チャネルの音量をxxティックかけてyyに設定する。

$C6 xx パン(音の定位)設定

引数
xx:パン $00~$FF
内容
対象チャネルの左右のサウンドボリュームを調節して音の中心位置を変更する。
音楽用語でいうところのパン(音の定位)設定。
引数に設定する値は、$00 (左)~$80 (中央・モノラル)~$FF (右)。

$C7 xx yy パン(音の定位)変化

引数
xx:変化処理回数 $00~$FF
yy:パン $00~$FF
内容
対象チャネルのパン(音の定位)をxxティックかけてyyに設定する。 引数に設定する値は、$00 (左)~$80 (中央・モノラル)~$FF (右)。

$C8 xx yy ピッチスライド

引数
xx:変化処理回数 $00~$FF
yy:ピッチ(音の高さ)変化 $00~$FF ※符号あり8ビット整数(-127~0~+127)
内容
対象チャネルのピッチ(音の高さ)をxxティックかけてyyぶんだけ変動させる。
カラオケでいうところのキーの上げ下げのこと(ただし時間をかけてゆるやかに変える)。
+1すれば半音上がり、-1すれば半音下がる。

$C9 xx yy zz ビブラート設定

引数
xx:実行前待機時間 及び 揺れ方 $00~$FF
yy:周期 $00~$FF
zz:揺れ方 及び 揺れの大きさ $00~$FF
内容
対象チャネルにビブラート(音の高さを細かく揺らす)をかける。
xxティック待機してから、xxとzzの上位2ビット(合計10ビット)で揺れ方設定。
zzの下位6ビットで揺れの大きさを設定。 4.5*(yy+1)ミリ秒で1周期揺らす。

※細かい計算は
シーケンスコマンド一覧 - Romancing Sa・Ga 2 - スーパーファミコンのサウンドドライバ - Gnilda のページ
を参照してください。
「ライブ・ア・ライブ」でも計算方法が同一かは未確認。

$CA ビブラート解除

内容
対象チャネルのビブラートを解除する。

$CB xx yy zz トレモロ設定

引数
xx:実行前待機時間 及び 揺れ方 $00~$FF
yy:周期 $00~$FF
zz:揺れ方 及び 揺れの大きさ $00~$FF
内容
対象チャネルにトレモロ(音の大きさを細かく揺らす=小刻みに演奏する)をかける。
ビブラートの音量バージョン。

※細かい計算は
シーケンスコマンド一覧 - Romancing Sa・Ga 2 - スーパーファミコンのサウンドドライバ - Gnilda のページ
を参照してください。
「ライブ・ア・ライブ」でも計算方法が同一かは未確認。

$CC トレモロ解除

内容
対象チャネルのトレモロを解除する。

$CD xx yy オートパン設定

引数
xx:周期 $00~$FF
yy:揺れ方 及び 揺れの大きさ $00~$FF ※符号あり8ビット整数(-127~0~+127)
内容
対象チャネルのパン(音の定位)が0 ~ yy ~ 0 ~ -yy……と、xxから計算する値のティック数で周期的に左右に揺れ続ける。

※細かい計算は
シーケンスコマンド一覧 - Romancing Sa・Ga 2 - スーパーファミコンのサウンドドライバ - Gnilda のページ
を参照してください。
「ライブ・ア・ライブ」でも計算方法が同一かは未確認。

$CE オートパン解除

内容
対象チャネルのオートパンを解除する。

$CF xx ノイズクロック設定

引数
xx:ノイズクロック $00~$FF
内容
S-DSPのI/Oポートアドレス$006C FLG(リセット・ミュート・エコー書き込みフラグとノイズクロック)におけるBit0~4、ノイズ発生器のクロック数の設定。
(要するにザーザーという感じの雑音っぽいノイズを発生させる周波数みたいなものの設定)

$D0 ノイズ オン

内容
対象チャネルにそれまでに設定されていた音を停止し、ノイズを発声する。

$D1 ノイズ オフ

内容
対象チャネルにそれまでに設定されていたノイズを停止し、コマンド$DCで指定していたサンプリングデータ音に切り替える。

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

内容
対象チャネルに、一つ前のチャネルのS-DSP内部の値 (OUTX) を用いてピッチ(音の高さ)変調をかける。
(性質上、チャネル0の前はないからこの動作はチャネル0には無効)

※ OUTX:
S-DSPのI/Oポートアドレス$00X9(Xはチャネル数)に設定される、現在、S-DSPを通して各チャネルで出しているピッチ変調前の音のこと。

$D3 ピッチモジュレーション オフ

内容
対象チャネルのピッチ変調の停止。

$D4 エコー オン

内容
対象チャネルにエコーをかける。

$D5 エコー オフ

内容
対象チャネルのエコーの停止。

$D6 xx オクターブ設定

引数
xx:オクターブ $00~$FF
内容
対象チャネルのオクターブの値をxxに変更する。

$D7 オクターブ +1

内容
対象チャネルのオクターブの値を+1する。

$D8 オクターブ -1

内容
対象チャネルのオクターブの値を-1する。

$D9 xx キートランスポーズ値設定

引数
xx:トランスポーズ値 $00~$FF ※符号あり8ビット整数(-127~0~+127)
内容
対象チャネルのトランスポーズ値(キー)をxxに設定する。既定値は$00。

$DA xx キートランスポーズ値相対設定

引数
xx:トランスポーズ値変化量 $00~$FF ※符号あり8ビット整数(-127~0~+127)
内容
対象チャネルのトランスポーズ値(キー)を「現在値+xx」に設定する。

$DB xx ディチューン

引数
xx:ピッチ調整 $00~$FF ※符号あり8ビット整数(-127~0~+127)
内容
対象チャネルの音またはタイ用コマンド処理で計算されるピッチの値を調整する。既定値は$00。

※細かい計算は
シーケンスコマンド一覧 - Romancing Sa・Ga 2 - スーパーファミコンのサウンドドライバ - Gnilda のページ
を参照してください。
「ライブ・ア・ライブ」でも計算方法が同一かは未確認。

$DC xx サンプリングデータ選択

引数
xx:ARAMにセットされたサンプリングデータNo($00~$1Fは効果音用サンプリングデータID、$20~$2FはBGMに設定されたBGM用サンプリングデータID)
内容
対象チャネルのサンプリングデータ(音色)をxxにする。
BGMに使用されているサンプリングデータID一覧も参照のこと。

$DD xx アタックレート(Attack Rate)設定

引数
xx:アタックレート($00~$0F)
内容
対象チャネルのアタックレート(音の立ち上がりの速さ)をxxに設定。
S-DSPのI/Oポートアドレス$00x5 VxADSR1 (音声xのアタック・ディケイ・サスティン・リリース設定 1)と、アドレス$00X6 VxADSR2 (音声xのアタック・ディケイ・サスティン・リリース設定 2)の該当チャネル値が更新される。

$DE xx ディケイレート(Decay Rate)設定

引数
xx:ディケイレート($00~$07)
内容
対象チャネルのディケイレート(アタックで最大音量に達した後、サスティンレベルまで音量が減衰する速さ)をxxに設定。
S-DSPのI/Oポートアドレス$00x5 VxADSR1 (音声xのアタック・ディケイ・サスティン・リリース設定 1)と、アドレス$00X6 VxADSR2 (音声xのアタック・ディケイ・サスティン・リリース設定 2)の該当チャネル値が更新される。

$DF xx サスティンレベル(Sustain Level)設定

引数
xx:サスティンレベル($00~$07)
内容
対象チャネルのサスティンレベル(ディケイが落ち着いた後に持続する音量レベル)をxxに設定。
S-DSPのI/Oポートアドレス$00x5 VxADSR1 (音声xのアタック・ディケイ・サスティン・リリース設定 1)と、アドレス$00X6 VxADSR2 (音声xのアタック・ディケイ・サスティン・リリース設定 2)の該当チャネル値が更新される。

$E0 xx サスティンレート(Sustain Rate)設定

引数
xx:サスティンレート($00~$1F)
内容
対象チャネルのサスティンレート(サスティンレベル)に達した後、音量が0に向かう(音量の減衰する)速さをxxに設定。
S-DSPのI/Oポートアドレス$00x5 VxADSR1 (音声xのアタック・ディケイ・サスティン・リリース設定 1)と、アドレス$00X6 VxADSR2 (音声xのアタック・ディケイ・サスティン・リリース設定 2)の該当チャネル値が更新される。

$E1 ADSR初期化

内容
対象チャネルのDD・DE・DF・E0コマンドでトラックに設定された値を「DCコマンドで自動的に設定される音色に対応した値」に初期化する。

$E2 xx ループ開始位置

引数
xx:カウントダウンカウンタの初期値($00~$FF)
内容
対象チャネルのループ開始位置を設定する。ループの中にもループを設定できる(最大4個まで)。
コマンド$E3と合わせて使うため、次項目の$E3の解説も参照のこと。

カウントダウンカウンタ値は、$00または$FFを設定するとループ内を無限ループ。
$01~$FEを設定すると、xx + 1がループ上限回数になる。
※xx = $00の時、E3・F6コマンドで最も内側のループを抜ける処理を実行しない。

$E3 繰り返し・ループ終了

内容
対象チャネルのループ処理を行う。$E2で決定した引数xxで処理が変わる。
  • $E2の引数xx = $00
    最も内側のループ開始位置へジャンプする(無限ループ)
  • $E2の引数xx = $01
    最も内側のループを抜ける。
  • $E2の引数xxが$02以上
    引数xxを-1して、最も内側のループ開始位置へジャンプする。

$E4 スラー開始

内容
対象チャネルの音を伸ばす。
コマンド$DC・$E6・$E5、休符で解除される。

$E5 スラー終了

内容
対象チャネルのスラーを終了する。

$E6 レガート開始

内容
対象チャネルをレガートで演奏する(音を途切れさせずに滑らかに演奏する)。
コマンド$DC・$E4・$E7、休符で解除される。

$E7 レガート終了

内容
対象チャネルのレガートを終了する。

$E8 xx 音長(待機時間)設定

引数
xx:音長($00~$FF)
内容
対象チャネルの音符、タイ、休符で適用する待機ティック数をxxに設定する。
つまり次の音を鳴らす、休符を入れるまでの待機時間を設定する。

$E9 xx 効果音演奏 1

引数
xx:効果音ID($00~$FF)
内容
効果音IDxxのチャネル6のシーケンスコマンドを演奏する。

$EA xx 効果音演奏 2

引数
xx:効果音ID($00~$FF)
内容
効果音IDxxのチャネル7のシーケンスコマンドを演奏する。

$EB 演奏終了

内容
対象チャネルの演奏を終了する。
$EB(または$E3ループ終了)を区切りとして次のチャネルの値を設定していく。
(最後のチャネルには区切りはいらないため、最後に$EBを記す必要はない)

$EC~$EF, $F8, $FB~$FF 割り当てなし

内容
指示の割り当てなし。何もしない。
もしかすると$F9や$FAも割り当てなしかもしれない(要調査)

$F0 xx 音楽演奏速度基本値設定

引数
xx:音楽演奏速度基本値($01~$FF)
内容
全てのチャネルの演奏速度(テンポ)を設定する。

※「ロマサガ2」だと、BPM(beats per minute, 1分間に刻まれる拍の数で表現された、拍の速度)は、
BPM = (8000/36)*60/(256/xx)/48
と、計算されるとのこと。
値が小さいとテンポが遅く、値が大きいとテンポが速い。
xxに$00を設定してしまうと、256/0はゼロ除算になり計算できないので、コマンド処理が無効になるようである。

$F1 xx yy 音楽演奏速度基本値変化

引数
xx:変化処理回数($01~$FF)
yy:音楽演奏速度基本値($01~$FF)
内容
全てのチャネルの音楽演奏速度基本値をxxティックかけてyyで計算されるBPMに変化させる。

$F2 xx エコーボリューム設定

引数
xx:エコーボリューム($00~$FE)
内容
全てのチャネルのエコーボリュームを(xx>>1)に設定する。
※xx>>1は符号なし8ビット整数の論理右シフト1回分(/2)

$F3 xx yy エコーボリューム変化

引数
xx:変化処理回数($00~$FF)
yy:エコーボリューム($00~$FE)
内容
全てのチャネルのエコーボリュームをxxティックかけて(yy>>1)に設定する。
※yy>>1は符号なし8ビット整数の論理右シフト1回分(/2)

$F4 xx yy エコーフィードバック設定・FIRフィルタ係数テーブル選択

引数
xx:エコーフィードバック($00~$FF) ※符号あり8ビット整数(-127~0~+127)
yy:FIRフィルタ係数テーブル番号($00~$03)
内容
全てのチャネルに対し、S-DSPのI/Oポートアドレス$00XF FIRx (エコーFIRフィルター係数x)に、下表のテーブル番号yyの値を設定する。
S-DSPのI/Oポートアドレス$000D EFB (エコーフィードバックボリューム)にxxを設定する。

※FIR(Finite Impulse Response, 有限インパルス応答)フィルタとは、特定の周波数成分を除去してノイズを消したり信号の平滑化に使うもの、と思っていただきたい。
本作においては特定の値の表を使うことでFIRフィルタをかけている、らしい。
詳しい説明は専門ウェブサイトを検索するなどしていただきたい(筆者もよくわかっていないので)。

「ロマサガ2」のFIRフィルタ係数テーブルは「ライブ・ア・ライブ」にも共通して存在している。

「ライブ・ア・ライブ」の場合、FIRフィルタ係数テーブルデータは$C3:1D6C~$C3:1D8B→ARAMアドレス$1826~$1845に転送されて使われている。

テーブル番号FIRフィルタ係数
FIR0FIR1FIR2FIR3FIR4FIR5FIR6FIR7
$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

$F5 xx 音楽音量設定

引数
xx:ボリューム($00~$FF)
内容
全てのチャネルのボリュームをxxに設定する。
既定値は$FF。

$F6 xx yyyy ループ内条件ジャンプ

引数
xx:処理回数($00~$FF)
yyyy:ジャンプ先アドレス($0000~$FFFF)
※2バイト値なので、F6 aa bb ccなら、ccbbと読むこと。
内容
対象チャネルにおいて、xxが最も内側のループでこのコマンドを処理した回数と等しい場合、アドレスyyyyへジャンプする。

$F7 xxxx ジャンプ

引数
xxxx:ジャンプ先アドレス($0000~$FFFF)
※2バイト値なので、F7 aa bbなら、bbaaと読むこと。
内容
対象チャネルにおいて、アドレスxxxxへジャンプする。


このページをシェアする

上へ