/*************************************************************************
*	GS controller
*************************************************************************/

/*************************************************************************
*	Modulation control
*-------------------------------------------------------------------------
*	(<part>,
*	 <PITCH>,     <TVF CUTOFF>, <AMPLITUDE>,
*	 <LFO1 RATE>, <LFO1 PITCH DEPTH>, <LFO1 TVF DEPTH>, <LFO1 TVA DEPTH>
*	 <LFO2 RATE>, <LFO2 PITCH DEPTH>, <LFO2 TVF DEPTH>, <LFO2 TVA DEPTH>
*************************************************************************/

int		exGs_mod( char *sqr, size_t bufSiz, char *buf, int argc, char **argv )
{
	int		part, v;
	char	dat[16];
	int		ret;

	if ( argc != 12 )
	{
_PARA_ERR:
		MM_setErrMsg(sqr,"[GS] 'MOD control' error!");
		return(ERR);
	}

	if ( (part = gs_getpart_n(atoi(argv[0]))) < 0 )
		goto _PARA_ERR;

	/* PITCH */
	v = atoi(argv[1]);
	if ( v < -24 || v > 24 )
		goto _PARA_ERR;
	dat[0] = v + 0x40;

	/* TVF CUTOFF */
	v = atoi(argv[2]);
	if ( v < -64 || v > 63 )
		goto _PARA_ERR;
	dat[1] = v + 0x40;

	/* AMPLITUDE */
	v = atoi(argv[3]);
	if ( v < -64 || v > 63 )
		goto _PARA_ERR;
	dat[2] = v + 0x40;

	/* LFO1 RATE */
	v = atoi(argv[4]);
	if ( v < -64 || v > 63 )
		goto _PARA_ERR;
	dat[3] = v + 0x40;

	/* LFO1 PITCH DEPTH */
	v = atoi(argv[5]);
	if ( v < 0 || v > 127 )
		goto _PARA_ERR;
	dat[4] = v;

	/* LFO1 TVF DEPTH */
	v = atoi(argv[6]);
	if ( v < 0 || v > 127 )
		goto _PARA_ERR;
	dat[5] = v;

	/* LFO1 TVA DEPTH */
	v = atoi(argv[7]);
	if ( v < 0 || v > 127 )
		goto _PARA_ERR;
	dat[6] = v;

	/* LFO2 RATE */
	v = atoi(argv[8]);
	if ( v < -64 || v > 63 )
		goto _PARA_ERR;
	dat[7] = v + 0x40;

	/* LFO2 PITCH DEPTH */
	v = atoi(argv[9]);
	if ( v < 0 || v > 127 )
		goto _PARA_ERR;
	dat[8] = v;

	/* LFO2 TVF DEPTH */
	v = atoi(argv[10]);
	if ( v < 0 || v > 127 )
		goto _PARA_ERR;
	dat[9] = v;

	/* LFO2 TVA DEPTH */
	v = atoi(argv[11]);
	if ( v < 0 || v > 127 )
		goto _PARA_ERR;
	dat[10] = v;
	return gs_genMML( sqr, bufSiz, buf, GS_PARTADR(part,0x402000), 11, dat );
}

/*************************************************************************
*	Bend control
*-------------------------------------------------------------------------
*	(<part>,
*	 <PITCH>,     <TVF CUTOFF>, <AMPLITUDE>,
*	 <LFO1 RATE>, <LFO1 PITCH DEPTH>, <LFO1 TVF DEPTH>, <LFO1 TVA DEPTH>
*	 <LFO2 RATE>, <LFO2 PITCH DEPTH>, <LFO2 TVF DEPTH>, <LFO2 TVA DEPTH>
*************************************************************************/

