/*
 *	clipdirs.c
 *
 *	演出シーケンサ
 *
 *	CLiP - Common Library for P/ECE
 *	Copyright (C) 2015-2016 Naoyuki Sawa
 *
 *	* Sun Feb 08 19:01:54 JST 2015 Naoyuki Sawa
 *	- 1st リリース。
 *	* Thu Apr 23 21:42:53 JST 2015 Naoyuki Sawa
 *	- DirSeq_Stop(),DirSeqCh_Stop()を追加しました。
 *	  演出テーブルをクリアせずに、現在実行中の演出シーケンスを停止したい場合に使用します。
 *	  例えば、'あるトリガ'から??秒後に'ある表示'を行うような演出シーケンスを開始した後に、何らかの条件でその予約を取り消す場合等です。
 *	* Tue May 05 17:15:43 JST 2015 Naoyuki Sawa
 *	- DirSeqCh_SetTblNo()を追加しました。
 *	* Sun Nov 22 21:02:41 JST 2015 Naoyuki Sawa
 *	- DirTrg_setとDirTrg_clrのシンボル定義を追加しました。
 *	  2015/11/20のdDirSeqC.exeの変更により、DirTrg_setとDirTrg_clr以外のトリガ番号のシンボルはdDirSeqC.exeが出力するようになりました。
 *	  dDirSeqC.exeが出力しない固定のトリガ番号のシンボルのみ、当モジュール内で定義する事にしました。
 *	* Tue Aug 02 22:11:15 JST 2016 Naoyuki Sawa
 *	- 演出実行関数(fnAct)の引数仕様を変更しました。
 *	  【変更前】void fnAct(int ActNo);				ActNo = [31]=オーバーフロー,[30:24]=未定義,[23:0]=演出番号
 *	  【変更後】void fnAct(int iCh, int ActNo, int bOverFlow);	iCh = 演出シーケンサチャネル番号, ActNo = 演出番号, bOverFlow = オーバーフロー
 *	- 今回の変更により、演出実行関数に演出シーケンサチャネル番号も通知されるようになりました。
 *	  アプリケーション側で、演出シーケンサチャネル番号も参照して、演出実行処理を行えるようになりました。
 *	- 今回の変更のために、演出番号バッファ(ST_DirSeq.pActBuf)をスタックフレーム上に確保するサイズが増加しました。(clipdirs.cの_DirSeq_SetActBuf())
 *	  (DirSeq_ActBufSize=256)の場合、変更前は(256×3)=768バイトだったのに対し、変更後は(256×4)=1024バイトになりました。
 *	  アプリケーションのMakefileにて、スタックサイズを十分確保するよう、注意して下さい。
 *	* Sun Sep 04 21:41:17 JST 2016 Naoyuki Sawa
 *	- 「#pragma warning(disable:...)」～「#pragma warning(default:...)」を、「#pragma warning(push)」「#pragma warning(disable:...)」～「#pragma warning(pop)」に変更しました。
 *	  詳細は、clipstd.h の同日のコメントを参照して下さい。
 *	* Mon Sep 05 21:24:05 JST 2016 Naoyuki Sawa
 *	- 64ビット対応のために、_DirSeq_SetActBuf()経由で呼び出される事が有る関数の第二パラメータ(arg2)に相当する引数の型を、(int)⇒(intptr_t)に変更しました。
 *	  _DirSeq_SetActBuf()経由で呼び出される事が有る関数の一つである、_DirSeqCh_SetTbl()の第二パラメータがポインタ型なので、その他の関数の第二パラメータも同じ変数サイズに揃える必要が有るためです。
 *	  尚、32ビットでは(int)も(intptr_t)も同じなので、既存の32ビットコードには影響有りません。
 *	* Fri Sep 09 21:13:53 JST 2016 Naoyuki Sawa
 *	- 演出シーケンサを、複数インスタンスに対応しました。
 *	  当モジュールの関数を呼び出している既存のアプリケーションも、修正が必要になります。
 *	  変更点は、以下の通りです:
 *	  ①clipdirs.cのローカル変数stDirSeqを廃止しました。
 *	    │今後は、アプリケーション側でST_DirSeq構造体のメモリを確保するか、ST_DirSeq型のグローバル変数を定義して下さい。
 *	  ②既存の各関数に、pDirSeq引数を追加しました。
 *	    │上記で確保したST_DirSeqインスタンスのポインタを、pDirSeq引数に指定して下さい。
 *	  ③演出実行関数(fnAct)に、pDirSeq引数を追加しました。
 *	    │どの演出シーケンサのインスタンスから呼び出されたかを、判断するための引数です。
 *	    │例えば、一つのオブジェクトに一つの演出シーケンサを関連付ける場合は、オブジェクトの中にST_DirSeq構造体を埋め込んでCONTAINING_RECORD()を使うか、又は、g_dataset_set_data()等でアドレスを関連付けて下さい。
 *	- 今回の変更と一緒に、ロックバッファサイズ(DirSeqCh_LockBufSize),スタッサイズ(DirSeqCh_StackSize),演出シーケンサチャネル番号の最大値(DirSeqCh_Max)等も、
 *	  定数ではなく、実行時に各インスタンス毎に指定出来るようにしようかとも考えたのですが、やっぱり、今回はそれは行わない事にしました。
 *	  一度に変更すると、変更箇所が多すぎて、デバッグが難しくなると思ったからです。
 *	  まずは、今回の変更が安定して動作する事を確認してから、上記の変更も行いたいと思います。							⇒{{2016/09/10コメント追記:演出シーケンサチャネル数を、定数でなく、実行時に各インスタンス毎に指定出来るようにしました。}}
 *	  特に、今回、複数インスタンスに対応した事によって、各インスタンスの演出シーケンサチャネル番号の最大値(DirSeqCh_Max)はもっと少なくて済むようになった可能性が高いので、
 *	  演出シーケンサチャネル番号の最大値(DirSeqCh_Max)を、定数でなく、実行時に各インスタンス毎に指定出来るようにする変更を、優先して行うべきです。	⇒{{2016/09/10コメント追記:演出シーケンサチャネル数を、定数でなく、実行時に各インスタンス毎に指定出来るようにしました。}}
 *	* Sat Sep 10 21:46:35 JST 2016 Naoyuki Sawa
 *	- 演出シーケンサチャネル数を、定数でなく、実行時に各インスタンス毎に指定出来るようにしました。
 *	  この変更を行った理由については、clipdirs.hの'Fri Sep 09 21:13:53 JST 2016'のコメントを参照して下さい。
 *	* Mon Sep 12 21:10:58 JST 2016 Naoyuki Sawa
 *	- 演出シーケンスが動作中であるかを取得する関数を追加しました。
 */
#include "clip.h"
/****************************************************************************
 *	ローカル変数
 ****************************************************************************/
//{{2016/09/09削除:演出シーケンサを、複数インスタンスに対応しました。
//static ST_DirSeq stDirSeq;
//}}2016/09/09削除:演出シーケンサを、複数インスタンスに対応しました。
/****************************************************************************
 *	ローカル関数宣言
 ****************************************************************************/
