基礎知識
戦闘関係
このページには、シーケンスデータ(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のヘッダはすべて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
なども参考にさせていただいた。
感謝する次第である。
| 値 | 内容 |
|---|---|
| $00~$0D | C(ド)を演奏 |
| $0E~$1B | C#(ド#)を演奏 |
| $1C~$29 | D(レ)を演奏 |
| $2A~$37 | D#(レ#)を演奏 |
| $38~$45 | E(ミ)を演奏 |
| $46~$53 | F(ファ)を演奏 |
| $54~$61 | F#(ファ#)を演奏 |
| $62~$6F | G(ソ)を演奏 |
| $70~$7D | G#(ソ#)を演奏 |
| $7E~$8B | A(ラ)を演奏 |
| $8C~$99 | A#(ラ#)を演奏 |
| $9A~$A7 | B(シ)を演奏 |
| $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)にキーを押すことをやめろ、という指示(サブルーチン)をひとまとめにしたもの。
ゲーム開発時、毎回そういうサブルーチンを書いていたら面倒だから、シーケンスコマンドを決めて、シーケンスコマンドを読み取ったら規定のサブルーチンを実行、というようなことをしている(はず)
※細かい計算は
シーケンスコマンド一覧 - Romancing Sa・Ga 2 - スーパーファミコンのサウンドドライバ - Gnilda のページ
を参照してください。
「ライブ・ア・ライブ」でも計算方法が同一かは未確認。
※細かい計算は
シーケンスコマンド一覧 - Romancing Sa・Ga 2 - スーパーファミコンのサウンドドライバ - Gnilda のページ
を参照してください。
「ライブ・ア・ライブ」でも計算方法が同一かは未確認。
※細かい計算は
シーケンスコマンド一覧 - Romancing Sa・Ga 2 - スーパーファミコンのサウンドドライバ - Gnilda のページ
を参照してください。
「ライブ・ア・ライブ」でも計算方法が同一かは未確認。
$006C FLG(リセット・ミュート・エコー書き込みフラグとノイズクロック)におけるBit0~4、ノイズ発生器のクロック数の設定。※ OUTX:
S-DSPのI/Oポートアドレス$00X9(Xはチャネル数)に設定される、現在、S-DSPを通して各チャネルで出しているピッチ変調前の音のこと。
※細かい計算は
シーケンスコマンド一覧 - Romancing Sa・Ga 2 - スーパーファミコンのサウンドドライバ - Gnilda のページ
を参照してください。
「ライブ・ア・ライブ」でも計算方法が同一かは未確認。
$00x5 VxADSR1 (音声xのアタック・ディケイ・サスティン・リリース設定 1)と、アドレス$00X6 VxADSR2 (音声xのアタック・ディケイ・サスティン・リリース設定 2)の該当チャネル値が更新される。$00x5 VxADSR1 (音声xのアタック・ディケイ・サスティン・リリース設定 1)と、アドレス$00X6 VxADSR2 (音声xのアタック・ディケイ・サスティン・リリース設定 2)の該当チャネル値が更新される。$00x5 VxADSR1 (音声xのアタック・ディケイ・サスティン・リリース設定 1)と、アドレス$00X6 VxADSR2 (音声xのアタック・ディケイ・サスティン・リリース設定 2)の該当チャネル値が更新される。$00x5 VxADSR1 (音声xのアタック・ディケイ・サスティン・リリース設定 1)と、アドレス$00X6 VxADSR2 (音声xのアタック・ディケイ・サスティン・リリース設定 2)の該当チャネル値が更新される。カウントダウンカウンタ値は、$00または$FFを設定するとループ内を無限ループ。
$01~$FEを設定すると、xx + 1がループ上限回数になる。
※xx = $00の時、E3・F6コマンドで最も内側のループを抜ける処理を実行しない。
※「ロマサガ2」だと、BPM(beats per minute, 1分間に刻まれる拍の数で表現された、拍の速度)は、
BPM = (8000/36)*60/(256/xx)/48
と、計算されるとのこと。
値が小さいとテンポが遅く、値が大きいとテンポが速い。
xxに$00を設定してしまうと、256/0はゼロ除算になり計算できないので、コマンド処理が無効になるようである。
$00XF FIRx (エコーFIRフィルター係数x)に、下表のテーブル番号yyの値を設定する。$000D EFB (エコーフィードバックボリューム)にxxを設定する。※FIR(Finite Impulse Response, 有限インパルス応答)フィルタとは、特定の周波数成分を除去してノイズを消したり信号の平滑化に使うもの、と思っていただきたい。
本作においては特定の値の表を使うことでFIRフィルタをかけている、らしい。
詳しい説明は専門ウェブサイトを検索するなどしていただきたい(筆者もよくわかっていないので)。
「ロマサガ2」のFIRフィルタ係数テーブルは「ライブ・ア・ライブ」にも共通して存在している。
「ライブ・ア・ライブ」の場合、FIRフィルタ係数テーブルデータは$C3:1D6C~$C3:1D8B→ARAMアドレス$1826~$1845に転送されて使われている。
| テーブル番号 | FIRフィルタ係数 | |||||||
|---|---|---|---|---|---|---|---|---|
| FIR0 | FIR1 | FIR2 | FIR3 | FIR4 | FIR5 | FIR6 | FIR7 | |
| $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 |
「4分音符の長さを何ティックに分割するか」で定義される数値で、分割数が大きいほど、より小さな時間で音を変化させられ、複雑な音の表現ができる。
とりあえず、音の演奏時間のことを考えて差し支えない。
ティック数一覧表は、
$C3:1D8C~$C3:1D99→ARAMアドレス$1846~$1853にコピーされて使われている。音符の長さ(4分音符とか)は、ティック(Tick)数で決められている。