int		exGs_bend( char *sqr, size_t bufSiz, char *buf, int argc, char **argv )
{
	int		part, v;
	char	dat[16];
	int		ret;

	if ( argc != 12 )
	{
_PARA_ERR:
		MM_setErrMsg(sqr,"[GS] 'Pitch control' error!");
		return(ERR);
	}

	if ( (part = gs_getpart_n(atoi(argv[0]))) < 0 )
		goto _PARA_ERR;

	/* PITCH */
	v = atoi(argv[1]);
	if ( v < 0 || v > 24 )
		goto _PARA_ERR;
	dat[0] = v + 0x40;

	/* TVF CUTOFF */
	v = atoi(argv[2]);
	if ( v < -64 || v > 63 )
		goto _PARA_ERR;
	dat[1] = v + 0x40;

	/* AMPLITUDE */
	v = atoi(argv[3]);
	if ( v < -64 || v > 63 )
		goto _PARA_ERR;
	dat[2] = v + 0x40;

	/* LFO1 RATE */
	v = atoi(argv[4]);
	if ( v < -64 || v > 63 )
		goto _PARA_ERR;
	dat[3] = v + 0x40;

	/* LFO1 PITCH DEPTH */
	v = atoi(argv[5]);
	if ( v < 0 || v > 127 )
		goto _PARA_ERR;
	dat[4] = v;

	/* LFO1 TVF DEPTH */
	v = atoi(argv[6]);
	if ( v < 0 || v > 127 )
		goto _PARA_ERR;
	dat[5] = v;

	/* LFO1 TVA DEPTH */
	v = atoi(argv[7]);
	if ( v < 0 || v > 127 )
		goto _PARA_ERR;
	dat[6] = v;

	/* LFO2 RATE */
	v = atoi(argv[8]);
	if ( v < -64 || v > 63 )
		goto _PARA_ERR;
	dat[7] = v + 0x40;

	/* LFO2 PITCH DEPTH */
	v = atoi(argv[9]);
	if ( v < 0 || v > 127 )
		goto _PARA_ERR;
	dat[8] = v;

	/* LFO2 TVF DEPTH */
	v = atoi(argv[10]);
	if ( v < 0 || v > 127 )
		goto _PARA_ERR;
	dat[9] = v;

	/* LFO2 TVA DEPTH */
	v = atoi(argv[11]);
	if ( v < 0 || v > 127 )
		goto _PARA_ERR;
	dat[10] = v;
	return gs_genMML( sqr, bufSiz, buf, GS_PARTADR(part,0x402010), 11, dat );
}

/*************************************************************************
*	CAf control
*-------------------------------------------------------------------------
*	(<part>,
*	 <PITCH>,     <TVF CUTOFF>, <AMPLITUDE>,
*	 <LFO1 RATE>, <LFO1 PITCH DEPTH>, <LFO1 TVF DEPTH>, <LFO1 TVA DEPTH>
*	 <LFO2 RATE>, <LFO2 PITCH DEPTH>, <LFO2 TVF DEPTH>, <LFO2 TVA DEPTH>
*************************************************************************/

int		exGs_caf( char *sqr, size_t bufSiz, char *buf, int argc, char **argv )
{
	int		part, v;
	char	dat[16];
	int		ret;

	if ( argc != 12 )
	{
_PARA_ERR:
		MM_setErrMsg(sqr,"[GS] 'CAf control' error!");
		return(ERR);
	}

	if ( (part = gs_getpart_n(atoi(argv[0]))) < 0 )
		goto _PARA_ERR;

	/* PITCH */
	v = atoi(argv[1]);
	if ( v < -24 || v > 24 )
		goto _PARA_ERR;
	dat[0] = v + 0x40;

	/* TVF CUTOFF */
	v = atoi(argv[2]);
	if ( v < -64 || v > 63 )
		goto _PARA_ERR;
	dat[1] = v + 0x40;

	/* AMPLITUDE */
	v = atoi(argv[3]);
	if ( v < -64 || v > 63 )
		goto _PARA_ERR;
	dat[2] = v + 0x40;

	/* LFO1 RATE */
	v = atoi(argv[4]);
	if ( v < -64 || v > 63 )
		goto _PARA_ERR;
	dat[3] = v + 0x40;

	/* LFO1 PITCH DEPTH */
	v = atoi(argv[5]);
	if ( v < 0 || v > 127 )
		goto _PARA_ERR;
	dat[4] = v;

	/* LFO1 TVF DEPTH */
	v = atoi(argv[6]);
	if ( v < 0 || v > 127 )
		goto _PARA_ERR;
	dat[5] = v;

	/* LFO1 TVA DEPTH */
	v = atoi(argv[7]);
	if ( v < 0 || v > 127 )
		goto _PARA_ERR;
	dat[6] = v;

	/* LFO2 RATE */
	v = atoi(argv[8]);
	if ( v < -64 || v > 63 )
		goto _PARA_ERR;
	dat[7] = v + 0x40;

	/* LFO2 PITCH DEPTH */
	v = atoi(argv[9]);
	if ( v < 0 || v > 127 )
		goto _PARA_ERR;
	dat[8] = v;

	/* LFO2 TVF DEPTH */
	v = atoi(argv[10]);
	if ( v < 0 || v > 127 )
		goto _PARA_ERR;
	dat[9] = v;

	/* LFO2 TVA DEPTH */
	v = atoi(argv[11]);
	if ( v < 0 || v > 127 )
		goto _PARA_ERR;
	dat[10] = v;
	return gs_genMML( sqr, bufSiz, buf, GS_PARTADR(part,0x402020), 11, dat );
}