//{{2016/09/05変更:64ビット対応のために、_DirSeq_SetActBuf()経由で呼び出される事が有る関数の第二パラメータ(arg2)に相当する引数の型を、(int)⇒(intptr_t)に変更しました。
//static void _DirSeq_SetActBuf(void (*fn)(), int arg1, int arg2);
//static void _DirSeq_AddActBuf(int iCh, int ActNo);
//static void _DirSeq_GetActBuf(int bOverFlow);
//static void _DirSeqCh_Start(int iCh, const uint8_t* p);
//static void _DirSeq_Exec();
//static void _DirSeqCh_Exec1(int iCh, int bStop);
//static void _DirSeqCh_Exec2(int iCh, int bUnlock);
//static void _DirSeq_ClrTbl();
//static void _DirSeqCh_SetTbl(int iCh, const uint8_t* pDirTbl/*NULL=クリア*/);
//static void _DirSeq_SendTrig(int iTrig);
//static void _DirSeqCh_SendTrig(int iCh, int iTrig);
//static void _DirSeq_Unlock();
//static void _DirSeqCh_Unlock(int iCh);
//static void _DirSeq_Stop();
//static void _DirSeqCh_Stop(int iCh);
//↓2016/09/05変更:64ビット対応のために、_DirSeq_SetActBuf()経由で呼び出される事が有る関数の第二パラメータ(arg2)に相当する引数の型を、(int)⇒(intptr_t)に変更しました。
//static void _DirSeq_SetActBuf(void (*fn)(), int arg1, intptr_t arg2);
////--- _DirSeq_SetActBuf()経由で呼び出される事が有る関数:これらの関数は第二引数を(intptr_t)と同じサイズに揃える必要が有ります。 ---
//static void _DirSeq_Exec();
//static void _DirSeq_ClrTbl();
//static void _DirSeqCh_SetTbl(int iCh, const uint8_t* pDirTbl/*NULL=クリア*/);
//static void _DirSeq_SendTrig(int iTrig);
//static void _DirSeqCh_SendTrig(int iCh, intptr_t iTrig);
//static void _DirSeq_Unlock();
//static void _DirSeqCh_Unlock(int iCh);
//static void _DirSeq_Stop();
//static void _DirSeqCh_Stop(int iCh);
////--- _DirSeq_SetActBuf()経由で呼び出される事は無い関数:これらの関数は第二引数を(intptr_t)と同じサイズに揃える必要は有りません。 ---
//static void _DirSeq_AddActBuf(int iCh, int ActNo);
//static void _DirSeq_GetActBuf(int bOverFlow);
//static void _DirSeqCh_Start(int iCh, const uint8_t* p);
//static void _DirSeqCh_Exec1(int iCh, int bStop);
//static void _DirSeqCh_Exec2(int iCh, int bUnlock);
//↓2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
static void _DirSeq_SetActBuf(ST_DirSeq* pDirSeq, void (*fn)(), int arg1, intptr_t arg2);
//--- _DirSeq_SetActBuf()経由で呼び出される事が有る関数:これらの関数は第二引数を(intptr_t)と同じサイズに揃える必要が有ります。 ---
static void _DirSeq_Exec(ST_DirSeq* pDirSeq);
static void _DirSeq_ClrTbl(ST_DirSeq* pDirSeq);
static void _DirSeqCh_SetTbl(ST_DirSeq* pDirSeq, int iCh, const uint8_t* pDirTbl/*NULL=クリア*/);
static void _DirSeq_SendTrig(ST_DirSeq* pDirSeq, int iTrig);
static void _DirSeqCh_SendTrig(ST_DirSeq* pDirSeq, int iCh, intptr_t iTrig);
static void _DirSeq_Unlock(ST_DirSeq* pDirSeq);
static void _DirSeqCh_Unlock(ST_DirSeq* pDirSeq, int iCh);
static void _DirSeq_Stop(ST_DirSeq* pDirSeq);
static void _DirSeqCh_Stop(ST_DirSeq* pDirSeq, int iCh);
//--- _DirSeq_SetActBuf()経由で呼び出される事は無い関数:これらの関数は第二引数を(intptr_t)と同じサイズに揃える必要は有りません。 ---
static void _DirSeq_AddActBuf(ST_DirSeq* pDirSeq, int iCh, int ActNo);
static void _DirSeq_GetActBuf(ST_DirSeq* pDirSeq, int bOverFlow);
static void _DirSeqCh_Start(ST_DirSeq* pDirSeq, int iCh, const uint8_t* p);
static void _DirSeqCh_Exec1(ST_DirSeq* pDirSeq, int iCh, int bStop);
static void _DirSeqCh_Exec2(ST_DirSeq* pDirSeq, int iCh, int bUnlock);
//}}2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
/****************************************************************************
 *	
 ****************************************************************************/
//{{2016/09/10変更:演出シーケンサチャネル数を、定数でなく、実行時に各インスタンス毎に指定出来るようにしました。
////{{2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
////void DirSeq_Init(void (*fnAct)(int iCh, int ActNo, int bOverFlow)) {
////↓2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
//void DirSeq_Init(ST_DirSeq* pDirSeq, void (*fnAct)(struct _ST_DirSeq* pDirSeq, int iCh, int ActNo, int bOverFlow)) {
////}}2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
//	//構造体をクリアする。
////{{2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
////	memset(&stDirSeq, 0, sizeof stDirSeq);
////↓2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
//	memset(pDirSeq, 0, sizeof(ST_DirSeq));
////}}2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
//	//演出実行関数を格納する。
////{{2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
////	stDirSeq.fnAct = fnAct;
////↓2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
//	pDirSeq->fnAct = fnAct;
////}}2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
//}
//↓2016/09/10変更:演出シーケンサチャネル数を、定数でなく、実行時に各インスタンス毎に指定出来るようにしました。
ST_DirSeq* DirSeq_New(void (*fnAct)(struct _ST_DirSeq* pDirSeq, int iCh, int ActNo, int bOverFlow), int nCh) {
	ST_DirSeq* pDirSeq;
	//構造体のメモリを確保する。
#ifndef __RENESAS__
	pDirSeq = malloc(sizeof(ST_DirSeq) + (sizeof(ST_DirSeqCh) *  nCh));
#else //__RENESAS__
	pDirSeq = malloc(sizeof(ST_DirSeq) + (sizeof(ST_DirSeqCh) * (nCh - 1/*ST_DirSeq.TBL_DirSeqCh[0]の分*/)));	//Hewは要素数[0]の配列に対応していないので、要素数[1]として調整しました。
#endif//__RENESAS__
	if(!pDirSeq) { DIE(); }	//メモリ不足
	//構造体を初期化する。
	DirSeq_Init(pDirSeq, fnAct, nCh);
	return pDirSeq;
}
/*--------------------------------------------------------------------------*/
void DirSeq_Init(ST_DirSeq* pDirSeq, void (*fnAct)(struct _ST_DirSeq* pDirSeq, int iCh, int ActNo, int bOverFlow), int nCh) {
	//構造体をクリアする。
#ifndef __RENESAS__
	memset(pDirSeq, 0, sizeof(ST_DirSeq) + (sizeof(ST_DirSeqCh) *  nCh));
#else //__RENESAS__
	memset(pDirSeq, 0, sizeof(ST_DirSeq) + (sizeof(ST_DirSeqCh) * (nCh - 1/*ST_DirSeq.TBL_DirSeqCh[0]の分*/)));	//Hewは要素数[0]の配列に対応していないので、要素数[1]として調整しました。
#endif//__RENESAS__
	//演出実行関数を格納する。
	pDirSeq->fnAct = fnAct;
	//演出シーケンサチャネル数を格納する。
	pDirSeq->nCh = nCh;
}
/*--------------------------------------------------------------------------*/
void DirSeq_Free(ST_DirSeq* pDirSeq) {
	//構造体のメモリを開放する。
	free(pDirSeq);
}
//}}2016/09/10変更:演出シーケンサチャネル数を、定数でなく、実行時に各インスタンス毎に指定出来るようにしました。
/****************************************************************************
 *	
 ****************************************************************************/
