Gigamix DM-SYSTEM2

SEの発声機能

updated:

第1章 概要

1.1 SEとは

 SEとは“Sound Effect”の略記で、効果音を指します。DMシステム2はBGM演奏と同様、1/60秒のタイマー割り込みを利用してSEを発声します。

 SEの発声機能は基本的にPSG音源で発声します。DMシステム2のSEの発声機能はBGM機能とリンクしており、BGMのPSG演奏部分を一時的にSEへ割り当てて発声し、SE発声が終了すると自動的にBGM演奏へ復帰します。

 SEドライバを変更することにより、多くのSE形式、そして上記以外のまったく新しい音源に対応します。

やりようによっては便利かもしれないがツールを失念してしまいデータ作成が大変なので利用頻度が低めになってしまった、DMシステム2のSE発声機能のサンプル https://gigamix.jp/ds2/ds2se.html — Takashi Kobayashi (@nf_ban) 2021年08月14日 鈴見咲君高さんのSEドライバ「SZMKO」のDMシステム2版(DM2ZSMKO, SE-SZMK)はMMLで記述できるので効果音作りが捗りますね!完成したらRAMの領域をBSAVEしておけばいいんですもんね。おすすめです。https://hp.vector.co.jp/authors/VA011751/MSXHIKID.HTM — Takashi Kobayashi (@nf_ban) 2021年08月15日
SEの発声機能のサンプル動画

第2章 DMシステム2からの利用方法

 プログラムの記述はすべてのドライバにおいて共通です。ただし、ドライバによって機能に制限がある場合があります。

2.1 SEテーブルの宣言

 事前にSEデータのファイル(SEテーブル)を所定のメモリ(RAM)へ配置したうえで、SEテーブルのアドレスを宣言します。

CALL SETSE (<SEテーブルの開始アドレス>)
ex.) _SETSE(&H3000) ← 3000hを宣言

 SEを配置するエリアが8000h以降のときは、あらかじめ“CLEAR”文で宣言しておく必要があります。

2.2 SEの発声

 RAMに配置したSEデータを発声します。指定した番号のSEを発声します(1~255)。SEテーブルに格納されているSEの最大数を越える番号を指定すると、DMシステム2はエラーを返します。

CALL SEON (SE番号)
ex.) _SEON(3) ← 3番のSEを発声

 効果音発声中に新たな効果音を発声させた場合、優先順位の高い効果音を発声します。優先順位はSEドライバの機能に依存します。

2.3 SE発声の停止

 発声中のSEを停止します。SE番号を0にして発声しても停止します。

CALL SEOFF
CALL SEON(0)

SEを発声していない場合は無視します。

第3章 SEドライバとデータ仕様・作成方法

 DMシステム2では現在3種類のドライバを提供しています。

 DMシステム2で使用するSEデータは事前に各種ツールで作成しておく必要があります。ツールの使用方法は、それぞれのドキュメントファイルなどを参照してください。

3.1 Gigamix製SEドライバ(SE-NSE)

SEデータ構造

SE-NSE データ構造
データの先頭 +0 データ数(1~255)
ディレクトリ +0~+1 SEヘッダへの相対アドレス(0~65535)
+2 ヘッダ
      b7 b6 b5 b4 b3 b2 b1 b0   B:BGM停止on/off(1:off)
      B 0 0 0 0 0 C C   C:使用チャンネル数(1~3)
※データ数分ディレクトリが並んでいます。
SEヘッダ +0 データ本体への相対アドレス(0~255)
+1 ディレイ(0~255)
+2 b7~b4:ディチューン(-8~+7)
b3~b0:優先順位(0(高)~15(低))
※使用するチャンネル分集まって1データのSEヘッダとなります。
SEデータ本体 SEデータフォーマット(後述)に従ってデータが格納されています。

以下、「SEヘッダ」「SEデータ」の順でデータ分並んでいます。

SEデータフォーマット

bit     7 6 5 4 3 2 1 0
        ---------------
        1 0 n t v v v v         n:ノイズ t:トーンのon/off (1:off)
                                v:音量指定(0~15)

1st:    1 1 0 0 |high4|         トーンの直接指定 (0~4095)
2nd:    |     low8    |

        1 1 0 1 n n n n         n:ノイズの直接指定(0~15:実際は×2して発声)