/*************************************************************************
*	PAf control
*-------------------------------------------------------------------------
*	(<part>,
*	 <PITCH>,     <TVF CUTOFF>, <AMPLITUDE>,
*	 <LFO1 RATE>, <LFO1 PITCH DEPTH>, <LFO1 TVF DEPTH>, <LFO1 TVA DEPTH>
*	 <LFO2 RATE>, <LFO2 PITCH DEPTH>, <LFO2 TVF DEPTH>, <LFO2 TVA DEPTH>
*************************************************************************/

int		exGs_paf( char *sqr, size_t bufSiz, char *buf, int argc, char **argv )
{
	int		part, v;
	char	dat[16];
	int		ret;

	if ( argc != 12 )
	{
_PARA_ERR:
		MM_setErrMsg(sqr,"[GS] 'PAf control' error!");
		return(ERR);
	}

	if ( (part = gs_getpart_n(atoi(argv[0]))) < 0 )
		goto _PARA_ERR;

	/* PITCH */
	v = atoi(argv[1]);
	if ( v < -24 || v > 24 )
		goto _PARA_ERR;
	dat[0] = v + 0x40;

	/* TVF CUTOFF */
	v = atoi(argv[2]);
	if ( v < -64 || v > 63 )
		goto _PARA_ERR;
	dat[1] = v + 0x40;

	/* AMPLITUDE */
	v = atoi(argv[3]);
	if ( v < -64 || v > 63 )
		goto _PARA_ERR;
	dat[2] = v + 0x40;

	/* LFO1 RATE */
	v = atoi(argv[4]);
	if ( v < -64 || v > 63 )
		goto _PARA_ERR;
	dat[3] = v + 0x40;

	/* LFO1 PITCH DEPTH */
	v = atoi(argv[5]);
	if ( v < 0 || v > 127 )
		goto _PARA_ERR;
	dat[4] = v;

	/* LFO1 TVF DEPTH */
	v = atoi(argv[6]);
	if ( v < 0 || v > 127 )
		goto _PARA_ERR;
	dat[5] = v;

	/* LFO1 TVA DEPTH */
	v = atoi(argv[7]);
	if ( v < 0 || v > 127 )
		goto _PARA_ERR;
	dat[6] = v;

	/* LFO2 RATE */
	v = atoi(argv[8]);
	if ( v < -64 || v > 63 )
		goto _PARA_ERR;
	dat[7] = v + 0x40;

	/* LFO2 PITCH DEPTH */
	v = atoi(argv[9]);
	if ( v < 0 || v > 127 )
		goto _PARA_ERR;
	dat[8] = v;

	/* LFO2 TVF DEPTH */
	v = atoi(argv[10]);
	if ( v < 0 || v > 127 )
		goto _PARA_ERR;
	dat[9] = v;

	/* LFO2 TVA DEPTH */
	v = atoi(argv[11]);
	if ( v < 0 || v > 127 )
		goto _PARA_ERR;
	dat[10] = v;
	return gs_genMML( sqr, bufSiz, buf, GS_PARTADR(part,0x402030), 11, dat );
}


