/*
 *	cliptapx.h
 *
 *	TAPミキサー
 *
 *	CLiP - Common Library for P/ECE
 *	Copyright (C) 2001-2016 Naoyuki Sawa
 *
 *	* Fri Sep 18 22:38:30 JST 2015 Naoyuki Sawa
 *	- 1st リリース。
 *	* Wed Nov 18 21:37:53 JST 2015 Naoyuki Sawa
 *	- 'extern "C" {'〜'}'で囲みました。.cppを含むWin32プロジェクトからもインクルード出来るようにするためです。
 *	* Sun Feb 14 21:59:00 JST 2016 Naoyuki Sawa
 *	- ミキサーチャネル数の上限を、これまでは32でしたが、UINT8_MAX(=255)に増やしました。
 *	  これまでミキサーチャネル数の上限が32だった理由は、TapMxr_GetAtt()の引数のミキサーチャネルマスクをint引数1個で指定していたからです。
 *	  今回の変更に伴い、int引数1個でミキサーチャネルマスクを指定する事は出来なくなり、ミキサーチャネルマスクをビット配列で指定するように変更しました。
 *	- 変更前のコードはコメントアウトして残していません。
 *	  変更前のコードを参照する必要がある場合は、前回のアーカイブを参照して下さい。
 */
#ifndef __CLIP_TAPX_H__
#define __CLIP_TAPX_H__
#ifdef  __cplusplus
extern "C" {
#endif//__cplusplus
/*****************************************************************************
 *	定数、構造体
 *****************************************************************************/
//ミキサーチャネル
typedef struct _ST_TapMxrCh {
	uint8_t			iAttNow;				//+ 0,  1 現在減衰量		0=減衰無し。1以上の値はアプリケーションが任意に解釈して下さい。
	uint8_t			iAttTo;					//+ 1,  1 目標減衰量		0=減衰無し。1以上の値はアプリケーションが任意に解釈して下さい。
	uint16_t		iRate;					//+ 2,  2 減衰量変化速度(分子)	1[ms]あたり(Rate/Scale)の速度で変化します。
	uint16_t		iScale;					//+ 4,  2 減衰量変化速度(分母)	1[ms]あたり(Rate/Scale)の速度で変化します。
	uint16_t		iErrTerm;				//+ 6,  2 誤差項
} ST_TapMxrCh;								//= 8
/*---------------------------------------------------------------------------*/
//ミキサー
typedef struct _ST_TapMxr {
	uint8_t			nMxrCh;					//+ 0,  1 ミキサーチャネル数	1〜UINT8_MAX
	uint8_t			Dummy[3];				//+ 1,  3 (パディング)
    //	ST_TapMxrCh		TBL_MxrCh[nMxrCh];			//+ 4, 8N ミキサーチャネル
} ST_TapMxr;								//= 4+ 8N
/*****************************************************************************
 *	グローバル関数宣言
 *****************************************************************************/
//ミキサー
ST_TapMxr* TapMxr_New(int nMxrCh);
void TapMxr_Init(ST_TapMxr* pTapMxr, int nMxrCh);
void TapMxr_Free(ST_TapMxr* pTapMxr);
void TapMxr_Exec(ST_TapMxr* pTapMxr, int iElapTime);
//ミキサーチャネル
void TapMxrCh_SetAtt(ST_TapMxr* pTapMxr, int iMxrCh, int iAttTo, int iRate, int iScale);
int TapMxr_GetAtt(ST_TapMxr* pTapMxr, const void* aMxrChMask/*int[(nMxrCh+31)/32]*/);
//情報
ST_TapMxrCh* TapMxr_GetMxrCh(ST_TapMxr* pTapMxr, int iMxrCh);
#ifdef  __cplusplus
}//extern "C"
#endif//__cplusplus
#endif//__CLIP_TAPX_H__