//{{2016/09/05変更:64ビット対応のために、_DirSeq_SetActBuf()経由で呼び出される事が有る関数の第二パラメータ(arg2)に相当する引数の型を、(int)⇒(intptr_t)に変更しました。
//static void _DirSeq_SetActBuf(void (*fn)(), int arg1, int arg2) {
//↓2016/09/05変更:64ビット対応のために、_DirSeq_SetActBuf()経由で呼び出される事が有る関数の第二パラメータ(arg2)に相当する引数の型を、(int)⇒(intptr_t)に変更しました。
//static void _DirSeq_SetActBuf(void (*fn)(), int arg1, intptr_t arg2) {
//↓2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
static void _DirSeq_SetActBuf(ST_DirSeq* pDirSeq, void (*fn)(), int arg1, intptr_t arg2) {
//}}2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
	uint32_t ActBuf[DirSeq_ActBufSize];	//_DirSeq_SetActBuf()にてスタック上に確保したバッファのポインタをバッファが有効な期間中のみST_DirSeq.pActBufに設定する。充分なサイズ,かつ,スタックが溢れないようにDirSeq_ActBufSizeを調整せよ。
//{{2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
//	if(stDirSeq.pActBuf) { DIE(); }		//バグ
//↓2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
	if(pDirSeq->pActBuf) { DIE(); }		//バグ
//}}2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
	//演出番号バッファを設定する。
//{{2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
//	stDirSeq.pActBuf = ActBuf;
//↓2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
	pDirSeq->pActBuf = ActBuf;
//}}2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
	//引数で指定された関数を実行する。
//{{2016/09/05変更:64ビット対応のために、_DirSeq_SetActBuf()経由で呼び出される事が有る関数の第二パラメータ(arg2)に相当する引数の型を、(int)⇒(intptr_t)に変更しました。
//	(*fn)(arg1, arg2);
//↓2016/09/05変更:64ビット対応のために、_DirSeq_SetActBuf()経由で呼び出される事が有る関数の第二パラメータ(arg2)に相当する引数の型を、(int)⇒(intptr_t)に変更しました。
//	(*(void (*)(int, intptr_t))fn)(arg1, arg2);	//この場合は「(*fn)(arg1, arg2)」でも同じ結果になるはずですが、第二引数が(intptr_t)型である事を強調するために、関数型を明示的にキャストする事にしました。
//↓2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
	(*(void (*)(ST_DirSeq*, int, intptr_t))fn)(pDirSeq, arg1, arg2);	//この場合は「(*fn)(pDirSeq, arg1, arg2)」でも同じ結果になるはずですが、第二引数が(intptr_t)型である事を強調するために、関数型を明示的にキャストする事にしました。
//}}2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
	//演出番号を全て送出する。
//{{2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
//	while(stDirSeq.ActBufCnt) {
//↓2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
	while(pDirSeq->ActBufCnt) {
//}}2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
//{{2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
//		_DirSeq_GetActBuf(0/*bOverFlow*/);	//通常の送出であることを示す。
//↓2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
		_DirSeq_GetActBuf(pDirSeq, 0/*bOverFlow*/);	//通常の送出であることを示す。
//}}2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
	}
	//演出番号バッファをクリアする。
//{{2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
//	stDirSeq.pActBuf = NULL;
//↓2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
	pDirSeq->pActBuf = NULL;
//}}2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
}
/****************************************************************************
 *	
 ****************************************************************************/
//{{2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
//static void _DirSeq_AddActBuf(int iCh, int ActNo) {
//↓2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
static void _DirSeq_AddActBuf(ST_DirSeq* pDirSeq, int iCh, int ActNo) {
//}}2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
	int i;
//{{2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
//	if(!stDirSeq.pActBuf) { DIE(); }	//バグ
//↓2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
	if(!pDirSeq->pActBuf) { DIE(); }	//バグ
//}}2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
	//演出番号バッファに空きが無ければ…
//{{2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
//	if(stDirSeq.ActBufCnt >= DirSeq_ActBufSize) {
//↓2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
	if(pDirSeq->ActBufCnt >= DirSeq_ActBufSize) {
//}}2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
		//演出番号を一個送出して空きを確保する。
//{{2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
//		_DirSeq_GetActBuf(1/*bOverFlow*/);	//オーバーフロー時の送出であることを示す。
//↓2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
		_DirSeq_GetActBuf(pDirSeq, 1/*bOverFlow*/);	//オーバーフロー時の送出であることを示す。
//}}2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
//{{2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
//		if(stDirSeq.ActBufCnt >= DirSeq_ActBufSize) { DIE(); }	//バグ
//↓2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
		if(pDirSeq->ActBufCnt >= DirSeq_ActBufSize) { DIE(); }	//バグ
//}}2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
	}
	//演出番号を演出番号バッファに追加する。
//{{2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
//	i = stDirSeq.ActBufCnt + stDirSeq.ActBufPos;
//↓2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
	i = pDirSeq->ActBufCnt + pDirSeq->ActBufPos;
//}}2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
	if(i >= DirSeq_ActBufSize) { i -= DirSeq_ActBufSize; }
//{{2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
//	stDirSeq.pActBuf[i] = ActNo | (iCh << 24);	//[31:24]=演出シーケンサチャネル番号,[23:0]=演出番号
//	stDirSeq.ActBufCnt++;
//↓2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
	pDirSeq->pActBuf[i] = ActNo | (iCh << 24);	//[31:24]=演出シーケンサチャネル番号,[23:0]=演出番号
	pDirSeq->ActBufCnt++;
//}}2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
}
/****************************************************************************
 *	
 ****************************************************************************/
//{{2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
//static void _DirSeq_GetActBuf(int bOverFlow) {
//↓2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
static void _DirSeq_GetActBuf(ST_DirSeq* pDirSeq, int bOverFlow) {
//}}2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
	int iCh, ActNo;
//{{2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
//	if(!stDirSeq.pActBuf ||
//	   !stDirSeq.ActBufCnt) { DIE(); }	//バグ
//↓2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
	if(!pDirSeq->pActBuf ||
	   !pDirSeq->ActBufCnt) { DIE(); }	//バグ
//}}2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
	//演出番号を一個送出する。
//{{2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
//	ActNo = stDirSeq.pActBuf[stDirSeq.ActBufPos];
//↓2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
	ActNo = pDirSeq->pActBuf[pDirSeq->ActBufPos];
//}}2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
	iCh   = (uint8_t )(ActNo >> 24);	//[31:24]=演出シーケンサチャネル番号
	ActNo = (uint32_t)(ActNo <<  8) >> 8;	//[23: 0]=演出番号
//{{2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
//	stDirSeq.ActBufCnt--;
//	if(++stDirSeq.ActBufPos >= DirSeq_ActBufSize) { stDirSeq.ActBufPos = 0; }
//	(*stDirSeq.fnAct)(iCh, ActNo, bOverFlow);
//↓2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
	pDirSeq->ActBufCnt--;
	if(++pDirSeq->ActBufPos >= DirSeq_ActBufSize) { pDirSeq->ActBufPos = 0; }
	(*pDirSeq->fnAct)(pDirSeq, iCh, ActNo, bOverFlow);
//}}2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
}
/****************************************************************************
 *	
 ****************************************************************************/