/*************************************************************************
*	CC1 controller number
*-------------------------------------------------------------------------
*	(<part>,<number>)
*************************************************************************/

int		exGs_cc1number( char *sqr, size_t bufSiz, char *buf, int argc, char **argv )
{
	int		i, part;
	char	dat[4];
	int		ret;

	if ( argc != 2 )
	{
_PARA_ERR:
		MM_setErrMsg(sqr,"[GS] 'CC1 controller number' error!");
		return(ERR);
	}

	if ( (part = gs_getpart_n(atoi(argv[0]))) < 0 )
		goto _PARA_ERR;
	dat[0] = atoi(argv[1]);
	return gs_genMML( sqr, bufSiz, buf, GS_PARTADR(part,0x40101F), 1, dat );
}

/*************************************************************************
*	CC2 controller number
*-------------------------------------------------------------------------
*	(<part>,<number>)
*************************************************************************/

int		exGs_cc2number( char *sqr, size_t bufSiz, char *buf, int argc, char **argv )
{
	int		i, part;
	char	dat[4];
	int		ret;

	if ( argc != 2 )
	{
_PARA_ERR:
		MM_setErrMsg(sqr,"[GS] 'CC2 controller number' error!");
		return(ERR);
	}

	if ( (part = gs_getpart_n(atoi(argv[0]))) < 0 )
		goto _PARA_ERR;
	dat[0] = atoi(argv[1]);
	return gs_genMML( sqr, bufSiz, buf, GS_PARTADR(part,0x401020), 1, dat );
}


/*************************************************************************
*	CC1 control
*-------------------------------------------------------------------------
*	(<part>,
*	 <PITCH>,     <TVF CUTOFF>, <AMPLITUDE>,
*	 <LFO1 RATE>, <LFO1 PITCH DEPTH>, <LFO1 TVF DEPTH>, <LFO1 TVA DEPTH>
*	 <LFO2 RATE>, <LFO2 PITCH DEPTH>, <LFO2 TVF DEPTH>, <LFO2 TVA DEPTH>
*************************************************************************/

int		exGs_cc1control( char *sqr, size_t bufSiz, char *buf, int argc, char **argv )
{
	int		part, v;
	char	dat[16];
	int		ret;

	if ( argc != 12 )
	{
_PARA_ERR:
		MM_setErrMsg(sqr,"[GS] 'CC1 control' error!");
		return(ERR);
	}

	if ( (part = gs_getpart_n(atoi(argv[0]))) < 0 )
		goto _PARA_ERR;

	/* PITCH */
	v = atoi(argv[1]);
	if ( v < -24 || v > 24 )
		goto _PARA_ERR;
	dat[0] = v + 0x40;

	/* TVF CUTOFF */
	v = atoi(argv[2]);
	if ( v < -64 || v > 63 )
		goto _PARA_ERR;
	dat[1] = v + 0x40;

	/* AMPLITUDE */
	v = atoi(argv[3]);
	if ( v < -64 || v > 63 )
		goto _PARA_ERR;
	dat[2] = v + 0x40;

	/* LFO1 RATE */
	v = atoi(argv[4]);
	if ( v < -64 || v > 63 )
		goto _PARA_ERR;
	dat[3] = v + 0x40;

	/* LFO1 PITCH DEPTH */
	v = atoi(argv[5]);
	if ( v < 0 || v > 127 )
		goto _PARA_ERR;
	dat[4] = v;

	/* LFO1 TVF DEPTH */
	v = atoi(argv[6]);
	if ( v < 0 || v > 127 )
		goto _PARA_ERR;
	dat[5] = v;

	/* LFO1 TVA DEPTH */
	v = atoi(argv[7]);
	if ( v < 0 || v > 127 )
		goto _PARA_ERR;
	dat[6] = v;

	/* LFO2 RATE */
	v = atoi(argv[8]);
	if ( v < -64 || v > 63 )
		goto _PARA_ERR;
	dat[7] = v + 0x40;

	/* LFO2 PITCH DEPTH */
	v = atoi(argv[9]);
	if ( v < 0 || v > 127 )
		goto _PARA_ERR;
	dat[8] = v;

	/* LFO2 TVF DEPTH */
	v = atoi(argv[10]);
	if ( v < 0 || v > 127 )
		goto _PARA_ERR;
	dat[9] = v;

	/* LFO2 TVA DEPTH */
	v = atoi(argv[11]);
	if ( v < 0 || v > 127 )
		goto _PARA_ERR;
	dat[10] = v;
	return gs_genMML( sqr, bufSiz, buf, GS_PARTADR(part,0x402040), 11, dat );
}

