スクエア製SPC用効果音制御スクリプト

(扱うソフトが偏っている……)

FF4用に効果音をわりと直感的に弄れるScript700を組んでみました。

※追記
値変更で後期SPCエンジンも対応できました。
マリオRPGとかそのへんは動きません。

仕組み

Script700のデータ領域にデータを追加すると、スクリプトがその中身を随時解釈して実行する仕組み。
鳴らし方とかはScriptの中にコメントやら入れておいたので、それ参考につくってみてください。
(条件付きジャンプは扱い難ありかもしれない…)

スクエア初期SPCエンジン用スクリプト(FF4とかFF5とか)

;━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
; スクエア初期SPCエンジン用効果音鳴動Script
;
;  ・使い方
;    スクリプト最下部のデータ部に効果音鳴動用データを
;    書くと、効果音を鳴らせます。
;    データ書式は該当箇所を御覧ください。
;━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

;────────────────────
; プログラム部
; ※このエリアは弄らないでください。
;────────────────────

; ワークエリア部初期化
	m   #0 w0
:1
	c   w0  #0
	m   dd? #0
	a   #4  w0
	c   #32 w0
	blt 1

; データポインタ初期化
	m   #32 w0
; reg初期化
	m   #0 w1
	m   #0 w2
	m   #0 w3
	m   #0 w4

; --- program loop ---
:2
; パラメタ読出
	c   w0 #0
	m   db? w1
	a   #1 w0
	c   w0 #0
	m   db? w2
	a   #1 w0
	c   w0 #0
	m   db? w3
	a   #1 w0
	c   w0 #0
	m   db? w4
	n   #8 < w4
	a   #1 w0
	c   w0 #0
	a   db? w4
	a   #1 w0
; 分岐
	c   #0x80 w1
	blt 3
	bra 100         ; コマンドモード
	bra 5           ; ループ前処理へ
:3
	c   #1 w1
	bne 4
	bra 50          ; 効果音(種別:1)
	bra 5           ; ループ前処理へ
:4
	c   #2 w1
	bne 1023        ; スクリプト終了
	bra 51          ; 効果音(種別:2)

:5
	bra 2           ; 処理ループ


;--- sound routine --------------------
:50
; 効果音(種別1)
	r0
	a   #15 w2      ; w1 += 0x0f
	m   w2 0        ; 効果音
	m   w2 w1
	bra 52          ; 効果音共通処理へ
:51
	r0
	m   #2 0        ; 効果音コマンド
	m   w2 1        ; 効果音
	m   w3 2        ; panpot
	m   #2 w1
:52
	m   #0 w6
	m   #0 w7
; BCD変換
; 1の位
	m   w4 w6
	n   #0xf & w6
	n   #10 % w6
	m   w6 w7
; 10の位
	m   w4 w6
	n   #4 > w6
	n   #0xf & w6
	n   #10 % w6
	n   #10 * w6
	a   w6 w7
; 100の位
	m   w4 w6
	n   #8 > w6
	n   #0xf & w6
	n   #10 % w6
	n   #100 * w6
	a   w6 w7
; 1000の位
	m   w4 w6
	n   #12 > w6
	n   #0xf & w6
	n   #10 % w6
	n   #1000 * w6
	a   w6 w7
; wait算出
	n   #20871 * w7 ; 10msくらい。てきとうw

; APU<->CPU 同期
:53
	w 16
	c w1 0
	bne 53
	m #0 0          ; Clear

; wait
	w   w7

; リターン
	r
;--------------------------------------



;--- command routine ------------------

;--- 分岐----------
:100
	r0
	n   #0x7f & w1
	c   #0 w1
	bne 101
	bra 500          ; 
:101
	c   #1 w1
	bne 102
	bra 502
:102
	c   #2 w1
	bne 103
	bra 503
:103
	c   #3 w1
	bne 104
	bra 504
:104
	c   #4 w1
	bne 105
	bra 505
:105
	c   #5 w1
	bne 106
	bra 506
:106
	c   #6 w1
	bne 107
	bra 507
:107
	c   #7 w1
	bne 108
	bra 508
:108
	c   #8 w1
	bne 109
	bra 509
:109
	c   #9 w1
	bne 199
	bra 510
:199
	r
;------------------

;--- 80
:500
	c   w4 #0
	bne 501         ; アドレス指定 = 0000 の時はリターン
	r
:501
	n #0xffffffff ^ w4
	a #1 w4
	n #0xffffffff ^ w4
	n   #5 * w4     ;\
	a   #32 w4      ; |> jump先アドレス算出
	m   w4 w0       ;/
	r