//{{2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
//static void _DirSeqCh_Start(int iCh, const uint8_t* p) {
//↓2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
static void _DirSeqCh_Start(ST_DirSeq* pDirSeq, int iCh, const uint8_t* p) {
//}}2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
	ST_DirSeqCh* pDirSeqCh;
	int c1, c2;
	//演出シーケンサチャネルを取得する。
//{{2016/09/10変更:演出シーケンサチャネル数を、定数でなく、実行時に各インスタンス毎に指定出来るようにしました。
//	if((unsigned)iCh > (unsigned)DirSeqCh_Max) { DIE(); }	//バグ
//↓2016/09/10変更:演出シーケンサチャネル数を、定数でなく、実行時に各インスタンス毎に指定出来るようにしました。
	if((unsigned)iCh >= (unsigned)pDirSeq->nCh) { DIE(); }	//バグ
//}}2016/09/10変更:演出シーケンサチャネル数を、定数でなく、実行時に各インスタンス毎に指定出来るようにしました。
//{{2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
//	pDirSeqCh = &stDirSeq.TBL_DirSeqCh[iCh];
//↓2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
	pDirSeqCh = &pDirSeq->TBL_DirSeqCh[iCh];
//}}2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
	//実行中の演出シーケンスが有れば停止する。
//{{2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
//	_DirSeqCh_Stop(iCh);
//↓2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
	_DirSeqCh_Stop(pDirSeq, iCh);
//}}2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
	//相対位置とロック時間を取得する。
	c1  =         *p++;
	c1 |=         *p++ <<  8;
	c1 |= (int8_t)*p++ << 16;	//符号拡張、忘れずに!!
	c2  =         *p++;
	c2 |=         *p++ <<  8;
	//命令位置とロック時間を設定する。
	pDirSeqCh->pDirSeq = p + c1;
	pDirSeqCh->LockCnt =     c2;
	//演出シーケンスの開始と同時に、演出シーケンスを1フレーム実行する。
//{{2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
//	_DirSeqCh_Exec1(iCh, 0/*bStop*/);
//↓2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
	_DirSeqCh_Exec1(pDirSeq, iCh, 0/*bStop*/);
//}}2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
}
/****************************************************************************
 *	
 ****************************************************************************/
