音声処理
音声の種類とデータ
本ゲームでは、13種類の曲と44種類の効果音が用意されています。
これらを演奏・出力するために、APU(スーパーファミコンの音声処理ユニット、SONY SPC700)で処理するためのバイナリデータがそのままの形でROM内に収録されています。詳細は未解析ですが、おそらくAPU制御用のプログラム、音声そのもの、楽器・音色等の割り当てを分離した管理データからなるものと推測しています。これらは ID 0~17 (欠番あり) で管理され、必要に応じて APU に転送されます。
これら音声データは、先頭にサイズ(2バイト)、APU転送先メモリアドレス※(2バイト)、末尾にゼロ(2バイト)が付加される形でROM内の各所に保存されており、その先頭アドレス(3バイト絶対アドレス)は、0x80fc65 ( この下位アドレスは 0x80f806 に保持) からの配列に保存されています。
※データによって、APUのメモリのどこに転送するかを固定して使用しているということを意味します。
これらを演奏・出力するために、APU(スーパーファミコンの音声処理ユニット、SONY SPC700)で処理するためのバイナリデータがそのままの形でROM内に収録されています。詳細は未解析ですが、おそらくAPU制御用のプログラム、音声そのもの、楽器・音色等の割り当てを分離した管理データからなるものと推測しています。これらは ID 0~17 (欠番あり) で管理され、必要に応じて APU に転送されます。
これら音声データは、先頭にサイズ(2バイト)、APU転送先メモリアドレス※(2バイト)、末尾にゼロ(2バイト)が付加される形でROM内の各所に保存されており、その先頭アドレス(3バイト絶対アドレス)は、0x80fc65 ( この下位アドレスは 0x80f806 に保持) からの配列に保存されています。
※データによって、APUのメモリのどこに転送するかを固定して使用しているということを意味します。
内訳は次の通りです。
ID | アドレス範囲 | サイズ ※本体のみ |
APU転送先 アドレス |
内容 |
---|---|---|---|---|
0 | 8c8158~8c8dc4 | 3175 | 0x380 | サウンドドライバプログラムコードと推定 |
1 | 8c8dc7~8c997b | 2991 | 0x3000 | 効果音詰め合わせデータ |
2 | 8d8000~8d8041 | 60 | 0x3e00 | 管理データA |
3 | 8f9430~8f945f | 42 | 0x3e00 | 管理データB |
4 | 8e8000~8e8059 | 84 | 0x3e00 | 管理データC |
5 | 8dd65c~8de23a | 3033 | 0x1000 | 曲ID 0,1,2の本体詰め合わせデータ |
6 | 8dff3e~※ | - | - | 無効データのため欠番と推定 |
7 | 8dff3e~※ | - | - | 無効データのため欠番と推定 |
8 | 8de751~8deaab | 853 | 0x1000 | 曲ID 3の本体データ |
9 | 8de23b~8de750 | 1296 | 0x1000 | 曲ID 4の本体データ |
10 | 8dff3e~※ | - | - | 無効データのため欠番と推定 |
11 | 8deaac~8dfab1 | 4096 | 0x1000 | 曲ID 5,6,12の本体詰め合わせデータ |
12 | 8ed324~8edde8 | 2751 | 0x1000 | 曲ID 7の本体データ |
13 | 8dfab2~8dff3d | 1158 | 0x1000 | 曲ID 8の本体データ |
14 | 8edde9~8ee079 | 651 | 0x1000 | 曲ID 9の本体データ |
15 | 8ee07a~8ee27f | 512 | 0x1000 | 曲ID 10の本体データ |
16 | 8ee280~8ef4f5 | 4720 | 0x1000 | 曲ID 11の本体データ |
17 | 8fc48a~8fc67b | 492 | 0x1000 | 未使用データ(曲ID 12の本体データの分離版) |
BGM演奏
BGMは、上記音声データの内、管理データと本体データおよびパート番号(0~2)により管理しています。パート番号は、複数の曲を詰め合わせたデータになっている時のパートを区別するもので、単一の曲で構成される場合は0番を指定します。
APU転送先アドレスがそれぞれ重複していることから分かる通り、BGMを切り替える際は、都度APUに該当するデータを転送しています。
※パート番号が異なるだけなら転送は行わず、パートの切り替えのみで対処します。
APU転送先アドレスがそれぞれ重複していることから分かる通り、BGMを切り替える際は、都度APUに該当するデータを転送しています。
※パート番号が異なるだけなら転送は行わず、パートの切り替えのみで対処します。
BGM毎の管理データ・本体データの組は、0x80c7fbからのワード配列で管理しています。ワードのうち先頭バイトが管理データのID(2,3,4)、後尾バイトが曲本体データのIDです。パート番号は、0x80c815からのバイト配列で管理しています。
以下、曲の対応です。正式な曲名は分からないのですが、世間一般的には ニコニコ動画のsm6647924 のような曲名で知られているようなので、本wikiでもそちらを採用します。
以下、曲の対応です。正式な曲名は分からないのですが、世間一般的には ニコニコ動画のsm6647924 のような曲名で知られているようなので、本wikiでもそちらを採用します。
曲ID | 音声データID | パート 番号 |
曲名 | 内容 | |
---|---|---|---|---|---|
管理 | 本体 | ||||
0 | 2 | 5 | 0 | Main Theme | 電源ON/リセット後に流れるテーマ |
1 | 2 | 5 | 1 | Opening Story | 導入部分のストーリー説明時に流れる曲 |
2 | 2 | 5 | 2 | Survivors | 一部重要人物救出イベント時の曲 |
3 | 3 | 8 | 0 | Four Separate Lives | 主人公選択画面の曲 |
4 | 2 | 9 | 0 | Calm Before the Storm | プロローグ時の曲 |
5 | 2 | 11 | 2 | Tidal Wave! | 転覆時に流れる曲 |
6 | 2 | 11 | 0 | The Sinking Ship | 転覆後のアクション中に流れるメインの曲 |
7 | 2 | 12 | 0 | Boiler Room | ボイラー室で流れる曲 |
8 | 3 | 13 | 0 | Rescuers | 生存エンディングや一部エピローグで流れる曲 |
9 | 3 | 14 | 0 | Chapel | 教会や、その他悲劇的なシーンで流れるレクイエム調の曲 |
10 | 3 | 15 | 0 | Game Over | ゲームオーバー画面の曲 |
11 | 4 | 16 | 0 | Staff Roll | エンディング後のスタッフロールの曲 |
12 | 2 | 11 | 1 | Grefiure | ミッシェルのバイオリン演奏時の曲 |
音声データのロード
音声データのAPUへの転送を司るサブルーチンは、0x8094d6 と 0x80955f の2系統あります。
しかし、実質として後者は呼ばれることがないため、前者のみが利用されているものとして解説を進めます。
しかし、実質として後者は呼ばれることがないため、前者のみが利用されているものとして解説を進めます。
この機能は、音声データ0のAPU制御コードをロードする前から使用できるため、APU組み込みの機能を利用したものと思われます。詳細は https://wiki.superfamicom.org/transferring-data-from-rom-to-the-snes-apu をご覧ください。
音声データ0(サウンドドライバ)に関しては、ゲーム開始時にサブルーチン 0x8096fc を通じて1度だけロードします。
その他(BGM用管理データ・本体データ)については、サブルーチン 0x809707 を通じて、必要に応じてロードします。
ただし、音声データ 1(SE詰め合わせ) に関してはゲーム開始時に1度だけロードします。
その他(BGM用管理データ・本体データ)については、サブルーチン 0x809707 を通じて、必要に応じてロードします。
ただし、音声データ 1(SE詰め合わせ) に関してはゲーム開始時に1度だけロードします。
APUの制御
制御概要
APUの制御は、サブルーチン 0x8095ce をコアとして、IOポート $2140, $2141 への書き込みによって実現します。
※両IOポートの読み込みは、制御指令の終了確認、チャンネル使用状況の確認に使われているものと推測しています。
※なお、サブルーチン 0x8095ce には、$2142 を使用したデータ転送の処理 ( 間接的に 0x80955f を呼ぶ処理含む ) も含まれますが、ゲーム中に呼ばれることはないようです。
※両IOポートの読み込みは、制御指令の終了確認、チャンネル使用状況の確認に使われているものと推測しています。
※なお、サブルーチン 0x8095ce には、$2142 を使用したデータ転送の処理 ( 間接的に 0x80955f を呼ぶ処理含む ) も含まれますが、ゲーム中に呼ばれることはないようです。
両IOポートは、対象および操作内容の指定($2140)と、処理に使用するデータ($2141)とに役割が分かれていますが、コード上はこの2ポート分のデータをまとめたワード値を「指令」の単位として使用します。
0x8095ce のサブルーチンは、$1e0a~$1e19 の領域をキューとみなした、最大8つの指令を個々に処理する働きを持ちます。ただ実際には、キューに指令を追加する 0x809631 と、キュー内の指令を全て実行する 0x8095bd を経由して使用します。
※0x809631 のサブルーチンは、$1e00 の「指令転送保留」が無効であれば、キューへの指令の追加と同時にキュー内の指令を全て実行する効果も持ちます。
0x8095ce のサブルーチンは、$1e0a~$1e19 の領域をキューとみなした、最大8つの指令を個々に処理する働きを持ちます。ただ実際には、キューに指令を追加する 0x809631 と、キュー内の指令を全て実行する 0x8095bd を経由して使用します。
※0x809631 のサブルーチンは、$1e00 の「指令転送保留」が無効であれば、キューへの指令の追加と同時にキュー内の指令を全て実行する効果も持ちます。
対象と操作
※これはコード上の操作体系から推測した内容であることにご注意ください!
SFCのAPUは8つの出力チャンネルを持っていますが、SEはいずれかのチャンネル(実際は4~7)を1つ使用して出力します。複数のSEを同時に出力する場合は、その分チャンネルを必要とします。このチャンネルが操作対象となります。
それとは別に、BGM出力用の仮想的なチャンネルが操作対象となります。実際には、0~7のうち必要なチャンネルをまとめて扱っているものと思いますが、内訳は不明です。
※複数の楽器を組み合わせるような演奏方式を採るため、BGMには複数のチャンネルが必要なことにご注意ください。なお、SE出力が複数同時に発生すると(典型的には複数キャラの落下による悲鳴発生)、経験上BGMの方に影響が出ることを確認しています。
それとは別に、BGM出力用の仮想的なチャンネルが操作対象となります。実際には、0~7のうち必要なチャンネルをまとめて扱っているものと思いますが、内訳は不明です。
※複数の楽器を組み合わせるような演奏方式を採るため、BGMには複数のチャンネルが必要なことにご注意ください。なお、SE出力が複数同時に発生すると(典型的には複数キャラの落下による悲鳴発生)、経験上BGMの方に影響が出ることを確認しています。
以下、$2140 に指定する操作および、$2141 に指定するデータを挙げます。
- BGM用仮想チャンネル対象
- 停止あるいは無音化 ( 操作 0x10 )
データ 0 を指定することで、演奏停止あるいは無音化を行うものと推定しています。( 未確認 ) - パート指定 ( 操作 0x20 )
データ 0~2 を指定することで、演奏するためのパート番号を設定します。
データ 0x80 を指定すると、実際に設定したパート番号の曲を演奏します。 - 音量設定 ( 操作 0x60 )
データとして、音量数値を指定します。
本ゲームでは 0xcd ( 205 ) を標準の音量として使用しています。
- 停止あるいは無音化 ( 操作 0x10 )
- SE用個別チャンネル対象
各操作共通で、操作の下3bit部分をチャンネル番号として解釈します。- 停止あるいは無音化 ( 操作 0x90~0x97 )
データ 0 を指定することで、演奏停止あるいは無音化を行うものと推定しています。( 未確認 ) - SE出力 ( 操作 0xa0~0xa7 )
SEのIDをデータとして指定することで、SEを出力します。 - チャンネル音声設定 ( 操作 0xe0~0xe7 )
データとして、音量数値を指定します。
- 停止あるいは無音化 ( 操作 0x90~0x97 )
API毎の制御内容
- サブルーチン 0x80969e ( 音量リセット )
操作 0x60, 0xe0~0xe7 にそれぞれデータ 0xcd を指定することで、音量をデフォルト値にリセットします。 - サブルーチン 0x8096e7 ( チャンネル音量設定 )
Yレジスタの値に0xe0を加算した値を操作として、Aレジスタで指定した音量を設定します。
なお、0 指定時はデフォルトの 0xcd と解釈します。
メモリ上の $1e6a~$1e71 に設定済みの音量を保持しておくことで、値が変わらない場合は処理をスキップします。 - サブルーチン 0x809715 ( 全チャンネル無効? )
操作 0x90~0x97 により、全チャンネルに対し停止あるいは無音化を行います。 - サブルーチン 0x80972b ( BGM開始 )
操作 0x20 によるパート番号の設定、0x60 による音量設定 ( デフォルトの 0xcd )、操作 0x20 による演奏開始を順次処理します。 - サブルーチン 0x809745 ( 空きチャンネルSE出力 )
IOポート $2141 を読み取り、4~6 の中で空きのチャンネルを探索した上で、当該チャンネルを指定してSEを出力します。( 空きがなければチャンネル6を使用します )
Aレジスタの上位バイトを 0x8096e7 に渡すことで、先に音量設定を行い、その後 0xa0+チャンネル番号の操作で、Aレジスタの下位バイトをIDとするSEの出力を行います。 - サブルーチン 0x809778, 0x80977d, 0x809782, 0x809785 ( SE出力 )
順に、チャンネル4,5,7,7を指定してSEを出力します。
チャンネルが固定となる以外は、上述の 0x809745 と指令内容は同じです。
なお、0x809782 のみ、音量・SEのIDの組 (Aレジスタ指定値) を $1e83 に保存します。 - サブルーチン 0x80978a ( BGM無効? )
操作 0x10 を処理します。 - サブルーチン 0x809799 ( APUチャンネル6,7無効? )
操作 0x96,0x97 を処理します。 - サブルーチン 0x8097ae ( APU指定チャンネル無効? )
Aレジスタで指定したチャンネル番号に対し、0x90 を加算した値を操作とします。 - サブルーチン 0x8097bd ( 音量ダウン? )
startボタンによるポーズを行った際の音量ダウン処理を行うものです。
操作 0x60 にデータ 0x64 ( 100 ) を指定した BGM の音量低下と、操作 0x97 によるチャンネル 7 停止または無音化を行います。 - サブルーチン 0x8097d8 ( 音量復帰? )
startボタンによるポーズから抜ける際の音量復帰処理を行うものです。
操作 0x60 にデータ 0xcd ( 205 ) を指定した BGM の音量復帰と、条件によっては操作 0xa7 にデータ 0 を指定した SE の出力を行います。
※ただし、その条件に該当する場合、このSE出力は直後の 0x809785 呼び出し ( $1e83 が対象 ) で上書きされるので意味がありません。 - サブルーチン 0x8097eb ( BGM音量倍率設定? )
Xレジスタの値÷256を倍率として、操作 0x60 によりBGM音量を 0xcd×倍率の値に設定します。 - サブルーチン 0x809863 ( 謎なBGM音量調整? )
計算方法の詳細は追っていませんが、操作 0x60 によりBGM音量を設定します。
計算した音量値が十分でない場合は、捜査 0x10 により停止あるいは無音化を行います。
効果音の種類
効果音は、ID 0~44 の45種類が存在し、最大チャンネル4~7の4種類を同時に使用します。
これら効果音は、サブのBGM的な位置付けで流し続けるもの、一時的に鳴らすだけのものとに大別できます。前者は主にチャンネル7で、後者は4~6の中で都度空いているチャンネルを使用して鳴らすのが一般的です。
※通常はチャンネル7を使う場合でも、イベントのコマンド129番の機能で鳴らす場合(プロローグ外)、4~6を使うようになります。ジェフリーEDでのID12が該当します。
これら効果音は、サブのBGM的な位置付けで流し続けるもの、一時的に鳴らすだけのものとに大別できます。前者は主にチャンネル7で、後者は4~6の中で都度空いているチャンネルを使用して鳴らすのが一般的です。
※通常はチャンネル7を使う場合でも、イベントのコマンド129番の機能で鳴らす場合(プロローグ外)、4~6を使うようになります。ジェフリーEDでのID12が該当します。
以下に一覧を挙げます。
ID | ch | 内容 | 場面 | 備考 |
---|---|---|---|---|
0 | 4,7 | 嵐 | エレベータ等BGMのない場所全般や、 プロローグでの上層やブリッジ |
BGMがない場所ではチャンネル4を使う傾向がある |
1 | 4~6 | 雷鳴 | プロローグの上層やブリッジ、休憩室等 | 音量200,150の強弱使い分けがある |
2 | - | 波のうねり? | 未使用 | |
3 | 5 | 暴雨 | ルークプロローグ | |
4 | 7 | 迫る波 | 転覆直前 | 同時にID10も使用する |
5 | 7 | 汽笛 | 開始時・ブリッジでのルークプロローグ | |
6 | 4~6 | 傾く船B | 傾きパターンB時の折り返し | |
7 | 4~6 | 傾く船A1 | 傾き変化時 | 音量240、ID7,8は同時に鳴らす |
8 | 4~6 | 傾く船A2 | 傾き変化時 | |
9 | - | 傾く船C? | 未使用 | |
10 | 4~6 | 船の振動 | 傾きの予兆の揺れや転覆、時間切れ直前 | ボイラー爆発直後、傾き変化が始まるまで音量一時的に254 |
11 | 4~6 | 爆発音B | ジェフリーEDの1つ | |
12 | 7 | 爆発音A1 | ボイラー爆発、裏エリア吹き抜け部での爆発演出、 ボイラー室での炎吹き上がり |
ID12,13は同時に鳴らす。繰り返し機能を使う場合は12のみ。ジェフリーのEDの1つでは両方チャンネル4~6を使う。 |
13 | 4~6 | 爆発音A2 | ||
14 | 4~6/7 | 離着水 | 浸水した水に接触、あるいは水中から脱出時 | |
15 | 7 | 水流 | 上層等の水流ギミックのある場所 | |
16 | 7 | 潜水 | 水中で泳いでいるとき | |
17 | 4~6 | 放電 | 制御室等 | |
18 | 4~6 | 入退室 | ドアを通じて入室する時 | シャッという音 |
19 | 4~6 | ドア開閉 | ドアを開ける時や退室する時 | バタンという音 |
20 | 4~6 | 衝突 | 障害物との接触 | |
21 | 4~6 | 打撃音 | 底層等で障害物が降ってくる時 一部エピローグで船底を叩くシーンでも使用する |
|
22 | 4~6 | 水蒸気 | ボイラー室の水蒸気が収まる時 | |
23 | 4~6 | 壊れ物 | ショップで皿のような障害物が降る時 | ガシャーンという音 |
24 | 7 | 火災 | 爆発前の表エリア中層、 ルークプロローグでのボイラー室前 |
|
25 | 4~6 | 焼身 | 炎に接触してミスになる場合 ボイラーの水蒸気沸き上がりにも使用 |
|
26 | 4~6 | 銃声 | ルークEDの1つ | |
27 | 4~6 | 水滴 | 配管エリア等水滴の発生する場所 | ボイラー室での水滴では使われない |
28 | 7 | 通信機操作1 | ルークプロローグ | モールス符号のような機械音 |
29 | - | 通信機操作2 | 未使用 | |
30 | - | 鈍音1 | 未使用 | |
31 | - | 鈍音2 | 未使用 | |
32 | - | 鈍音3 | 未使用 | |
33 | 4~6 | 落下 | ミス後床等に落下する時 | |
34 | 4~6 | 悲鳴(女性一般) | キャラ落下ミス時、 傾き変化時(7種からランダムに決定、音量48) |
他に該当しない女性用 |
35 | 4~6 | 悲鳴(年配男性) | レドウィン、イスメイ、クーパー、ミラー、テンダー、ペインズ、レイトンが該当 | |
36 | 4~6 | 悲鳴(男児) | ハリー、ジャックが該当 | |
37 | 4~6 | 悲鳴(若年男性) | 他に該当しない男性が該当 | |
38 | 4~6 | 悲鳴(一部男性) | ジェフリー、ラットラーが該当 | |
39 | 4~6 | 悲鳴(年配女性) | アデラのみ該当 | |
40 | 4~6 | 悲鳴(女児) | エイミー、ステラ、マリーが該当 | |
41 | 7 | ポーズ | startボタンでポーズした時 | |
42 | 7 | キャラ決定 | 主人公決定時 | |
43 | 7 | キャラ切替 | 主人公選択で次の候補に移る時 | |
44~ | - | 無効 | サウンドテストで選択できるが効果なし |