Gnilda のページ


小技 — FINAL FANTASY IV


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

小技

小技

シーケンスデータを再使用する

ループ開始位置設定ループ終了 及び ループ内条件ジャンプ コマンドと、ある程度大きなシーケンスデータの後尾で 繰り返し コマンドを使用し、復帰 (再使用) 可能にすることで、音楽データサイズを削減可能です。

基本1 (メインのループ内に 00 – D1 が必要)
E0 02							;2 (L_ループ開始位置 に戻す) + 1 (F5)
  L_ループ開始位置:
	   F5 01 L_再使用可能データ		;1 回目でジャンプ		 (カウントダウンカウンタ = 2)
	   XX							;キーオン・休符・タイ (00 – D1) が必要 (無い場合は無限ループで演奏停止)
	F0								;ループ終了				 (カウントダウンカウンタ = 0)
	︙
	F1

  L_再使用可能データ:				;ループを使用していないデータ
	00 0F 1E 2D 3C 4B
	5A 69 78 87 96
	F0								;L_ループ開始位置 に戻る (カウントダウンカウンタ = 1)
基本2 (メインのループ内データ不要)
E0 02							;2 (L_ループ開始位置 に戻す) + 1 (F5)
  L_ループ開始位置:
	   F5 01 L_再使用可能データ		;1 回目でジャンプ		 (カウントダウンカウンタ = 2)
	F0								;ループ終了				 (カウントダウンカウンタ = 0)
	︙
	F1

  L_再使用可能データ:				;ループ終了 (F0) で終了するデータ
	E0 01
	   00 0F 1E 2D 3C 4B
	   5A 69 78 87 96 A5
	F0
   [MM ...]							;キーオン・休符・タイ (00 – D1) 以外のコマンドは可
	F0								;L_ループ開始位置 に戻る (カウントダウンカウンタ = 1)

	00								;再使用可能データ内ループが終了するときに、この部分のデータをチェック (ドライバの仕様);内部処理時間を短くするには、L_ループ開始位置 に戻す F0 の直後に 00 – D1 を置くこと
再使用可能データの最後のキーオン・休符・タイをメインに置きたくない場合
E0 02							;2 (L_ループ開始位置 に戻す) + 1 (F5)
  L_ループ開始位置:
	   F5 01 L_再使用可能データ		;1 回目でジャンプ		 (カウントダウンカウンタ = 2)
	F0								;ループ終了				 (カウントダウンカウンタ = 0)
	︙
	F1

  L_再使用可能データ:				;ループはしないが F0 で終了するデータ
	E0 01							;1 + 1 (F5)
	   F5 01 L_再使用可能データ_1	;カウントダウンカウンタを減らすためのジャンプ (カウントダウンカウンタ = 1)
  L_再使用可能データ_1:
	   00 0F 1E 2D 3C 4B
	   5A 69 78 87 96 A5
	F0
   [MM ...]							;キーオン・休符・タイ (00 – D1) 以外のコマンドは可
	F0								;L_ループ開始位置 に戻る (カウントダウンカウンタ = 1)
	00								;内部処理時間を短くするためのデータ