//{{2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
//void DirSeq_Exec() {
//↓2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
void DirSeq_Exec(ST_DirSeq* pDirSeq) {
//}}2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
//{{2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
//	if(stDirSeq.pActBuf) {
//↓2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
	if(pDirSeq->pActBuf) {
//}}2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
//{{2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
//		_DirSeq_Exec();
//↓2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
		_DirSeq_Exec(pDirSeq);
//}}2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
	} else {
//{{2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
//		_DirSeq_SetActBuf(_DirSeq_Exec, 0/*dummy*/, 0/*dummy*/);
//↓2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
		_DirSeq_SetActBuf(pDirSeq, _DirSeq_Exec, 0/*dummy*/, 0/*dummy*/);
//}}2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
	}
}
/*--------------------------------------------------------------------------*/
//{{2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
//static void _DirSeq_Exec() {
//↓2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
static void _DirSeq_Exec(ST_DirSeq* pDirSeq) {
//}}2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
	int iCh;
//{{2016/09/10変更:演出シーケンサチャネル数を、定数でなく、実行時に各インスタンス毎に指定出来るようにしました。
//	for(iCh = 0; iCh <= DirSeqCh_Max; iCh++) {
//↓2016/09/10変更:演出シーケンサチャネル数を、定数でなく、実行時に各インスタンス毎に指定出来るようにしました。
	for(iCh = 0; iCh < pDirSeq->nCh; iCh++) {
//}}2016/09/10変更:演出シーケンサチャネル数を、定数でなく、実行時に各インスタンス毎に指定出来るようにしました。
		//演出シーケンス処理を行う。
//{{2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
//		_DirSeqCh_Exec1(iCh, 0/*bStop*/);
//↓2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
		_DirSeqCh_Exec1(pDirSeq, iCh, 0/*bStop*/);
//}}2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
		//ロックバッファ処理を行う。
//{{2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
//		_DirSeqCh_Exec2(iCh, 0/*bUnlock*/);
//↓2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
		_DirSeqCh_Exec2(pDirSeq, iCh, 0/*bUnlock*/);
//}}2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
	}
}
/*--------------------------------------------------------------------------*/
//{{2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
//static void _DirSeqCh_Exec1(int iCh, int bStop) {
//↓2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
static void _DirSeqCh_Exec1(ST_DirSeq* pDirSeq, int iCh, int bStop) {
//}}2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
	ST_DirSeqCh* pDirSeqCh;
	int c1, c2;
	//演出シーケンサチャネルを取得する。
//{{2016/09/10変更:演出シーケンサチャネル数を、定数でなく、実行時に各インスタンス毎に指定出来るようにしました。
//	if((unsigned)iCh > (unsigned)DirSeqCh_Max) { DIE(); }	//バグ
//↓2016/09/10変更:演出シーケンサチャネル数を、定数でなく、実行時に各インスタンス毎に指定出来るようにしました。
	if((unsigned)iCh >= (unsigned)pDirSeq->nCh) { DIE(); }	//バグ
//}}2016/09/10変更:演出シーケンサチャネル数を、定数でなく、実行時に各インスタンス毎に指定出来るようにしました。
//{{2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
//	pDirSeqCh = &stDirSeq.TBL_DirSeqCh[iCh];
//↓2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
	pDirSeqCh = &pDirSeq->TBL_DirSeqCh[iCh];
//}}2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
	//停止中になるまで…
	while(pDirSeqCh->pDirSeq) {
		//停止時の処理でなければ…
		if(!bStop) {
			//待ち時間が残っていたら、抜ける。
			if(pDirSeqCh->WaitCnt) { break; }
		//停止時の処理ならば…
		} else {
			//待ち時間をクリアする。
			pDirSeqCh->WaitCnt = 0;
		}
		//1バイト目を取得する。
		c1 = *pDirSeqCh->pDirSeq++;
		switch(c1) {
		case 0x00://end
			//スタックが有れば…
			if(pDirSeqCh->StackLev) {
				//スタックを減らす。
				pDirSeqCh->StackLev--;
				//Repeatスタックならば…
				if(pDirSeqCh->TBL_StackRep[pDirSeqCh->StackLev]) {
					//停止時の処理でなければ…
					if(!bStop) {
						//繰り返し回数が無限(255)か,又は,繰り返し回数を1減らしてまだ残っていたら…
						if((  pDirSeqCh->TBL_StackRep[pDirSeqCh->StackLev] == 255/*無限*/) ||
						   (--pDirSeqCh->TBL_StackRep[pDirSeqCh->StackLev] != 0)) {
							//命令位置を設定する。
							pDirSeqCh->pDirSeq = pDirSeqCh->TBL_StackRet[pDirSeqCh->StackLev];
							//スタックを増やす。
							pDirSeqCh->StackLev++;
						}
					}
				//Callスタックならば…
				} else {
					//命令位置を設定する。
					pDirSeqCh->pDirSeq = pDirSeqCh->TBL_StackRet[pDirSeqCh->StackLev];
				}
			//スタックが無ければ…
			} else {
				//停止中にする。
				pDirSeqCh->pDirSeq = NULL;
			}
			break;
		case 0x01://repeat
			//繰り返し回数を取得する。
			c2 = *pDirSeqCh->pDirSeq++;
			if(!c2) { DIE(); }	//データバグ
			//繰り返し回数と命令位置を格納する。
			if(pDirSeqCh->StackLev >= DirSeqCh_StackSize) { DIE(); }	//スタック溢れ
			pDirSeqCh->TBL_StackRep[pDirSeqCh->StackLev] = c2;
			pDirSeqCh->TBL_StackRet[pDirSeqCh->StackLev] = pDirSeqCh->pDirSeq;
			//スタックを増やす。
			pDirSeqCh->StackLev++;
			break;
		case 0x02://wait
			//待ち時間を取得する。
			c2  = *pDirSeqCh->pDirSeq++;
			c2 |= *pDirSeqCh->pDirSeq++ << 8;
			if(!c2) { DIE(); }	//データバグ
			//待ち時間を格納する。
			pDirSeqCh->WaitCnt = c2;
			break;
		case 0x03://call
			//相対位置を取得する。
			c2  =         *pDirSeqCh->pDirSeq++;
			c2 |=         *pDirSeqCh->pDirSeq++ <<  8;
			c2 |= (int8_t)*pDirSeqCh->pDirSeq++ << 16;	//符号拡張、忘れずに!!
			//繰り返し回数(0=Callスタック)と命令位置を格納する。
			if(pDirSeqCh->StackLev >= DirSeqCh_StackSize) { DIE(); }	//スタック溢れ
			pDirSeqCh->TBL_StackRep[pDirSeqCh->StackLev] = 0;
			pDirSeqCh->TBL_StackRet[pDirSeqCh->StackLev] = pDirSeqCh->pDirSeq;
			//スタックを増やす。
			pDirSeqCh->StackLev++;
			//命令位置を設定する。
			pDirSeqCh->pDirSeq += c2;
			break;
		case 0x04://act
		case 0x05://act flush
			//演出番号を取得する。
			c2 =  *pDirSeqCh->pDirSeq++;
			c2 |= *pDirSeqCh->pDirSeq++ <<  8;
			c2 |= *pDirSeqCh->pDirSeq++ << 16;
			//停止時の処理でないか,又は,停止時にも実行する命令(act flush)ならば…
			if(!bStop || (c1 == 0x05/*act flush*/)) {
				//演出番号を演出番号バッファに追加する。
//{{2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
//				_DirSeq_AddActBuf(iCh, c2);
//↓2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
				_DirSeq_AddActBuf(pDirSeq, iCh, c2);
//}}2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
			}
			break;
		default:DIE();
		}
	}
	//停止時の処理でなければ…
	if(!bStop) {
		//次回のために待ち時間を減らす。
		if(pDirSeqCh->WaitCnt) { pDirSeqCh->WaitCnt--; }
	//停止時の処理ならば…
	} else {
		//待ち時間をクリアする。
		pDirSeqCh->WaitCnt = 0;
	}
}
/*--------------------------------------------------------------------------*/
//{{2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
//static void _DirSeqCh_Exec2(int iCh, int bUnlock) {
//↓2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
static void _DirSeqCh_Exec2(ST_DirSeq* pDirSeq, int iCh, int bUnlock) {
//}}2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
	ST_DirSeqCh* pDirSeqCh;
	const uint8_t* p;
	//演出シーケンサチャネルを取得する。
//{{2016/09/10変更:演出シーケンサチャネル数を、定数でなく、実行時に各インスタンス毎に指定出来るようにしました。
//	if((unsigned)iCh > (unsigned)DirSeqCh_Max) { DIE(); }	//バグ
//↓2016/09/10変更:演出シーケンサチャネル数を、定数でなく、実行時に各インスタンス毎に指定出来るようにしました。
	if((unsigned)iCh >= (unsigned)pDirSeq->nCh) { DIE(); }	//バグ
//}}2016/09/10変更:演出シーケンサチャネル数を、定数でなく、実行時に各インスタンス毎に指定出来るようにしました。
//{{2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
//	pDirSeqCh = &stDirSeq.TBL_DirSeqCh[iCh];
//↓2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
	pDirSeqCh = &pDirSeq->TBL_DirSeqCh[iCh];
//}}2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
	//ロックバッファが空になるまで…
	while((p = pDirSeqCh->TBL_LockBuf[0])) {
		//ロック解除時の処理でなければ…
		if(!bUnlock) { 
			//ロック時間が残っていたら、抜ける。
			if(pDirSeqCh->LockCnt) { break; }
		//ロック解除時の処理ならば…
		} else { 
			//ロック時間をクリアする。
			pDirSeqCh->LockCnt = 0;
		}
		//ロックバッファの先頭要素を削除する。
//{{このmemmove()の使い方は全く正しいにもかかわらずVC++6.0では警告出るので一時的に警告を抑制して回避する。
#ifdef  _MSC_VER
//{{2016/09/04変更:「#pragma warning(disable:...)」～「#pragma warning(default:...)」を、「#pragma warning(push)」「#pragma warning(disable:...)」～「#pragma warning(pop)」に変更しました。
//#pragma warning(disable:4090)	//'function' : 'const' 修飾子は異なります。
//#pragma warning(disable:4022)	//'memmove' : 1 番目の実引数のﾎﾟｲﾝﾀの型が、仮引数のﾎﾟｲﾝﾀの型と異なります。
//↓2016/09/04変更:「#pragma warning(disable:...)」～「#pragma warning(default:...)」を、「#pragma warning(push)」「#pragma warning(disable:...)」～「#pragma warning(pop)」に変更しました。
#pragma warning(push)
#pragma warning(disable:4090)	//'function' : 'const' 修飾子は異なります。
#pragma warning(disable:4022)	//'memmove' : 1 番目の実引数のﾎﾟｲﾝﾀの型が、仮引数のﾎﾟｲﾝﾀの型と異なります。
//}}2016/09/04変更:「#pragma warning(disable:...)」～「#pragma warning(default:...)」を、「#pragma warning(push)」「#pragma warning(disable:...)」～「#pragma warning(pop)」に変更しました。
#endif//_MSC_VER
		memmove(&pDirSeqCh->TBL_LockBuf[0],
		        &pDirSeqCh->TBL_LockBuf[1],
		 (sizeof pDirSeqCh->TBL_LockBuf[0]) * (DirSeqCh_LockBufSize - 1));
#ifdef  _MSC_VER
//{{2016/09/04変更:「#pragma warning(disable:...)」～「#pragma warning(default:...)」を、「#pragma warning(push)」「#pragma warning(disable:...)」～「#pragma warning(pop)」に変更しました。
//#pragma warning(default:4090)	//'function' : 'const' 修飾子は異なります。
//#pragma warning(default:4022)	//'memmove' : 1 番目の実引数のﾎﾟｲﾝﾀの型が、仮引数のﾎﾟｲﾝﾀの型と異なります。
//↓2016/09/04変更:「#pragma warning(disable:...)」～「#pragma warning(default:...)」を、「#pragma warning(push)」「#pragma warning(disable:...)」～「#pragma warning(pop)」に変更しました。
#pragma warning(pop)
//}}2016/09/04変更:「#pragma warning(disable:...)」～「#pragma warning(default:...)」を、「#pragma warning(push)」「#pragma warning(disable:...)」～「#pragma warning(pop)」に変更しました。
#endif//_MSC_VER
//}}このmemmove()の使い方は全く正しいにもかかわらずVC++6.0では警告出るので一時的に警告を抑制して回避する。
		         pDirSeqCh->TBL_LockBuf[      (DirSeqCh_LockBufSize - 1)] = NULL;
		//演出シーケンスを開始する。
//{{2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
//		_DirSeqCh_Start(iCh, p);
//↓2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
		_DirSeqCh_Start(pDirSeq, iCh, p);
//}}2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
	}
	//ロック解除時の処理でなければ…
	if(!bUnlock) { 
		//次回のためにロック時間を減らす。
		if(pDirSeqCh->LockCnt) { pDirSeqCh->LockCnt--; }
	//ロック解除時の処理ならば…
	} else { 
		//ロック時間をクリアする。
		pDirSeqCh->LockCnt = 0;
	}
}
/****************************************************************************
 *	
 ****************************************************************************/