;--- 81
:502
	c #0 w2
	c w3 db?
	beq 500
	r

;--- 82
:503
	c #0 w2
	c w3 db?
	bne 500
	r

;--- 83
:504
	c #0 w2
	c w3 db?
	blt 500
	r

;--- 84
:505
	c #0 w2
	c w3 db?
	ble 500
	r

;--- 85
:506
	c #0 w2
	c w3 db?
	bgt 500
	r

;--- 86
:507
	c #0 w2
	c w3 db?
	bge 500
	r

;--- 87
:508
	c #0 w2
	a #1 db?
	r

;--- 88
:509
	c #0 w2
	n #0xff ^ db?
	a #1 db?
	n #0xff ^ db?
	r

;--- 89
:510
	c #0 w2
	m w3 db?
	r
;--------------------------------------





;--- debug ----------------------------
:1022
	w 8
	bra 1022
;--- debug ----------------------------

;--- end script -----------------------
:1023
	; reg終了値入力
	m   #0xffffffff w0
	m   #0 w1
	m   #0 w2
	m   #0 w3
	m   #0 w4
	m   #0 w5
	m   #0 w6
	m   #0 w7
	e
::
	e

;────────────────────
; ワークエリア部(条件付きジャンプ用)
; ※このエリアは弄らないでください。
;────────────────────

;00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
;-----------------------------------------------
 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
;-----------------------------------------------
;00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F


;────────────────────
; データ部(効果音制御データ)
;
; ※入力上の注意
;     ・1つの効果音につき必ず5バイト全部のパラメタを入力してください。
;        "01 01 0500" とかするとヘンな解釈して予期せぬ動作になります。
;
;     ・鳴動時間が1000(10秒)以下の場合は、0300(3秒)のように必ず0埋めしてください。
;        "01 01 7f 500" とかするとヘンな解釈して予期せぬ動作になります。
;
; 【基本書式】
;   XX YY ZZ NNNN
;
;     XX   ... 効果音種別 [HEX]
;                01 ... 種別1 (カーソル音等の特殊効果音) ※panpot指定は無視されます。
;                02 ... 種別2(通常効果音)
;                ※80h以上でコマンドモード動作になります(コマンドモード書式一覧を参照)。
;                ※00hを指定すると効果音鳴動処理を終了します。
;
;     YY   ... 効果音番号 [HEX]
;                種別01の場合の範囲: 01 〜 10 (※11以上はバグります。)
;                種別02の場合の範囲: 01 〜 7fくらい
;
;     ZZ   ... 効果音panpot [HEX]
;                panpot 範囲: 01 〜 7f(おおよそ中間) 〜 ff
;
;     NNNN ... 効果音鳴動時間 [似非DC]
;                10msの単位の整数値で指定します。
;                ※見やすさ考慮の為、BCD形式での入力です。
;                  HEX値入力では無いので注意。
;
; 【コマンドモード書式一覧】  (※「00」で指定の箇所は0固定です。基本無視されます。)
;   ◆ジャンプ [ 指定の位置にジャンプします。動作をループさせたい場合に使います。 ]
;   80 00 00 NNNN
;     NNNN ... ジャンプ先効果音番号( 0001 〜 ffff )
;
;   ◆条件付きジャンプ(EQ) [ XX指定のアドレス値がYYと等しい時にNNNNにジャンプ ]
;   81 XX YY NNNN
;     XX ... アドレス( 0〜1f )
;     YY ... 条件値 
;     NNNN ... ジャンプ先効果音番号( 0001 〜 ffff )
;
;   ◆条件付きジャンプ(NE) [ XX指定のアドレス値がYYと等しくない時にNNNNにジャンプ ]
;   82 XX YY NNNN
;     XX ... アドレス( 0〜1f )
;     YY ... 条件値 
;     NNNN ... ジャンプ先効果音番号( 0001 〜 ffff )
;
;   ◆条件付きジャンプ(LT) [ XX指定のアドレス値がYYより小さい時にNNNNにジャンプ ]
;   83 XX YY NNNN
;     XX ... アドレス( 0〜1f )
;     YY ... 条件値 
;     NNNN ... ジャンプ先効果音番号( 0001 〜 ffff )
;
;   ◆条件付きジャンプ(LE) [ XX指定のアドレス値がYY以下の時にNNNNにジャンプ ]
;   84 XX YY NNNN
;     XX ... アドレス( 0〜1f )
;     YY ... 条件値 
;     NNNN ... ジャンプ先効果音番号( 0001 〜 ffff )
;
;   ◆条件付きジャンプ(GT) [ XX指定のアドレス値がYYより大きい時にNNNNにジャンプ ]
;   85 XX YY NNNN
;     XX ... アドレス( 0〜1f )
;     YY ... 条件値 
;     NNNN ... ジャンプ先効果音番号( 0001 〜 ffff )
;
;   ◆条件付きジャンプ(GE) [ XX指定のアドレス値がYY以上の時にNNNNにジャンプ ]
;   86 XX YY NNNN
;     XX ... アドレス( 0〜1f )
;     YY ... 条件値 
;     NNNN ... ジャンプ先効果音番号( 0001 〜 ffff )
;
;   ◆インクリメント
;   87 XX 00 0000 [ XX指定のアドレス値を1増やします ]
;     XX ... アドレス( 0〜1f )
;
;   ◆デクリメント [ XX指定のアドレス値を1減らします ]
;   88 XX 00 0000
;     XX ... アドレス( 0〜1f )
;
;   ◆値セット [ XX指定のアドレスにYYをセットします ]
;   89 XX YY 00 0000
;     XX ... アドレス( 0〜1f )
;     YY ... セットする値
;
;────────────────────