1st:    1 1 1 0 p p p p         p:ポルタメント(-8~+7)  p=0でポルタメントoff
2nd:    t t t t t t t t         t:増減時間(0~255)

        1 1 1 1 v v v v         v:音量の相対指定(-8~+7)

        0 1 w w w w w w         1回の割り込み処理の終了
                                w:次の発声までの待ち時間(0~63)

1st:    0 0 w w w w w w         w:次の発声までの待ち時間(0~63)
2nd:    l l l l l l l l         l:ループ回数(0~254)
                                l=FFhの場合、そのSEの終了
3rd:    a a a a a a a a         a:ループ先の相対アドレス(-255~0)

用語説明

  • ディレイ…………最初のウェイト
  • ディチューン……最終的にトーン周波数に足す値
  • ポルタメント……一定周期ごとにトーン周波数に値を足す事
  • 増減時間…………何ステップ毎にポルタメントをかけるか(ポルタメントの周期)

3.2 旧マジカルラビリンス用SEドライバ(SE-SE2)

SEデータ構造

SE-SE2 データ構造
データの先頭 +0 データ数(1~255)
ディレクトリ +0~+1 SEヘッダへの相対アドレス(0~65535)
0 = this+3 となります。
+2 ヘッダ
      b7 b6 b5 b4 b3 b2 b1 b0   B:BGM停止on/off(1:off)
      B X 0 0 0 0 C C   C:使用チャンネル数(1~3)
                                X:排他フラグ
※データ数分ディレクトリが並んでいます。
SEヘッダ +0 b7~b4:ディチューン(-8~+7)+8
b3~b0:優先順位(0(高)~15(低))
+1 ディレイ(0~255)
+2 データ本体への相対アドレス(0~255)
※使用するチャンネル分集まって1データのSEヘッダとなります。
SEデータ本体 SEデータフォーマット(後述)に従ってデータが格納されています。

以下、「SEヘッダ」「SEデータ」の順でデータ分並んでいます。

SEデータフォーマット

bit     7 6 5 4 3 2 1 0
        ---------------
        1 0 n t v v v v         n:ノイズ t:トーンのon/off (1:off)
                                v:音量指定(0~15)

1st:    1 1 0 0 |high4|         トーンの直接指定 (0~4095)
2nd:    |     low8    |

        1 1 0 1 v v v v         v:音量の相対指定(-8~+7)+8

1st:    1 1 1 0 p p p p         p:ポルタメント(-8~+7)+8 p=8でポルタメントoff
2nd:    t t t t t t t t         t:増減時間(0~255)

        1 1 1 1 n n n n         n:ノイズの直接指定(0~15:実際は×2して発声)

        0 0 w w w w w w         1回の割り込み処理の終了
                                w:次の発声までの待ち時間(0~63)

1st:    0 1 w w w w w w         w:次の発声までの待ち時間(1~63)
                                00hの場合、そのSEの終了
2nd:    l l l c c c c c         c:ループ回数(1~31) 0のとき無限
                                l:ループの深さ (0:最内ループ~7:最外ループ)
3rd:    a a a a a a a a         a:ループ先の相対アドレス(-255~0)FF=直前の1byte

用語説明

  • ディレイ…………最初のウェイト
  • ディチューン……最終的にトーン周波数に足す値
  • ポルタメント……一定周期ごとにトーン周波数に値を足す事
  • 増減時間…………何ステップ毎にポルタメントをかけるか(ポルタメントの周期)

第4章 漢字表示とSEの連動(1文字表示ごとのSE発声機能)

 DMシステム2の漢字表示機能とSE発声機能を連動させ、指定した文章を1文字表示するごとに効果音が鳴る演出を作れるようになります。ゲームのメッセージ表示などに用いると面白そうです。

 プログラムの記述はすべてのドライバにおいて共通です。ただし、ドライバによって機能に制限がある場合があります。

4.1 制御に用いるインフォメーションエリア

1文字表示ごとのSE発声機能で用いるインフォメーションエリアは以下の通りです。