//{{2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
//void DirSeq_ClrTbl() {
//↓2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
void DirSeq_ClrTbl(ST_DirSeq* pDirSeq) {
//}}2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
//{{2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
//	if(stDirSeq.pActBuf) {
//↓2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
	if(pDirSeq->pActBuf) {
//}}2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
//{{2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
//		_DirSeq_ClrTbl();
//↓2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
		_DirSeq_ClrTbl(pDirSeq);
//}}2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
	} else {
//{{2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
//		_DirSeq_SetActBuf(_DirSeq_ClrTbl, 0/*dummy*/, 0/*dummy*/);
//↓2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
		_DirSeq_SetActBuf(pDirSeq, _DirSeq_ClrTbl, 0/*dummy*/, 0/*dummy*/);
//}}2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
	}
}
/*--------------------------------------------------------------------------*/
//{{2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
//static void _DirSeq_ClrTbl() {
//↓2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
static void _DirSeq_ClrTbl(ST_DirSeq* pDirSeq) {
//}}2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
	int iCh;
//{{2016/09/10変更:演出シーケンサチャネル数を、定数でなく、実行時に各インスタンス毎に指定出来るようにしました。
//	for(iCh = 0; iCh <= DirSeqCh_Max; iCh++) {
//↓2016/09/10変更:演出シーケンサチャネル数を、定数でなく、実行時に各インスタンス毎に指定出来るようにしました。
	for(iCh = 0; iCh < pDirSeq->nCh; iCh++) {
//}}2016/09/10変更:演出シーケンサチャネル数を、定数でなく、実行時に各インスタンス毎に指定出来るようにしました。
//{{2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
//		DirSeqCh_SetTbl(iCh, NULL);
//↓2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
		DirSeqCh_SetTbl(pDirSeq, iCh, NULL);
//}}2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
	}
}
/****************************************************************************
 *	
 ****************************************************************************/
//{{2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
//void DirSeqCh_SetTbl(int iCh, const uint8_t* pDirTbl/*NULL=クリア*/) {
//↓2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
void DirSeqCh_SetTbl(ST_DirSeq* pDirSeq, int iCh, const uint8_t* pDirTbl/*NULL=クリア*/) {
//}}2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
//{{2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
//	if(stDirSeq.pActBuf) {
//↓2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
	if(pDirSeq->pActBuf) {
//}}2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
//{{2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
//		_DirSeqCh_SetTbl(iCh, pDirTbl);
//↓2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
		_DirSeqCh_SetTbl(pDirSeq, iCh, pDirTbl);
//}}2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
	} else {
//{{2016/09/05変更:64ビット対応のために、_DirSeq_SetActBuf()経由で呼び出される事が有る関数の第二パラメータ(arg2)に相当する引数の型を、(int)⇒(intptr_t)に変更しました。
//		_DirSeq_SetActBuf(_DirSeqCh_SetTbl, iCh, (int)pDirTbl);
//↓2016/09/05変更:64ビット対応のために、_DirSeq_SetActBuf()経由で呼び出される事が有る関数の第二パラメータ(arg2)に相当する引数の型を、(int)⇒(intptr_t)に変更しました。
//		_DirSeq_SetActBuf(_DirSeqCh_SetTbl, iCh, (intptr_t)pDirTbl);
//↓2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
		_DirSeq_SetActBuf(pDirSeq, _DirSeqCh_SetTbl, iCh, (intptr_t)pDirTbl);
//}}2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
	}
}
/*--------------------------------------------------------------------------*/
//{{2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
//static void _DirSeqCh_SetTbl(int iCh, const uint8_t* pDirTbl/*NULL=クリア*/) {
//↓2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
static void _DirSeqCh_SetTbl(ST_DirSeq* pDirSeq, int iCh, const uint8_t* pDirTbl/*NULL=クリア*/) {
//}}2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
	ST_DirSeqCh* pDirSeqCh;
	//演出シーケンサチャネルを取得する。
//{{2016/09/10変更:演出シーケンサチャネル数を、定数でなく、実行時に各インスタンス毎に指定出来るようにしました。
//	if((unsigned)iCh > (unsigned)DirSeqCh_Max) { DIE(); }	//バグ
//↓2016/09/10変更:演出シーケンサチャネル数を、定数でなく、実行時に各インスタンス毎に指定出来るようにしました。
	if((unsigned)iCh >= (unsigned)pDirSeq->nCh) { DIE(); }	//バグ
//}}2016/09/10変更:演出シーケンサチャネル数を、定数でなく、実行時に各インスタンス毎に指定出来るようにしました。
//{{2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
//	pDirSeqCh = &stDirSeq.TBL_DirSeqCh[iCh];
//↓2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
	pDirSeqCh = &pDirSeq->TBL_DirSeqCh[iCh];
//}}2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
	//'clr'トリガを送信する。
//{{2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
//	DirSeqCh_SendTrig(iCh, DirTrg_clr);
//↓2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
	DirSeqCh_SendTrig(pDirSeq, iCh, DirTrg_clr);
//}}2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
	//演出テーブルを設定する。
	pDirSeqCh->pDirTbl = pDirTbl;
	//'set'トリガを送信する。
//{{2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
//	DirSeqCh_SendTrig(iCh, DirTrg_set);
//↓2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
	DirSeqCh_SendTrig(pDirSeq, iCh, DirTrg_set);
//}}2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
}
/****************************************************************************
 *	
 ****************************************************************************/
//{{2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
//void DirSeq_SendTrig(int iTrig) {
//↓2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
void DirSeq_SendTrig(ST_DirSeq* pDirSeq, int iTrig) {
//}}2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
//{{2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
//	if(stDirSeq.pActBuf) {
//↓2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
	if(pDirSeq->pActBuf) {
//}}2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
//{{2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
//		_DirSeq_SendTrig(iTrig);
//↓2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
		_DirSeq_SendTrig(pDirSeq, iTrig);
//}}2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
	} else {
//{{2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
//		_DirSeq_SetActBuf(_DirSeq_SendTrig, iTrig, 0/*dummy*/);
//↓2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
		_DirSeq_SetActBuf(pDirSeq, _DirSeq_SendTrig, iTrig, 0/*dummy*/);
//}}2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
	}
}
/*--------------------------------------------------------------------------*/
//{{2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
//static void _DirSeq_SendTrig(int iTrig) {
//↓2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
static void _DirSeq_SendTrig(ST_DirSeq* pDirSeq, int iTrig) {
//}}2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
	int iCh;
//{{2016/09/10変更:演出シーケンサチャネル数を、定数でなく、実行時に各インスタンス毎に指定出来るようにしました。
//	for(iCh = 0; iCh <= DirSeqCh_Max; iCh++) {
//↓2016/09/10変更:演出シーケンサチャネル数を、定数でなく、実行時に各インスタンス毎に指定出来るようにしました。
	for(iCh = 0; iCh < pDirSeq->nCh; iCh++) {
//}}2016/09/10変更:演出シーケンサチャネル数を、定数でなく、実行時に各インスタンス毎に指定出来るようにしました。
//{{2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
//		DirSeqCh_SendTrig(iCh, iTrig);
//↓2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
		DirSeqCh_SendTrig(pDirSeq, iCh, iTrig);
//}}2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
	}
}
/****************************************************************************
 *	
 ****************************************************************************/