/*************************************************************************
*	CC2 control
*-------------------------------------------------------------------------
*	(<part>,
*	 <PITCH>,     <TVF CUTOFF>, <AMPLITUDE>,
*	 <LFO1 RATE>, <LFO1 PITCH DEPTH>, <LFO1 TVF DEPTH>, <LFO1 TVA DEPTH>
*	 <LFO2 RATE>, <LFO2 PITCH DEPTH>, <LFO2 TVF DEPTH>, <LFO2 TVA DEPTH>
*************************************************************************/

int		exGs_cc2control( char *sqr, size_t bufSiz, char *buf, int argc, char **argv )
{
	int		part, v;
	char	dat[16];
	int		ret;

	if ( argc != 12 )
	{
_PARA_ERR:
		MM_setErrMsg(sqr,"[GS] 'CC2 control' error!");
		return(ERR);
	}

	if ( (part = gs_getpart_n(atoi(argv[0]))) < 0 )
		goto _PARA_ERR;

	/* PITCH */
	v = atoi(argv[1]);
	if ( v < -24 || v > 24 )
		goto _PARA_ERR;
	dat[0] = v + 0x40;

	/* TVF CUTOFF */
	v = atoi(argv[2]);
	if ( v < -64 || v > 63 )
		goto _PARA_ERR;
	dat[1] = v + 0x40;

	/* AMPLITUDE */
	v = atoi(argv[3]);
	if ( v < -64 || v > 63 )
		goto _PARA_ERR;
	dat[2] = v + 0x40;

	/* LFO1 RATE */
	v = atoi(argv[4]);
	if ( v < -64 || v > 63 )
		goto _PARA_ERR;
	dat[3] = v + 0x40;

	/* LFO1 PITCH DEPTH */
	v = atoi(argv[5]);
	if ( v < 0 || v > 127 )
		goto _PARA_ERR;
	dat[4] = v;

	/* LFO1 TVF DEPTH */
	v = atoi(argv[6]);
	if ( v < 0 || v > 127 )
		goto _PARA_ERR;
	dat[5] = v;

	/* LFO1 TVA DEPTH */
	v = atoi(argv[7]);
	if ( v < 0 || v > 127 )
		goto _PARA_ERR;
	dat[6] = v;

	/* LFO2 RATE */
	v = atoi(argv[8]);
	if ( v < -64 || v > 63 )
		goto _PARA_ERR;
	dat[7] = v + 0x40;

	/* LFO2 PITCH DEPTH */
	v = atoi(argv[9]);
	if ( v < 0 || v > 127 )
		goto _PARA_ERR;
	dat[8] = v;

	/* LFO2 TVF DEPTH */
	v = atoi(argv[10]);
	if ( v < 0 || v > 127 )
		goto _PARA_ERR;
	dat[9] = v;

	/* LFO2 TVA DEPTH */
	v = atoi(argv[11]);
	if ( v < 0 || v > 127 )
		goto _PARA_ERR;
	dat[10] = v;

	return gs_genMML( sqr, bufSiz, buf, GS_PARTADR(part,0x402050), 11, dat );
}
