using System.Diagnostics;
using static org.piece_me.libclip;
class Program {
	public static ST_TapSeq pTapSeq;
	static void Main() {
		ST_TapSeqInfo stInfo = new ST_TapSeqInfo();
		stInfo.nPhr		= ushort.MaxValue;	//フレーズ数						1～UINT16_MAX	このフィールドはエラー検出のためだけに使用している。エラー検出が不要ならば常にUINT16_MAXを設定して構わない。
		stInfo.nDevCh		= 8;			//デバイスチャネル数					1～UINT8_MAX
		stInfo.fnPlay		= fnPlay;		//再生開始通知
		stInfo.fnStop		= fnStop;		//再生停止通知
		stInfo.fnLoop		= fnLoop;		//自然ループ通知					fnPlayと同じコールバック関数を設定しても良い。
		stInfo.fnEnd		= fnEnd;		//自然停止通知						fnStopと同じコールバック関数を設定しても良い。
		stInfo.fnNext		= fnNext;		//自然遷移通知						fnPlayと同じコールバック関数を設定しても良い。
		stInfo.fnCtrl		= fnCtrl;		//コントロール通知
		stInfo.fnGetPhrTime	= fnGetPhrTime;		//フレーズ時間[ms]を取得する。				(0～INT_MAX)を返せ。
		stInfo.fnGetPhrNext	= fnGetPhrNext;		//フレーズチェインの次のフレーズ番号を取得する。	通常フレーズならば-1を返せ。完全フレーズならば-2を返せ。中間フレーズならば0～(nPhr-1),かつ,iPhr以外の値を返せ。ループフレーズならばiPhrを返せ。
		stInfo.pTBL_TapSet	= new byte[8][] {
			new byte[] {0},
			new byte[] {1},
			new byte[] {2},
			new byte[] {3},
			new byte[] {4},
			new byte[] {5},
			new byte[] {6},
			new byte[] {7},
		};
		stInfo.pTBL_BaseCh	= new byte[8];
		stInfo.nEvt = 4;
		stInfo.iEvtMsk = byte.MaxValue;
		pTapSeq = TapSeq_New(stInfo);
		for(int i = 0; i < 10; i++) {
			TapSeq_Exec(pTapSeq, 1);
			ST_TapEvt evt;
			if(TapSeq_EvtGet(pTapSeq, out evt)) {
				Debug.WriteLine(evt.iEvt);
			}
		}
		TapLogCh_Play(pTapSeq, 4, 1, 2, 0, 0);
		for(int i = 0; i < 150; i++) {
			TapSeq_Exec(pTapSeq, 10);
			ST_TapEvt evt;
			if(TapSeq_EvtGet(pTapSeq, out evt)) {
				Debug.WriteLine(evt.iEvt);
			}
		}
		TapLogCh_Stop(pTapSeq, 4);
		for(int i = 0; i < 150; i++) {
			TapSeq_Exec(pTapSeq, 10);
			ST_TapEvt evt;
			if(TapSeq_EvtGet(pTapSeq, out evt)) {
				Debug.WriteLine(evt.iEvt);
			}
		}
	}
	public static void fnPlay(ST_TapSeq pTapSeq,int iLogCh,ST_TapLogCh pLogCh) { Debug.WriteLine("fnPlay" + pLogCh.iDevCh); }
	public static void fnStop(ST_TapSeq pTapSeq,int iLogCh,ST_TapLogCh pLogCh) { Debug.WriteLine("fnStop" + pLogCh.iDevCh); }
	public static void fnLoop(ST_TapSeq pTapSeq,int iLogCh,ST_TapLogCh pLogCh) { Debug.WriteLine("fnLoop" + pLogCh.iDevCh); }
	public static void fnEnd(ST_TapSeq pTapSeq,int iLogCh,ST_TapLogCh pLogCh) {  Debug.WriteLine("fnEnd" + pLogCh.iDevCh); }
	public static void fnNext(ST_TapSeq pTapSeq,int iLogCh,ST_TapLogCh pLogCh) { Debug.WriteLine("fnNext" + pLogCh.iDevCh); }
	public static void fnCtrl(ST_TapSeq pTapSeq,int iLogCh,ST_TapLogCh pLogCh) { Debug.WriteLine("fnCtrl" + pLogCh.iDevCh); }
	public static int fnGetPhrTime(ST_TapSeq pTapSeq,int iPhr) { return 1000; }
	public static int fnGetPhrNext(ST_TapSeq pTapSeq,int iPhr) { return -1; }

}