//{{2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
//void DirSeqCh_SendTrig(int iCh, int iTrig) {
//↓2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
void DirSeqCh_SendTrig(ST_DirSeq* pDirSeq, int iCh, int iTrig) {
//}}2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
//{{2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
//	if(stDirSeq.pActBuf) {
//↓2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
	if(pDirSeq->pActBuf) {
//}}2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
//{{2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
//		_DirSeqCh_SendTrig(iCh, iTrig);
//↓2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
		_DirSeqCh_SendTrig(pDirSeq, iCh, iTrig);
//}}2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
	} else {
//{{2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
//		_DirSeq_SetActBuf(_DirSeqCh_SendTrig, iCh, iTrig);
//↓2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
		_DirSeq_SetActBuf(pDirSeq, _DirSeqCh_SendTrig, iCh, iTrig);
//}}2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
	}
}
/*--------------------------------------------------------------------------*/
//{{2016/09/05変更:64ビット対応のために、_DirSeq_SetActBuf()経由で呼び出される事が有る関数の第二パラメータ(arg2)に相当する引数の型を、(int)⇒(intptr_t)に変更しました。
//static void _DirSeqCh_SendTrig(int iCh, int iTrig) {
//↓2016/09/05変更:64ビット対応のために、_DirSeq_SetActBuf()経由で呼び出される事が有る関数の第二パラメータ(arg2)に相当する引数の型を、(int)⇒(intptr_t)に変更しました。
//static void _DirSeqCh_SendTrig(int iCh, intptr_t iTrig) {
//↓2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
static void _DirSeqCh_SendTrig(ST_DirSeq* pDirSeq, int iCh, intptr_t iTrig) {
//}}2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
	ST_DirSeqCh* pDirSeqCh;
	const uint8_t* p;
	int i, c1, c2;
	//演出シーケンサチャネルを取得する。
//{{2016/09/10変更:演出シーケンサチャネル数を、定数でなく、実行時に各インスタンス毎に指定出来るようにしました。
//	if((unsigned)iCh > (unsigned)DirSeqCh_Max) { DIE(); }	//バグ
//↓2016/09/10変更:演出シーケンサチャネル数を、定数でなく、実行時に各インスタンス毎に指定出来るようにしました。
	if((unsigned)iCh >= (unsigned)pDirSeq->nCh) { DIE(); }	//バグ
//}}2016/09/10変更:演出シーケンサチャネル数を、定数でなく、実行時に各インスタンス毎に指定出来るようにしました。
//{{2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
//	pDirSeqCh = &stDirSeq.TBL_DirSeqCh[iCh];
//↓2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
	pDirSeqCh = &pDirSeq->TBL_DirSeqCh[iCh];
//}}2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
	//演出テーブルを走査して…
	p = pDirSeqCh->pDirTbl;
	while(p) {
		//1バイト目を取得する。
		c1 = *p++;
		switch(c1) {
		case 0x00://end
			p = NULL;
			break;
		case 0x06://on
		case 0x07://on unlock
			//トリガ番号を取得する。
			c2 = *p++;
			//トリガ番号が一致したら…
			if(c2 == iTrig) {
				//ロック解除する命令(on unlock)ならば…
				if(c1 == 0x07/*on unlock*/) {
					//ロック解除する。
//{{2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
//					DirSeqCh_Unlock(iCh);
//↓2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
					DirSeqCh_Unlock(pDirSeq, iCh);
//}}2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
				}
				//ロックバッファに空きが無ければ…
				if(pDirSeqCh->TBL_LockBuf[(DirSeqCh_LockBufSize - 1)]) {
					//現在のロック時間を強制的にクリアする。
					pDirSeqCh->LockCnt = 0;
					//最低一個以上の演出シーケンスを開始し、空きを確保する。
//{{2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
//					_DirSeqCh_Exec2(iCh, 0/*bUnlock*/);
//↓2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
					_DirSeqCh_Exec2(pDirSeq, iCh, 0/*bUnlock*/);
//}}2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
					if(pDirSeqCh->TBL_LockBuf[(DirSeqCh_LockBufSize - 1)]) { DIE(); }	//バグ
				}
				//ロックバッファが空でなければ…
				if(pDirSeqCh->TBL_LockBuf[0]) {
					//ロックバッファの最初の空き要素の位置を検索する。
					//上の処理で空きを確保済みなので、少なくとも最終要素が空きである。
					for(i = 0; i < DirSeqCh_LockBufSize - 1/*上記コメント参照*/; i++) {
						if(!pDirSeqCh->TBL_LockBuf[i]) { break; }
					}
					//ロックバッファの最初の空き要素の位置に演出シーケンスを格納する。
					pDirSeqCh->TBL_LockBuf[i] = p;
				//ロックバッファが空ならば…
				} else {
					//ロック時間が残っていたら…
					if(pDirSeqCh->LockCnt) {
						//ロックバッファの先頭に演出シーケンスを格納する。
						pDirSeqCh->TBL_LockBuf[0] = p;
					//ロック時間が残っていなければ…
					} else {
						//演出シーケンスを開始する。
//{{2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
//						_DirSeqCh_Start(iCh, p);
//↓2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
						_DirSeqCh_Start(pDirSeq, iCh, p);
//}}2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
					}
				}
			}
			//相対位置とロック時間を読み飛ばす。
			p += (3/*相対位置*/ + 2/*ロック時間*/);
			break;
		default:DIE();
		}
	}
}
/****************************************************************************
 *	
 ****************************************************************************/
//{{2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
//void DirSeq_Unlock() {
//↓2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
void DirSeq_Unlock(ST_DirSeq* pDirSeq) {
//}}2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
//{{2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
//	if(stDirSeq.pActBuf) {
//↓2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
	if(pDirSeq->pActBuf) {
//}}2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
//{{2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
//		_DirSeq_Unlock();
//↓2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
		_DirSeq_Unlock(pDirSeq);
//}}2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
	} else {
//{{2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
//		_DirSeq_SetActBuf(_DirSeq_Unlock, 0/*dummy*/, 0/*dummy*/);
//↓2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
		_DirSeq_SetActBuf(pDirSeq, _DirSeq_Unlock, 0/*dummy*/, 0/*dummy*/);
//}}2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
	}
}
/*--------------------------------------------------------------------------*/
//{{2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
//static void _DirSeq_Unlock() {
//↓2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
static void _DirSeq_Unlock(ST_DirSeq* pDirSeq) {
//}}2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
	int iCh;
//{{2016/09/10変更:演出シーケンサチャネル数を、定数でなく、実行時に各インスタンス毎に指定出来るようにしました。
//	for(iCh = 0; iCh <= DirSeqCh_Max; iCh++) {
//↓2016/09/10変更:演出シーケンサチャネル数を、定数でなく、実行時に各インスタンス毎に指定出来るようにしました。
	for(iCh = 0; iCh < pDirSeq->nCh; iCh++) {
//}}2016/09/10変更:演出シーケンサチャネル数を、定数でなく、実行時に各インスタンス毎に指定出来るようにしました。
//{{2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
//		DirSeqCh_Unlock(iCh);
//↓2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
		DirSeqCh_Unlock(pDirSeq, iCh);
//}}2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
	}
}
/****************************************************************************
 *	
 ****************************************************************************/