オフセット ラベル名 初期値 意味 詳細
+26,2 SEADD 0C000h SEテーブルのアドレス _SESETでセットされる
+195 KJWAIT 0 ウエイト 1文字表示毎に1/60秒単位のウエイトをかける
+196,3 HKKPUT C9h C9h C9h 1文字表示フック 1文字表示毎にコールされる (主にSE用)
+199 KJSE 0 効果音番号 1文字表示毎に鳴らすSE番号

4.2 事前準備

 あらかじめSEドライバおよびSEデータ(SEテーブル)を任意のRAMへ配置し、SE発声機能が利用できる状態にしておきます。その後、関連パラメータを書き換えます。

CALL SESET(<SEテーブルの開始アドレス>)
CALL POKE(&H4300+195,<1文字表示毎に待つ1/60秒単位のウエイト(0~255)>)

 SEテーブルはRAMのページ0を推奨します。DMシステム2はページ0の3000h~3FFFhの4KiBが空きエリアとなっていますので、こちらを積極的にご利用ください。

1文字表示フックの書き換え

 インフォメーションエリアに存在する「1文字表示フック(HKKPUT, 4300h+196)」の3バイトを以下のように書き換えます。Z80アセンブルリストは以下の通りです。

			HKKPUT	EQU		4300H+196	;43C4h

					ORG		HKKPUT

C3 73 43			JP		4300H+115	;4373h: unused information area (max 13 bytes)

 HKKPUTの書き換えにより、1文字表示するたびに後述の処理ルーチンへ遷移します。フックを書き換えるBASICリストは以下の通りです。

CALL POKES(&H4300+196,"テsC") :'HKKPUT

SE発声処理ルーチンの追加

 インフォメーションエリア内の未使用予約エリア(4300h+115)から12バイトを以下のように書き換えます。Z80アセンブルリストは以下の通りです。

			SEON	EQU		4067H		;DM-SYSTEM2 sound effects API  [in] A, HL
			SEADD	EQU		4300H+26	;431Ah: sound effects table address
			KJSE	EQU		4300H+199	;43C7h: sound effects No.

			ORG		4300H+115			;4373h: unused information area (max 13 bytes)

3A C7 43	LD		A,(KJSE)			;A <- sound effects No.
B7			OR		A					;check 0 or other
C8			RET		Z					;if A=0 then return (SE off mode)
2A 1A 43	LD		HL,(SEADD)			;HL <- sound effects table address
CD 67 40	CALL	SEON				;call sound effects API
C9			RET							;this routine end

 この処理ルーチンの追加により、1文字表示するたびにSEが発声する準備が整います(まだ鳴りません)。処理ルーチンを追加するBASICリストは以下の通りです。

CALL POKES(&H4300+115,":ヌCキネ*"+CHR$(26)+"Cヘg@ノ") :'routine

4.3 機能の発動

 1文字表示ごとのSE発声機能を発動させるには、インフォメーションエリアに存在する「効果音番号(KJSE, 4300h+199)」へ0以外の効果音番号を代入してから、日本語表示を行います。

CALL POKE(&H4300+199,<1文字表示毎に鳴らすSE番号(1~255)>)
CALL KPUT("こんにちは!")

 KJSEに0を代入すると無音(SE発声しない)となります。

CALL KINIT(漢字表示機能の初期化)でbit5(処理単位設定)に1に設定した「装飾単位」モードではSEが発声できません。

4.4 機能の一時停止と終了

 1文字表示ごとのSE発声機能を一時中断する場合はフックの1バイト目を C9h に書き換えてください(再利用は C3h)。機能の利用を終了する場合はデフォルト値(C9h C9h C9h)で原状回復してください。

CALL POKE(&H4300+196,&HC9) ← 一時中断
CALL POKE(&H4300+196,&HC3) ← 一時中断からの再利用
CALL POKES(&H4300+196,"ノノノ") ← 機能停止(HKKPUTの原状回復)

第5章 補足

5.1 PSGの優先順位

 DMシステム2のBGM機能でPSGを使用するとき、SEでもPSGを使用すると、SEの音を優先します。ただし、SEで使用しないPSGのチャンネルは、引き続きBGMを演奏します。

 BGMとSEとで周波数の違うノイズを使用すると、一定時間BGMが聞き苦しくなる場合があります。※

※出荷時のBGMドライバ・SEドライバを利用するとき。

[Back]トップページへ