;────────── これ以下を編集してください ──────────

;---【example】------------------------
02 80 7f 0100       ; 0001: 無音 / 1.00秒
02 3f 7f 0300       ; 0002: encount / 3.00秒
01 09 7f 0050       ; 0003: command select / 0.50秒
01 04 7f 0017       ; 0004: menu(3) / 0.17秒
01 05 7f 0060       ; 0005: menu(4) / 0.60秒
01 09 7f 0050       ; 0006: command select / 0.50秒
01 04 7f 0017       ; 0007: menu(3) / 0.17秒
01 04 7f 0017       ; 0008: menu(3) / 0.17秒
01 04 7f 0030       ; 0009: menu(3) / 0.30秒
01 04 7f 0020       ; 000a: menu(3) / 0.20秒
89 00 0f 0000       ; 000b: set command [ 00h = #0fh ]  ;\ 
01 04 7f 0006       ; 000c: menu(3) / 0.06秒            ; |> 15回ループ
88 00 00 0000       ; 000d: decrement 00h               ; |
82 00 00 000c       ; 000e: jump if 00h != #00h         ;/
01 04 7f 0030       ; 000f: menu(3) / 0.50秒
;--------------------------------------

; end sound
00 00 00 0000

スクエア後期SPCエンジン用スクリプト(FF6とかロマサガ3とか)

;━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
; スクエア後期SPCエンジン用効果音鳴動Script
;
;  ・使い方
;    スクリプト最下部のデータ部に効果音鳴動用データを
;    書くと、効果音を鳴らせます。
;    データ書式は該当箇所を御覧ください。
;━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

;────────────────────
; プログラム部
; ※このエリアは弄らないでください。
;────────────────────

; ワークエリア部初期化
	m   #0 w0
:1
	c   w0  #0
	m   dd? #0
	a   #4  w0
	c   #32 w0
	blt 1

; データポインタ初期化
	m   #32 w0
; reg初期化
	m   #0 w1
	m   #0 w2
	m   #0 w3
	m   #0 w4

; --- program loop ---
:2
; パラメタ読出
	c   w0 #0
	m   db? w1
	a   #1 w0
	c   w0 #0
	m   db? w2
	a   #1 w0
	c   w0 #0
	m   db? w3
	a   #1 w0
	c   w0 #0
	m   db? w4
	n   #8 < w4
	a   #1 w0
	c   w0 #0
	a   db? w4
	a   #1 w0
; 分岐
	c   #0x80 w1
	blt 3
	bra 100         ; コマンドモード
	bra 5           ; ループ前処理へ
:3
	c   #1 w1
	bne 4
	bra 50          ; 効果音(種別:1)
	bra 5           ; ループ前処理へ
:4
	c   #2 w1
	bne 1023        ; スクリプト終了
	bra 51          ; 効果音(種別:2)

:5
	bra 2           ; 処理ループ


;--- sound routine --------------------
:50
; 効果音(種別1)
	r0
	a   #31 w2      ; w1 += 0x0f
	m   w2 0        ; 効果音
	m   w2 w1
	bra 52          ; 効果音共通処理へ
:51
	r0
	m   #24 0       ; 効果音コマンド
	m   w2 1        ; 効果音
	m   w3 2        ; panpot
	m   #24 w1
:52
	m   #0 w6
	m   #0 w7
; BCD変換
; 1の位
	m   w4 w6
	n   #0xf & w6
	n   #10 % w6
	m   w6 w7
; 10の位
	m   w4 w6
	n   #4 > w6
	n   #0xf & w6
	n   #10 % w6
	n   #10 * w6
	a   w6 w7
; 100の位
	m   w4 w6
	n   #8 > w6
	n   #0xf & w6
	n   #10 % w6
	n   #100 * w6
	a   w6 w7
; 1000の位
	m   w4 w6
	n   #12 > w6
	n   #0xf & w6
	n   #10 % w6
	n   #1000 * w6
	a   w6 w7
; wait算出
	n   #20871 * w7 ; 10msくらい。てきとうw

; APU<->CPU 同期
:53
	w 16
	c w1 0
	bne 53
	m #0 0          ; Clear

; wait
	w   w7

; リターン
	r
;--------------------------------------



;--- command routine ------------------

;--- 分岐----------
:100
	r0
	n   #0x7f & w1
	c   #0 w1
	bne 101
	bra 500          ; 
:101
	c   #1 w1
	bne 102
	bra 502
:102
	c   #2 w1
	bne 103
	bra 503
:103
	c   #3 w1
	bne 104
	bra 504
:104
	c   #4 w1
	bne 105
	bra 505
:105
	c   #5 w1
	bne 106
	bra 506
:106
	c   #6 w1
	bne 107
	bra 507
:107
	c   #7 w1
	bne 108
	bra 508
:108
	c   #8 w1
	bne 109
	bra 509
:109
	c   #9 w1
	bne 199
	bra 510
:199
	r
;------------------

;--- 80
:500
	c   w4 #0
	bne 501         ; アドレス指定 = 0000 の時はリターン
	r
:501
	n #0xffffffff ^ w4
	a #1 w4
	n #0xffffffff ^ w4
	n   #5 * w4     ;\
	a   #32 w4      ; |> jump先アドレス算出
	m   w4 w0       ;/
	r

;--- 81
:502
	c #0 w2
	c w3 db?
	beq 500
	r

;--- 82
:503
	c #0 w2
	c w3 db?
	bne 500
	r

;--- 83
:504
	c #0 w2
	c w3 db?
	blt 500
	r

;--- 84
:505
	c #0 w2
	c w3 db?
	ble 500
	r

;--- 85
:506
	c #0 w2
	c w3 db?
	bgt 500
	r

;--- 86
:507
	c #0 w2
	c w3 db?
	bge 500
	r

;--- 87
:508
	c #0 w2
	a #1 db?
	r

;--- 88
:509
	c #0 w2
	n #0xff ^ db?
	a #1 db?
	n #0xff ^ db?
	r

;--- 89
:510
	c #0 w2
	m w3 db?
	r
;--------------------------------------





;--- debug ----------------------------
:1022
	w 8
	bra 1022
;--- debug ----------------------------

;--- end script -----------------------
:1023
	; reg終了値入力
	m   #0xffffffff w0
	m   #0 w1
	m   #0 w2
	m   #0 w3
	m   #0 w4
	m   #0 w5
	m   #0 w6
	m   #0 w7
	e
::
	e

;────────────────────
; ワークエリア部(条件付きジャンプ用)
; ※このエリアは弄らないでください。
;────────────────────

;00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
;-----------------------------------------------
 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
;-----------------------------------------------
;00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F


;────────────────────
; データ部(効果音制御データ)
;
; ※入力上の注意
;     ・1つの効果音につき必ず5バイト全部のパラメタを入力してください。
;        "01 01 0500" とかするとヘンな解釈して予期せぬ動作になります。
;
;     ・鳴動時間が1000(10秒)以下の場合は、0300(3秒)のように必ず0埋めしてください。
;        "01 01 7f 500" とかするとヘンな解釈して予期せぬ動作になります。
;
; 【基本書式】
;   XX YY ZZ NNNN
;
;     XX   ... 効果音種別 [HEX]
;                01 ... 種別1 (カーソル音等の特殊効果音) ※panpot指定は無視されます。
;                02 ... 種別2(通常効果音)
;                ※80h以上でコマンドモード動作になります(コマンドモード書式一覧を参照)。
;                ※00hを指定すると効果音鳴動処理を終了します。
;
;     YY   ... 効果音番号 [HEX]
;                種別01の場合の範囲: 01 〜 10 (※11以上はバグります。)
;                種別02の場合の範囲: 01 〜 ff 
;
;     ZZ   ... 効果音panpot [HEX]
;                panpot 範囲: 01 〜 7f(おおよそ中間) 〜 ff
;
;     NNNN ... 効果音鳴動時間 [似非DC]
;                10msの単位の整数値で指定します。
;                ※見やすさ考慮の為、BCD形式での入力です。
;                  HEX値入力では無いので注意。
;
; 【コマンドモード書式一覧】  (※「00」で指定の箇所は0固定です。基本無視されます。)
;   ◆ジャンプ [ 指定の位置にジャンプします。動作をループさせたい場合に使います。 ]
;   80 00 00 NNNN
;     NNNN ... ジャンプ先効果音番号( 0001 〜 ffff )
;
;   ◆条件付きジャンプ(EQ) [ XX指定のアドレス値がYYと等しい時にNNNNにジャンプ ]
;   81 XX YY NNNN
;     XX ... アドレス( 0〜1f )
;     YY ... 条件値 
;     NNNN ... ジャンプ先効果音番号( 0001 〜 ffff )
;
;   ◆条件付きジャンプ(NE) [ XX指定のアドレス値がYYと等しくない時にNNNNにジャンプ ]
;   82 XX YY NNNN
;     XX ... アドレス( 0〜1f )
;     YY ... 条件値 
;     NNNN ... ジャンプ先効果音番号( 0001 〜 ffff )
;
;   ◆条件付きジャンプ(LT) [ XX指定のアドレス値がYYより小さい時にNNNNにジャンプ ]
;   83 XX YY NNNN
;     XX ... アドレス( 0〜1f )
;     YY ... 条件値 
;     NNNN ... ジャンプ先効果音番号( 0001 〜 ffff )
;
;   ◆条件付きジャンプ(LE) [ XX指定のアドレス値がYY以下の時にNNNNにジャンプ ]
;   84 XX YY NNNN
;     XX ... アドレス( 0〜1f )
;     YY ... 条件値 
;     NNNN ... ジャンプ先効果音番号( 0001 〜 ffff )
;
;   ◆条件付きジャンプ(GT) [ XX指定のアドレス値がYYより大きい時にNNNNにジャンプ ]
;   85 XX YY NNNN
;     XX ... アドレス( 0〜1f )
;     YY ... 条件値 
;     NNNN ... ジャンプ先効果音番号( 0001 〜 ffff )
;
;   ◆条件付きジャンプ(GE) [ XX指定のアドレス値がYY以上の時にNNNNにジャンプ ]
;   86 XX YY NNNN
;     XX ... アドレス( 0〜1f )
;     YY ... 条件値 
;     NNNN ... ジャンプ先効果音番号( 0001 〜 ffff )
;
;   ◆インクリメント
;   87 XX 00 0000 [ XX指定のアドレス値を1増やします ]
;     XX ... アドレス( 0〜1f )
;
;   ◆デクリメント [ XX指定のアドレス値を1減らします ]
;   88 XX 00 0000
;     XX ... アドレス( 0〜1f )
;
;   ◆値セット [ XX指定のアドレスにYYをセットします ]
;   89 XX YY 00 0000
;     XX ... アドレス( 0〜1f )
;     YY ... セットする値
;
;────────────────────

;────────── これ以下を編集してください ──────────

;---【example】------------------------
02 80 7f 0100       ; 0001: 無音 / 1.00秒
02 3f 7f 0300       ; 0002: encount / 3.00秒
01 09 7f 0050       ; 0003: command select / 0.50秒
01 04 7f 0017       ; 0004: menu(3) / 0.17秒
01 05 7f 0060       ; 0005: menu(4) / 0.60秒
01 09 7f 0050       ; 0006: command select / 0.50秒
01 04 7f 0017       ; 0007: menu(3) / 0.17秒
01 04 7f 0017       ; 0008: menu(3) / 0.17秒
01 04 7f 0030       ; 0009: menu(3) / 0.30秒
01 04 7f 0020       ; 000a: menu(3) / 0.20秒
89 00 0f 0000       ; 000b: set command [ 00h = #0fh ]  ;\ 
01 04 7f 0006       ; 000c: menu(3) / 0.06秒            ; |> 15回ループ
88 00 00 0000       ; 000d: decrement 00h               ; |
82 00 00 000c       ; 000e: jump if 00h != #00h         ;/
01 04 7f 0030       ; 000f: menu(3) / 0.50秒
;--------------------------------------

; end sound
00 00 00 0000
補足

種別1効果音が使われていないタイトルもある様子?(たぶんロマサガ3は使っていないです)