//{{2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
//void DirSeqCh_Unlock(int iCh) {
//↓2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
void DirSeqCh_Unlock(ST_DirSeq* pDirSeq, int iCh) {
//}}2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
//{{2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
//	if(stDirSeq.pActBuf) {
//↓2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
	if(pDirSeq->pActBuf) {
//}}2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
//{{2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
//		_DirSeqCh_Unlock(iCh);
//↓2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
		_DirSeqCh_Unlock(pDirSeq, iCh);
//}}2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
	} else {
//{{2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
//		_DirSeq_SetActBuf(_DirSeqCh_Unlock, iCh, 0/*dummy*/);
//↓2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
		_DirSeq_SetActBuf(pDirSeq, _DirSeqCh_Unlock, iCh, 0/*dummy*/);
//}}2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
	}
}
/*--------------------------------------------------------------------------*/
//{{2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
//static void _DirSeqCh_Unlock(int iCh) {
//↓2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
static void _DirSeqCh_Unlock(ST_DirSeq* pDirSeq, int iCh) {
//}}2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
//{{2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
//	_DirSeqCh_Exec2(iCh, 1/*bUnlock*/);
//↓2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
	_DirSeqCh_Exec2(pDirSeq, iCh, 1/*bUnlock*/);
//}}2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
}
/****************************************************************************
 *	
 ****************************************************************************/
//{{2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
//void DirSeq_Stop() {
//↓2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
void DirSeq_Stop(ST_DirSeq* pDirSeq) {
//}}2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
//{{2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
//	if(stDirSeq.pActBuf) {
//↓2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
	if(pDirSeq->pActBuf) {
//}}2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
//{{2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
//		_DirSeq_Stop();
//↓2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
		_DirSeq_Stop(pDirSeq);
//}}2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
	} else {
//{{2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
//		_DirSeq_SetActBuf(_DirSeq_Stop, 0/*dummy*/, 0/*dummy*/);
//↓2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
		_DirSeq_SetActBuf(pDirSeq, _DirSeq_Stop, 0/*dummy*/, 0/*dummy*/);
//}}2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
	}
}
/*--------------------------------------------------------------------------*/
//{{2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
//static void _DirSeq_Stop() {
//↓2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
static void _DirSeq_Stop(ST_DirSeq* pDirSeq) {
//}}2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
	int iCh;
//{{2016/09/10変更:演出シーケンサチャネル数を、定数でなく、実行時に各インスタンス毎に指定出来るようにしました。
//	for(iCh = 0; iCh <= DirSeqCh_Max; iCh++) {
//↓2016/09/10変更:演出シーケンサチャネル数を、定数でなく、実行時に各インスタンス毎に指定出来るようにしました。
	for(iCh = 0; iCh < pDirSeq->nCh; iCh++) {
//}}2016/09/10変更:演出シーケンサチャネル数を、定数でなく、実行時に各インスタンス毎に指定出来るようにしました。
//{{2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
//		DirSeqCh_Stop(iCh);
//↓2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
		DirSeqCh_Stop(pDirSeq, iCh);
//}}2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
	}
}
/****************************************************************************
 *	
 ****************************************************************************/
//{{2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
//void DirSeqCh_Stop(int iCh) {
//↓2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
void DirSeqCh_Stop(ST_DirSeq* pDirSeq, int iCh) {
//}}2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
//{{2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
//	if(stDirSeq.pActBuf) {
//↓2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
	if(pDirSeq->pActBuf) {
//}}2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
//{{2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
//		_DirSeqCh_Stop(iCh);
//↓2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
		_DirSeqCh_Stop(pDirSeq, iCh);
//}}2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
	} else {
//{{2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
//		_DirSeq_SetActBuf(_DirSeqCh_Stop, iCh, 0/*dummy*/);
//↓2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
		_DirSeq_SetActBuf(pDirSeq, _DirSeqCh_Stop, iCh, 0/*dummy*/);
//}}2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
	}
}
/*--------------------------------------------------------------------------*/
//{{2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
//static void _DirSeqCh_Stop(int iCh) {
//↓2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
static void _DirSeqCh_Stop(ST_DirSeq* pDirSeq, int iCh) {
//}}2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
//{{2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
//	_DirSeqCh_Exec1(iCh, 1/*bStop*/);
//↓2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
	_DirSeqCh_Exec1(pDirSeq, iCh, 1/*bStop*/);
//}}2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
}
//{{2016/09/12追加:演出シーケンスが動作中であるかを取得する関数を追加しました。
/****************************************************************************
 *	
 ****************************************************************************/
//演出シーケンスが動作中であるチャネル数を返します。
int DirSeq_GetStat(ST_DirSeq* pDirSeq) {
	int iCh, nActive = 0;
	for(iCh = 0; iCh < pDirSeq->nCh; iCh++) {
		nActive += DirSeqCh_GetStat(pDirSeq, iCh);
	}
	return nActive;
}
/*--------------------------------------------------------------------------*/
//このチャネルが動作中ならば1、停止中ならば0を返します。
int DirSeqCh_GetStat(ST_DirSeq* pDirSeq, int iCh) {
	ST_DirSeqCh* pDirSeqCh;
	if((unsigned)iCh >= (unsigned)pDirSeq->nCh) { DIE(); }	//バグ
	pDirSeqCh = &pDirSeq->TBL_DirSeqCh[iCh];
	return !!pDirSeqCh->pDirSeq;
}
//}}2016/09/12追加:演出シーケンスが動作中であるかを取得する関数を追加しました。
/****************************************************************************
 *	dDirSeqC.exeが出力したバイナリ形式を扱うためのユーティリティ関数
 ****************************************************************************/
#ifdef  USE_DIRSEQ_BIN
//{{2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
//void DirSeqCh_SetTblNo(int iCh, const void* pDirSeqBin, int iDirTblNo) {
//↓2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
void DirSeqCh_SetTblNo(ST_DirSeq* pDirSeq, int iCh, const void* pDirSeqBin, int iDirTblNo) {
//}}2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
	const int* const TBL_DirTblNo = pDirSeqBin;						//バイナリの先頭にアドレステーブルが有る。アドレスはデータ本体(BYTE配列)のインデクスである。
	const int nDirTblNo = TBL_DirTblNo[0];							//アドレステーブルの先頭[0]に要素数が入っている。要素数はそれ自身([0])も含む。
	const unsigned char* const TBL_DirSeq = (const unsigned char*)&TBL_DirTblNo[nDirTblNo];	//アドレステーブルの直後からデータ本体(BYTE配列)が開始する。
	if((iDirTblNo <= 0) || (iDirTblNo >= nDirTblNo)) { DIE(); }
//{{2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
//	DirSeqCh_SetTbl(iCh, &TBL_DirSeq[TBL_DirTblNo[iDirTblNo]]);
//↓2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
	DirSeqCh_SetTbl(pDirSeq, iCh, &TBL_DirSeq[TBL_DirTblNo[iDirTblNo]]);
//}}2016/09/09変更:演出シーケンサを、複数インスタンスに対応しました。
}
#endif//USE_DIRSEQ_BIN
