スクエア製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は使っていないです)