再使用可能データの最後のキーオン・休符・タイをメインに置く必要がある場合
	︙
	E0 01									;ループ1					(カウントダウンカウンタ1 = 2)
  L_ループ1開始位置:
		E0 02								;2 (L_ループ2A開始位置 に戻す) + 1 (F5)
  L_ループ2A開始位置:
		   F5 01 L_再使用可能データA		;1 回目でジャンプ			(カウントダウンカウンタ2A = 2)
		F0									;ループ終了					(カウントダウンカウンタ2A = 0)
		︙
		00									;ループ1 に戻るまでと ループ1 から“最初の F0”までに 音符・休符・タイ が
											;存在しないため、ループ2B の F0 の前に キーオン・休符・タイ (00 – D1) が必要
											;無い場合はこの音の次の キーオン・休符・タイ を探すことができず演奏停止

		F5 02 L_ループ1の2回目はループ1の外	;2 回目で ループ1 終了		(カウントダウンカウンタ1 = 2, 0)

		E0 02								;2 (L_ループ2B開始位置 に戻す) + 1 (F5)
  L_ループ2B開始位置:
		   F5 01 L_再使用可能データB		;1 回目でジャンプ			(カウントダウンカウンタ2B = 2)
		   XX								;再使用可能データB の最後の キーオン・休符・タイ
		F0									;ループ終了					(カウントダウンカウンタ2B = 0)
	F0										;L_ループ1開始位置 に戻る	(カウントダウンカウンタ1 = 1)
  L_ループ1の2回目はループ1の外:
	︙
	F1

  L_再使用可能データA:						;ループ終了 (F0) で終了するデータ
	E0 ...
	F0
	F0										;L_ループ2A開始位置 に戻る	(カウントダウンカウンタ2A = 1)
	00										;内部処理時間を短くするためのデータL_再使用可能データB:F0										;L_ループ2B開始位置 に戻る	(カウントダウンカウンタ2B = 1)
	00										;内部処理時間を短くするためのデータ

キーオン後からキーオフまでの間に音量やパンを設定する

通常はタイの直前の音量 [設定]パン [設定] コマンドは以降のキーオン実行まで反映されませんが、処理時間 1 で変化させることで音量計算フラグを設定することができます。

処理時間 1 で変化
	︙
	F2 00 00 40						;トラック音量 = $40
	F3 00 00 60						;パン = $60
	87								;キーオン
	F2 01 00 80						;トラック音量 = $80, 処理時間 = 1
	C3								;タイ
	F3 01 00 A0						;パン = $A0, 処理時間 = 1
	C3								;タイ

キーオン後からキーオフまでの間に一度だけ音程を変化させる

ピッチスライド を 処理時間 1 で使用することで、一度だけキーオフせずに音程を変化させることができます。

ビブラート のピッチ変化量は変化しません。

処理時間 1 でスラー処理
D6 60 01 01						;ピッチスライド : ディレイ   = $60, 処理時間 = 1, 音程変化 = $01
	87								;キーオン		: 音長		 = $C0 ($60 ティック後に半音上がる)
	E6								;ピッチスライド解除

キーオフせずにキーオンする

実際には処理されない タイキーオン の前に置くことで、キーオフせずにキーオンすることができます。

ティック数計算処理では、ループ内条件ジャンプコマンドは何もしないコマンドとして処理されます (仕様)。

キーオフを回避
	︙
	XX								;キーオン (00 – B3)
									;DE コマンドのディレイは XX と YY の音長の合計で計算される
	E0 01							;1 + 1 (F5)
	   F5 01 L_キーオン				;1 回目でジャンプ		 (カウントダウンカウンタ = 1)
	   YY							;タイ (C3 – D1) をキーオンの前に置くことでキーオフを回避 (ドライバの仕様)
  L_キーオン:
	   9B							;00 – B3
	F0								;ループ終了				 (カウントダウンカウンタ = 0)

音量 [設定] コマンドを使用せずに音量を設定する

ソフトウェア アタック設定 コマンドで特定のキーオン時の音量倍率変化テーブルを選択することで、音量 [設定] コマンドを使用せずに音量を設定することができます。

F2 コマンドを使用せずに DC コマンドを使用し、チャネルの音量を変化させる
F2 00 00 FF						;トラック音量を $FF (255) で固定
	DC 0B							;音量倍率 $FF (255)
	00								;キーオン
	DC 0D							;音量倍率 $FF (255)
	0F								;キーオン
	DC 14							;音量倍率 $D2 (210)
	1E								;キーオン
	DC 15							;音量倍率 $AA (170)
	2D								;キーオン
	DC 16							;音量倍率 $82 (130)
	3C								;キーオン
	DC 17							;音量倍率 $5A (90)
	4B								;キーオン
	DC 18							;音量倍率 $32 (50)
	5A								;キーオン