Gnilda のページ


小技 — FINAL FANTASY IV 改造サウンドドライバ


  1. ホーム
  2. スーパーファミコンのサウンドドライバ
  3. FINAL FANTASY IV 改造サウンドドライバ
  4. 小技

小技

小技

エコー・ノイズ・ピッチモジュレーション を使用しない場合

音楽データ転送直後はすべての音楽トラックの エコー・ノイズ・ピッチモジュレーションの設定 は 全て解除 されるため、解除系のコマンドは不要です。

ドラム系の音色を使用するトラックの設定

ソフトウェア リリース処理 の設定が重要ではない 場合は、無効にすることで キーオン 予約時のティック数計算を省略可能です。

休符で始まる または 休符が連続する 場合の高速化

休符 の代わりに タイ を使用することで、スラー 及び タイ 並びに DSP のキーオフ フラグ処理を省略可能です。

休符で始まる場合
!T1									;音楽データ転送直後はすべての音楽トラックが 休符演奏状態
	_T 82							;演奏速度_O 04							;オクターブ設定

;	_R1								;休符で始まる
	_T1								;→ タイ
休符が連続する場合
_P 82							;パン設定
	_V B4							;音量設定
	_A#32							;キーオン
	_R16							;休符
;	_R32							;休符 (連続)
	_T32							;→ タイ

音量設定コマンドのみでトラック音量を変化させる場合の高速化

音色データ設定 コマンドで音量変化テーブル (2 バイト) を追加し追加したテーブルを選択することで、コマンド処理時間を短縮します。変化回数が多い場合は音楽データのサイズを削減可能です。

サウンドドライバのバージョンにより 音色データ設定 コマンドの仕様が異なります。

F2 コマンドを使用せずに DC コマンドを使用してチャネルの音量を設定する
!T1
!F1									;APU RAM データ生成処理のコマンド [次行から音楽シーケンスデータのコマンドとして処理しない]
	_DATA							;音色データ設定
		00							;ピッチ調整値 2・ADSR1・ADSR2 の上書きはしない
		03	E4 00					;音量変化テーブル [$40] : 音量倍率 $E4
		03	B7 00					;音量変化テーブル [$41] : 音量倍率 $B7
		02	9E						;音量変化テーブル [$42] : 音量倍率 $9E
		00							;音量変化テーブル [$42] の末尾
!F0									;APU RAM データ生成処理のコマンド [次行から音楽シーケンスデータのコマンドとして処理する]!T5_V FF							;音量設定 : $FF で固定する
	_[ 02							;ループ開始位置
;		_V E4						;トラック音量 : 音量倍率 $E4
		_SA 40						;→ 音量変化テーブル [$40] : 音量倍率 $E4
		_A8							;キーオン
;		_V B7						;トラック音量 : 音量倍率 $B7
		_SA 41						;→ 音量変化テーブル [$41] : 音量倍率 $B7
		_A16 _A16					;キーオン
	_]								;繰り返し・ループ終了
;	_V 9E							;トラック音量 : 音量倍率 $9E
	_SA 42							;→ 音量変化テーブル [$42] : 音量倍率 $9E
	_A16 _A16 _A16 _A16				;キーオン

休符が連続した後のキーオン予約前の処理 の分散

休符 が連続した後の キーオン 処理の前に複数のコマンドを実行予定である 場合は、置き換えた タイ の前に移動することで キーオン 予約前の処理を分散可能です。

休符が連続した後のキーオン予約前の処理を分散する
_F#1							;キーオン
	_R1								;休符
	_T1								;_R1
	_T2.							;_R2.
	_V 96							;音量設定
	_T8								;_R8
;	_V 96							;音量設定 (タイの前に移動)
	_VF 1800 FF						;音量変化 (移動不可能)
	_[ 05							;ループ開始位置
		_C#48						;キーオン
	_]								;繰り返し・ループ終了

ジャンプ系コマンドを使用する場合の高速化

休符 の後でジャンプすることで、キーオン 予約時の ソフトウェア リリース処理 のティック数計算処理を省略します。

ループ内条件ジャンプ コマンドは、何もしないコマンドとして処理されます (オリジナルの仕様)。

キーオン以外のコマンドが多いと時間がかかるティック数計算処理を省略する
;	_Sub L_1_2						;復帰可能なジャンプ
	_G4								;キーオン
	_T16							;タイ
	_R16							;休符
	_Sub L_1_2_						;復帰可能なジャンプ : _G4 予約時のティック数計算処理で このコマンド (重い) を処理する時間を省略_Jmp L_1_LOOP					;無限ループ;!L_1_2
;	_G4								;キーオン
;	_T16							;タイ
;	_R16							;休符
!L_1_2_
	_G8								;キーオン

ループ終了時の処理 の分散

最後のループを ループ内条件ジャンプ コマンドで抜けることで、次の ループ開始処理 の直前の ループ終了処理キーオン 直前よりも前に実行します。

最後のループ終了処理を F5 コマンドで先に実行する
	︙
	_[ 02								;ループ開始位置 (3 回)
		_G4								;キーオン
		_A4								;キーオン
		_CJmp 02 L_1_2					;ループ内条件ジャンプ : 3 回目にループ終了処理を実行
		_B4								;キーオン
	_]									;ループ開始位置にジャンプ
!L_1_2
		_B4								;キーオン
	_[ 01								;ループ開始位置