#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <winb.h>
#include <te.h>
#include <fntb.h>
#include <gui.h>
#include <file_dlg.h>
#include <egb.h>
#include <mos.h>
#include <snd.h>
#include "wavhime.h"
#include "otolib.h"

/* echo */
int	echoDialogId = -1 ;
int	echoOkBtnId = -1 ;
int	echoPlayBtnId = -1 ;
int	echoUndoBtnId = -1 ;
int	echofixBtnId = -1 ;
int	echoCanBtnId = -1 ;
int	echoMesId[48] = -1 ;
int	echoSubDialogId = -1 ;
int	echoDelayVolumeId = -1 ;
int	echoDelayNumId = -1 ;
int	echoMainMixVolumeId = -1 ;
int	echoMainMixNumId = -1 ;
int	echoDelayMixVolumeId = -1 ;
int	echoDelayMixNumId = -1 ;
int	echoDecVolumeId = -1 ;
int	echoDecNumId = -1 ;
int	echoCountNumId = -1 ;
int	echoAfterNumId = -1 ;
int	echoBtnId[4] = -1 ;
int	echoInfBtnId = -1 ;

/* phase */
int	phaseDialogId = -1 ;
int	phaseOkBtnId = -1 ;
int	phasePlayBtnId = -1 ;
int	phaseUndoBtnId = -1 ;
int	phaseFixBtnId = -1 ;
int	phaseCanBtnId = -1 ;
int	phaseMesId[37] = -1 ;
int	phaseSubDialogId = -1 ;
int	phaseDelayNumId = -1 ;
int	phaseMainMixVolumeId = -1 ;
int	phaseDelayMixVolumeId = -1 ;
int	phaseModu1NumId = -1 ;
int	phaseSpeed1NumId = -1 ;
int	phaseStart1NumId = -1 ;
int	phaseModu2NumId = -1 ;
int	phaseSpeed2NumId = -1 ;
int	phaseStart2NumId = -1 ;
int	phaseDelayVolumeId = -1 ;
int	phaseMainMixNumId = -1 ;
int	phaseDelayMixNumId = -1 ;
int	phaseBtnId[3] = -1 ;
int	phaseInfBtnId = -1 ;

/* vibrato */
int	vibraDialogId = -1 ;
int	vibraOkBtnId = -1 ;
int	vibraPlayBtnId = -1 ;
int	vibraUndoBtnId = -1 ;
int	vibraFixBtnId = -1 ;
int	vibraCanBtnId = -1 ;
int	vibraMesId[24] = -1 ;
int	vibraSubDialogId = -1 ;
int	vibraMainMixVolumeId = -1 ;
int	vibraMainMixNumId = -1 ;
int	vibraDelayMixVolumeId = -1 ;
int	vibraDelayMixNumId = -1 ;
int	vibraModu1NumId = -1 ;
int	vibraStart1NumId = -1 ;
int	vibraModu2NumId = -1 ;
int	vibraSpeed2NumId = -1 ;
int	vibraStart2NumId = -1 ;
int	vibraSpeed1NumId = -1 ;
int	vibraBtnId[3] = -1 ;
int	vibraInfBtnId = -1 ;

/* tremolo */
int	tremoDialogId = -1 ;
int	tremoOkBtnId = -1 ;
int	tremoPlayBtnId = -1 ;
int	tremoUndoBtnId = -1 ;
int	tremoFixBtnId = -1 ;
int	tremoCanBtnId = -1 ;
int	tremoMesId[23] = -1 ;
int	tremoSubDialogId = -1 ;
int	tremoMainMixVolumeId = -1 ;
int	tremoMainMixNumId = -1 ;
int	tremoTremoMixVolumeId = -1 ;
int	tremoTremoMixNumId = -1 ;
int	tremoSpeedNumId = -1 ;
int	tremoSpeedVolumeId = -1 ;
int	tremoBtnId[3] = -1 ;
int	tremoInfBtnId = -1 ;


/* ECHO */

static echoMode = 0 ;

int	sndEffectEcho()
{
	MMI_SendMessage( echoDialogId, MM_ATTACH, 1, MMI_GetBaseObj() ) ;

	MTL_setFlagObj( echoBtnId[echoMode], (MS_UNSELECT | MS_TOGGLE) ) ;

	MMI_SendMessage( echoDialogId, MM_SHOW, 0 ) ;	/* 全体を見せる */

	MMI_ExecSystem() ;		/* Dialog表示へ･･･イベントループ */

	MMI_SendMessage( echoDialogId, MM_ERASE, 0 ) ;
	MMI_SendMessage( echoDialogId, MM_DETACH, 0 ) ;

	return NOERR ;
}

/*	initDataIOTECH:echoOkBtnId:MJ_DBUTTONL40の呼び出し関数	*/
int	echoOkchk(kobj, messId, argc, pev, trigger)
int		kobj ;
int		messId ;
int		argc ;
EVENT	*pev ;
int		trigger ;
{
	int	var, min, max, delta, ptColumn ;
	int delay, mainmix, delmix, decrate, count, after, f ;
	int ret ;
	int bit, kd, sz ;

	SetMouse16( 81, 0xf, 0x8 ) ;	/* マウスカーソルをウエイト表示 */
	setMsgColor( echoMesId[0], EXE_COLOR ) ;

	if( tempFileCount == 0 )	/* テンポラリファイルの数が0なら */
	{
		ret = NO_DATA ;
		goto END_00 ;
	}
	else if( tempFileCount == 1 )	/* テンポラリファイルの数が1なら */
	{
		if( (ret = temp1_to_temp2()) != NOERR )		/* temp1をtemp2へ */
			goto END_00 ;
	}

	if( (ret = readWavDataInfo( &f, &bit, &kd, &sz )) != NOERR )
		goto END_00 ;

	MMI_SendMessage( echoDelayNumId, MM_GETNUMBOX, 5,	/* delay */
						&var, &min, &max, &delta, &ptColumn ) ;
	delay = f * var / 1000 ;

	MMI_SendMessage( echoMainMixNumId, MM_GETNUMBOX, 5,	/* main mix */
						&var, &min, &max, &delta, &ptColumn ) ;
	mainmix = var * 256 / 100 ;

	MMI_SendMessage( echoDelayMixNumId, MM_GETNUMBOX, 5,	/* delay mix */
						&var, &min, &max, &delta, &ptColumn ) ;
	delmix = var * 256 / 100 ;

	MMI_SendMessage( echoDecNumId, MM_GETNUMBOX, 5,	/* 減衰率 */
						&var, &min, &max, &delta, &ptColumn ) ;
	decrate = var * 256 / 100 ;

	MMI_SendMessage( echoCountNumId, MM_GETNUMBOX, 5,	/* 回数 */
						&var, &min, &max, &delta, &ptColumn ) ;
	count = var ;

	MMI_SendMessage( echoAfterNumId, MM_GETNUMBOX, 5,	/* 余韻 */
						&var, &min, &max, &delta, &ptColumn ) ;
	after = f * var / 1000 ;

	if( (count * delay) > 100000 )	// あまり古い過去の音は拾えないので
		count = 100000 / delay ;
	if( (count * delay) < -100000 )	// あまり古い過去の音は拾えないので
		count = -100000 / delay ;

	ret = sndEcho( delay, mainmix, delmix, decrate, count, after, echoMode ) ;

END_00: ;
	setMsgColor( echoMesId[0], MOJI_COLOR ) ;
	SetMouse16( 80, 0xf, 0x8 ) ;	/* マウスカーソルを元に */

	if( ret )
		errorCheck( ret ) ;

	MMI_FlushEvnt() ;	/* イベントをフラッシュ */

	return NOERR ;
}

/*	initDataIOTECH:echoPlayBtnId:MJ_DBUTTONL40の呼び出し関数	*/
int	echoPlay(kobj, messId, argc, pev, trigger)
int		kobj ;
int		messId ;
int		argc ;
EVENT	*pev ;
int		trigger ;
{
	setMsgColor( echoMesId[1], EXE_COLOR ) ;

	sndPlay() ;

	setMsgColor( echoMesId[1], MOJI_COLOR ) ;

	return NOERR ;
}

/*	initDataIOTECH:echoUndoBtnId:MJ_DBUTTONL40の呼び出し関数	*/
int	echoUndo(kobj, messId, argc, pev, trigger)
int		kobj ;
int		messId ;
int		argc ;
EVENT	*pev ;
int		trigger ;
{
	setMsgColor( echoMesId[2], EXE_COLOR ) ;

	unDo() ;

	setMsgColor( echoMesId[2], MOJI_COLOR ) ;

	MMI_FlushEvnt() ;	/* イベントをフラッシュ */

	return NOERR ;
}

/*	initDataIOTECH:echofixBtnId:MJ_DBUTTONL40の呼び出し関数	*/
int	echoFix(kobj, messId, argc, pev, trigger)
int		kobj ;
int		messId ;
int		argc ;
EVENT	*pev ;
int		trigger ;
{
	delTemp2() ;
	return NOERR ;
}

/*	initDataIOTECH:echoInfBtnId:MJ_DBUTTONL40の呼び出し関数	*/
int	echoInf(kobj, messId, argc, pev, trigger)
int		kobj ;
int		messId ;
int		argc ;
EVENT	*pev ;
int		trigger ;
{
	/* ダイアログを使えないようにする */
	MTL_setAtrObj( echoDialogId, MS_DSPONLYL40 ) ;

	sndInf() ;

	/* ダイアログを使えるように戻す */
	MTL_resetAtrObj( echoDialogId, (~MS_DSPONLYL40) ) ;
	return NOERR ;
}

/*	initDataIOTECH:echoCanBtnId:MJ_DBUTTONL40の呼び出し関数	*/
int	echoCanchk(kobj, messId, argc, pev, trigger)
int		kobj ;
int		messId ;
int		argc ;
EVENT	*pev ;
int		trigger ;
{
	MMI_SetHaltFlag( TRUE ) ;
	return NOERR ;
}

/*	initDataIOTECH:echoBtnId[0]:MJ_TICONL40の呼び出し関数	*/
/*	initDataIOTECH:echoBtnId[1]:MJ_TICONL40の呼び出し関数	*/
int	echoModeSet(kobj, messId, argc, pev, trigger)
int		kobj ;
int		messId ;
int		argc ;
EVENT	*pev ;
int		trigger ;
{
	int i ;

	for( i=0 ; i<4 ; i++ )
	{
		if( kobj == echoBtnId[i] )
		{
			MTL_setFlagObj( echoBtnId[i], MS_UNSELECT ) ;
			MTL_resetFlagObj( echoBtnId[echoMode],
								 (~(MS_UNSELECT | MS_TOGGLE)) ) ;
			MMI_SendMessage( echoBtnId[echoMode], MM_SHOW, 0 ) ;
			echoMode = i ;
		}
	}
	return NOERR ;
}

/*	initDataIOTECH:echoDelayVolumeId:MJ_SCRLL40の呼び出し関数	*/
/*	initDataIOTECH:echoDelayNumId:MJ_NUMBOXL40の呼び出し関数	*/
int	echoDelaySet(kobj, messId, argc, pev, trigger)
int		kobj ;
int		messId ;
int		argc ;
EVENT	*pev ;
int		trigger ;
{
	/* ボリュームは1/5 */

	int	var, min, max, len, page ;			/* スクロールの変数 */
	int	var2, min2, max2, delta2, ptColumn2 ;	/* 数値設定の変数 */

	if( kobj == echoDelayVolumeId )
	{
		MMI_SendMessage( kobj, MM_GETSCROLL, 5,
										&var, &min, &max, &len, &page ) ;
		MMI_SendMessage( echoDelayNumId, MM_GETNUMBOX, 5,
							&var2, &min2, &max2, &delta2, &ptColumn2 ) ;
		MMI_SendMessage( echoDelayNumId, MM_SETNUMBOX, 5,
							var*5, min2, max2, delta2, ptColumn2 ) ;
		MMI_SendMessage( echoDelayNumId, MM_SHOW, 0 ) ;
	}

	if( kobj == echoDelayNumId )
	{
		MMI_SendMessage( kobj, MM_GETNUMBOX, 5,
							&var2, &min2, &max2, &delta2, &ptColumn2 ) ;
		MMI_SendMessage( echoDelayVolumeId, MM_GETSCROLL, 5,
										&var, &min, &max, &len, &page ) ;
//		if( var2 > 500 )var2 = 500 ;
		MMI_SendMessage( echoDelayVolumeId, MM_SETSCROLL, 5,
										var2/5, min, max, len, page ) ;
		MMI_SendMessage( echoDelayVolumeId, MM_SHOW, 0 ) ;
	}

	return NOERR ;
}

/*	initDataIOTECH:echoMainMixVolumeId:MJ_SCRLL40の呼び出し関数	*/
/*	initDataIOTECH:echoMainMixNumId:MJ_NUMBOXL40の呼び出し関数	*/
int	echoMainMixSet(kobj, messId, argc, pev, trigger)
int		kobj ;
int		messId ;
int		argc ;
EVENT	*pev ;
int		trigger ;
{
	int	var, min, max, len, page ;			/* スクロールの変数 */
	int	var2, min2, max2, delta2, ptColumn2 ;	/* 数値設定の変数 */

	if( kobj == echoMainMixVolumeId )
	{
		MMI_SendMessage( kobj, MM_GETSCROLL, 5,
										&var, &min, &max, &len, &page ) ;
		MMI_SendMessage( echoMainMixNumId, MM_GETNUMBOX, 5,
							&var2, &min2, &max2, &delta2, &ptColumn2 ) ;
		MMI_SendMessage( echoMainMixNumId, MM_SETNUMBOX, 5,
							var, min2, max2, delta2, ptColumn2 ) ;
		MMI_SendMessage( echoMainMixNumId, MM_SHOW, 0 ) ;
	}

	if( kobj == echoMainMixNumId )
	{
		MMI_SendMessage( kobj, MM_GETNUMBOX, 5,
							&var2, &min2, &max2, &delta2, &ptColumn2 ) ;
		MMI_SendMessage( echoMainMixVolumeId, MM_GETSCROLL, 5,
										&var, &min, &max, &len, &page ) ;
		MMI_SendMessage( echoMainMixVolumeId, MM_SETSCROLL, 5,
										var2, min, max, len, page ) ;
		MMI_SendMessage( echoMainMixVolumeId, MM_SHOW, 0 ) ;
	}

	return NOERR ;
}

/*	initDataIOTECH:echoDelayMixVolumeId:MJ_SCRLL40の呼び出し関数	*/
/*	initDataIOTECH:echoDelayMixNumId:MJ_NUMBOXL40の呼び出し関数	*/
int	echoDelayMixSet(kobj, messId, argc, pev, trigger)
int		kobj ;
int		messId ;
int		argc ;
EVENT	*pev ;
int		trigger ;
{
	int	var, min, max, len, page ;			/* スクロールの変数 */
	int	var2, min2, max2, delta2, ptColumn2 ;	/* 数値設定の変数 */

	if( kobj == echoDelayMixVolumeId )
	{
		MMI_SendMessage( kobj, MM_GETSCROLL, 5,
										&var, &min, &max, &len, &page ) ;
		MMI_SendMessage( echoDelayMixNumId, MM_GETNUMBOX, 5,
							&var2, &min2, &max2, &delta2, &ptColumn2 ) ;
		MMI_SendMessage( echoDelayMixNumId, MM_SETNUMBOX, 5,
							var, min2, max2, delta2, ptColumn2 ) ;
		MMI_SendMessage( echoDelayMixNumId, MM_SHOW, 0 ) ;
	}

	if( kobj == echoDelayMixNumId )
	{
		MMI_SendMessage( kobj, MM_GETNUMBOX, 5,
							&var2, &min2, &max2, &delta2, &ptColumn2 ) ;
		MMI_SendMessage( echoDelayMixVolumeId, MM_GETSCROLL, 5,
										&var, &min, &max, &len, &page ) ;
		MMI_SendMessage( echoDelayMixVolumeId, MM_SETSCROLL, 5,
										var2, min, max, len, page ) ;
		MMI_SendMessage( echoDelayMixVolumeId, MM_SHOW, 0 ) ;
	}

	return NOERR ;
}

/*	initDataIOTECH:echoDecVolumeId:MJ_SCRLL40の呼び出し関数	*/
/*	initDataIOTECH:echoDecNumId:MJ_NUMBOXL40の呼び出し関数	*/
int	echoDecSet(kobj, messId, argc, pev, trigger)
int		kobj ;
int		messId ;
int		argc ;
EVENT	*pev ;
int		trigger ;
{
	int	var, min, max, len, page ;			/* スクロールの変数 */
	int	var2, min2, max2, delta2, ptColumn2 ;	/* 数値設定の変数 */

	if( kobj == echoDecVolumeId )
	{
		MMI_SendMessage( kobj, MM_GETSCROLL, 5,
										&var, &min, &max, &len, &page ) ;
		MMI_SendMessage( echoDecNumId, MM_GETNUMBOX, 5,
							&var2, &min2, &max2, &delta2, &ptColumn2 ) ;
		MMI_SendMessage( echoDecNumId, MM_SETNUMBOX, 5,
							var, min2, max2, delta2, ptColumn2 ) ;
		MMI_SendMessage( echoDecNumId, MM_SHOW, 0 ) ;
	}

	if( kobj == echoDecNumId )
	{
		MMI_SendMessage( kobj, MM_GETNUMBOX, 5,
							&var2, &min2, &max2, &delta2, &ptColumn2 ) ;
		MMI_SendMessage( echoDecVolumeId, MM_GETSCROLL, 5,
										&var, &min, &max, &len, &page ) ;
		MMI_SendMessage( echoDecVolumeId, MM_SETSCROLL, 5,
										var2, min, max, len, page ) ;
		MMI_SendMessage( echoDecVolumeId, MM_SHOW, 0 ) ;
	}

	return NOERR ;
}


/*	PHASE */

static phaseMode = 0 ;

int	sndEffectPhaseShift()
{
	MMI_SendMessage( phaseDialogId, MM_ATTACH, 1, MMI_GetBaseObj() ) ;

	MTL_setFlagObj( phaseBtnId[phaseMode], (MS_UNSELECT | MS_TOGGLE) ) ;

	MMI_SendMessage( phaseDialogId, MM_SHOW, 0 ) ;	/* 全体を見せる */

	MMI_ExecSystem() ;		/* Dialog表示へ･･･イベントループ */

	MMI_SendMessage( phaseDialogId, MM_ERASE, 0 ) ;
	MMI_SendMessage( phaseDialogId, MM_DETACH, 0 ) ;

	return NOERR ;
}

/*	initDataIOTPHA:phasePlayBtnId:MJ_DBUTTONL40の呼び出し関数	*/
int	phasePlay(kobj, messId, argc, pev, trigger)
int		kobj ;
int		messId ;
int		argc ;
EVENT	*pev ;
int		trigger ;
{
	setMsgColor( phaseMesId[1], EXE_COLOR ) ;

	sndPlay() ;

	setMsgColor( phaseMesId[1], MOJI_COLOR ) ;

	return NOERR ;
}

/*	initDataIOTPHA:phaseOkBtnId:MJ_DBUTTONL40の呼び出し関数	*/
int	phaseOkchk(kobj, messId, argc, pev, trigger)
int		kobj ;
int		messId ;
int		argc ;
EVENT	*pev ;
int		trigger ;
{
	int	var, min, max, delta, ptColumn ;
	int f, bit, kd, sz ;
	int delay, mixM, mixD, modu1, speed1, start1, modu2, speed2, start2 ;
	int ret ;

	SetMouse16( 81, 0xf, 0x8 ) ;	/* マウスカーソルをウエイト表示 */
	setMsgColor( phaseMesId[0], EXE_COLOR ) ;

	if( tempFileCount == 0 )	/* テンポラリファイルの数が0なら */
	{
		ret = NO_DATA ;
		goto END_00 ;
	}
	else if( tempFileCount == 1 )	/* テンポラリファイルの数が1なら */
	{
		if( (ret = temp1_to_temp2()) != NOERR )		/* temp1をtemp2へ */
			goto END_00 ;
	}

	if( (ret = readWavDataInfo( &f, &bit, &kd, &sz )) != NOERR )
		goto END_00 ;

	MMI_SendMessage( phaseDelayNumId, MM_GETNUMBOX, 5,	/* delay */
						&var, &min, &max, &delta, &ptColumn ) ;
	delay = (double)var / 10 / 1000 * f ;

	MMI_SendMessage( phaseMainMixNumId, MM_GETNUMBOX, 5,	/* main mix */
						&var, &min, &max, &delta, &ptColumn ) ;
	mixM = var * 256 / 100 ;

	MMI_SendMessage( phaseDelayMixNumId, MM_GETNUMBOX, 5,	/* delay mix */
						&var, &min, &max, &delta, &ptColumn ) ;
	mixD = var * 256 / 100 ;

	MMI_SendMessage( phaseModu1NumId, MM_GETNUMBOX, 5,		/* modu1 */
						&var, &min, &max, &delta, &ptColumn ) ;
	modu1 = (double)var / 10 / 1000 * f ;

	MMI_SendMessage( phaseSpeed1NumId, MM_GETNUMBOX, 5,		/* speed1 */
						&var, &min, &max, &delta, &ptColumn ) ;
	speed1 = (double)var / 100 * 65536 * 4 / f ;

	MMI_SendMessage( phaseStart1NumId, MM_GETNUMBOX, 5,		/* start1 */
						&var, &min, &max, &delta, &ptColumn ) ;
	start1 = var * 65536 / 90 + 65535*3 ;

	MMI_SendMessage( phaseModu2NumId, MM_GETNUMBOX, 5,		/* modu2 */
						&var, &min, &max, &delta, &ptColumn ) ;
	modu2 = (double)var / 10 / 1000 * f ;

	MMI_SendMessage( phaseSpeed2NumId, MM_GETNUMBOX, 5,		/* speed2 */
						&var, &min, &max, &delta, &ptColumn ) ;
	speed2 = (double)var / 100 * 65536 * 4 / f ;

	MMI_SendMessage( phaseStart2NumId, MM_GETNUMBOX, 5,		/* start2 */
						&var, &min, &max, &delta, &ptColumn ) ;
	start2 = var * 65536 / 90 + 65535*3 ;

	ret = sndPhase( delay, mixM, mixD,
			modu1, speed1, start1, modu2, speed2, start2, phaseMode ) ;

END_00: ;
	setMsgColor( phaseMesId[0], MOJI_COLOR ) ;
	SetMouse16( 80, 0xf, 0x8 ) ;	/* マウスカーソルを元に */

	if( ret )
		errorCheck( ret ) ;

	MMI_FlushEvnt() ;	/* イベントをフラッシュ */

	return NOERR ;
}

/*	initDataIOTPHA:phaseBtnId[0]:MJ_TICONL40の呼び出し関数	*/
/*	initDataIOTPHA:phaseBtnId[1]:MJ_TICONL40の呼び出し関数	*/
/*	initDataIOTPHA:phaseBtnId[2]:MJ_TICONL40の呼び出し関数	*/
int	phaseModeSet(kobj, messId, argc, pev, trigger)
int		kobj ;
int		messId ;
int		argc ;
EVENT	*pev ;
int		trigger ;
{
	int i ;

	for( i=0 ; i<3 ; i++ )
	{
		if( kobj == phaseBtnId[i] )
		{
			MTL_setFlagObj( phaseBtnId[i], MS_UNSELECT ) ;
			MTL_resetFlagObj( phaseBtnId[phaseMode],
								 (~(MS_UNSELECT | MS_TOGGLE)) ) ;
			MMI_SendMessage( phaseBtnId[phaseMode], MM_SHOW, 0 ) ;
			phaseMode = i ;
		}
	}
	return NOERR ;
}

/*	initDataIOTPHA:phaseCanBtnId:MJ_DBUTTONL40の呼び出し関数	*/
int	phaseCanchk(kobj, messId, argc, pev, trigger)
int		kobj ;
int		messId ;
int		argc ;
EVENT	*pev ;
int		trigger ;
{
	MMI_SetHaltFlag( TRUE ) ;
	return NOERR ;
}

/*	initDataIOTPHA:phaseDelayNumId:MJ_NUMBOXL40の呼び出し関数	*/
/*	initDataIOTPHA:phaseDelayVolumeId:MJ_SCRLL40の呼び出し関数	*/
int	phaseDelaySet(kobj, messId, argc, pev, trigger)
int		kobj ;
int		messId ;
int		argc ;
EVENT	*pev ;
int		trigger ;
{
	int	var, min, max, len, page ;			/* スクロールの変数 */
	int	var2, min2, max2, delta2, ptColumn2 ;	/* 数値設定の変数 */

	if( kobj == phaseDelayVolumeId )
	{
		MMI_SendMessage( kobj, MM_GETSCROLL, 5,
										&var, &min, &max, &len, &page ) ;
		MMI_SendMessage( phaseDelayNumId, MM_GETNUMBOX, 5,
							&var2, &min2, &max2, &delta2, &ptColumn2 ) ;
		MMI_SendMessage( phaseDelayNumId, MM_SETNUMBOX, 5,
							var, min2, max2, delta2, ptColumn2 ) ;
		MMI_SendMessage( phaseDelayNumId, MM_SHOW, 0 ) ;
	}

	if( kobj == phaseDelayNumId )
	{
		MMI_SendMessage( kobj, MM_GETNUMBOX, 5,
							&var2, &min2, &max2, &delta2, &ptColumn2 ) ;
		MMI_SendMessage( phaseDelayVolumeId, MM_GETSCROLL, 5,
										&var, &min, &max, &len, &page ) ;
		MMI_SendMessage( phaseDelayVolumeId, MM_SETSCROLL, 5,
										var2, min, max, len, page ) ;
		MMI_SendMessage( phaseDelayVolumeId, MM_SHOW, 0 ) ;
	}

	return NOERR ;
}

/*	initDataIOTPHA:phaseMainMixVolumeId:MJ_SCRLL40の呼び出し関数	*/
/*	initDataIOTPHA:phaseMainMixNumId:MJ_NUMBOXL40の呼び出し関数	*/
int	phaseMainMixSet(kobj, messId, argc, pev, trigger)
int		kobj ;
int		messId ;
int		argc ;
EVENT	*pev ;
int		trigger ;
{
	int	var, min, max, len, page ;			/* スクロールの変数 */
	int	var2, min2, max2, delta2, ptColumn2 ;	/* 数値設定の変数 */

	if( kobj == phaseMainMixVolumeId )
	{
		MMI_SendMessage( kobj, MM_GETSCROLL, 5,
										&var, &min, &max, &len, &page ) ;
		MMI_SendMessage( phaseMainMixNumId, MM_GETNUMBOX, 5,
							&var2, &min2, &max2, &delta2, &ptColumn2 ) ;
		MMI_SendMessage( phaseMainMixNumId, MM_SETNUMBOX, 5,
							var, min2, max2, delta2, ptColumn2 ) ;
		MMI_SendMessage( phaseMainMixNumId, MM_SHOW, 0 ) ;
	}

	if( kobj == phaseMainMixNumId )
	{
		MMI_SendMessage( kobj, MM_GETNUMBOX, 5,
							&var2, &min2, &max2, &delta2, &ptColumn2 ) ;
		MMI_SendMessage( phaseMainMixVolumeId, MM_GETSCROLL, 5,
										&var, &min, &max, &len, &page ) ;
		MMI_SendMessage( phaseMainMixVolumeId, MM_SETSCROLL, 5,
										var2, min, max, len, page ) ;
		MMI_SendMessage( phaseMainMixVolumeId, MM_SHOW, 0 ) ;
	}

	return NOERR ;
}

/*	initDataIOTPHA:phaseDelayMixVolumeId:MJ_SCRLL40の呼び出し関数	*/
/*	initDataIOTPHA:phaseDelayMixNumId:MJ_NUMBOXL40の呼び出し関数	*/
int	phaseDelayMixSet(kobj, messId, argc, pev, trigger)
int		kobj ;
int		messId ;
int		argc ;
EVENT	*pev ;
int		trigger ;
{
	int	var, min, max, len, page ;			/* スクロールの変数 */
	int	var2, min2, max2, delta2, ptColumn2 ;	/* 数値設定の変数 */

	if( kobj == phaseDelayMixVolumeId )
	{
		MMI_SendMessage( kobj, MM_GETSCROLL, 5,
										&var, &min, &max, &len, &page ) ;
		MMI_SendMessage( phaseDelayMixNumId, MM_GETNUMBOX, 5,
							&var2, &min2, &max2, &delta2, &ptColumn2 ) ;
		MMI_SendMessage( phaseDelayMixNumId, MM_SETNUMBOX, 5,
							var, min2, max2, delta2, ptColumn2 ) ;
		MMI_SendMessage( phaseDelayMixNumId, MM_SHOW, 0 ) ;
	}

	if( kobj == phaseDelayMixNumId )
	{
		MMI_SendMessage( kobj, MM_GETNUMBOX, 5,
							&var2, &min2, &max2, &delta2, &ptColumn2 ) ;
		MMI_SendMessage( phaseDelayMixVolumeId, MM_GETSCROLL, 5,
										&var, &min, &max, &len, &page ) ;
		MMI_SendMessage( phaseDelayMixVolumeId, MM_SETSCROLL, 5,
										var2, min, max, len, page ) ;
		MMI_SendMessage( phaseDelayMixVolumeId, MM_SHOW, 0 ) ;
	}

	return NOERR ;
}

/*	initDataIOTPHA:phaseUndoBtnId:MJ_DBUTTONL40の呼び出し関数	*/
int	phaseUndo(kobj, messId, argc, pev, trigger)
int		kobj ;
int		messId ;
int		argc ;
EVENT	*pev ;
int		trigger ;
{
	setMsgColor( phaseMesId[2], EXE_COLOR ) ;

	unDo() ;

	setMsgColor( phaseMesId[2], MOJI_COLOR ) ;

	MMI_FlushEvnt() ;	/* イベントをフラッシュ */

	return NOERR ;
}

/*	initDataIOTPHA:phaseFixBtnId:MJ_DBUTTONL40の呼び出し関数	*/
int	phaseFix(kobj, messId, argc, pev, trigger)
int		kobj ;
int		messId ;
int		argc ;
EVENT	*pev ;
int		trigger ;
{
	delTemp2() ;
	return NOERR ;
}

/*	initDataIOTPHA:phaseInfBtnId:MJ_DBUTTONL40の呼び出し関数	*/
int	phaseInf(kobj, messId, argc, pev, trigger)
int		kobj ;
int		messId ;
int		argc ;
EVENT	*pev ;
int		trigger ;
{
	/* ダイアログを使えないようにする */
	MTL_setAtrObj( phaseDialogId, MS_DSPONLYL40 ) ;

	sndInf() ;

	/* ダイアログを使えるように戻す */
	MTL_resetAtrObj( phaseDialogId, (~MS_DSPONLYL40) ) ;
	return NOERR ;
}


/* VIBRATO */

static int vibraMode = 0 ;

int	sndEffectVibrato()
{
	MMI_SendMessage( vibraDialogId, MM_ATTACH, 1, MMI_GetBaseObj() ) ;

	MTL_setFlagObj( vibraBtnId[vibraMode], (MS_UNSELECT | MS_TOGGLE) ) ;

	MMI_SendMessage( vibraDialogId, MM_SHOW, 0 ) ;	/* 全体を見せる */

	MMI_ExecSystem() ;		/* Dialog表示へ･･･イベントループ */

	MMI_SendMessage( vibraDialogId, MM_ERASE, 0 ) ;
	MMI_SendMessage( vibraDialogId, MM_DETACH, 0 ) ;

	return NOERR ;
}

/*	initDataIOTVIB:vibraOkBtnId:MJ_DBUTTONL40の呼び出し関数	*/
int	vibraOkchk(kobj, messId, argc, pev, trigger)
int		kobj ;
int		messId ;
int		argc ;
EVENT	*pev ;
int		trigger ;
{
	int	var, min, max, delta, ptColumn ;
	int d, vf, s ;
	int f, bit, kd, sz ;
	int delay, mixM, mixD, modu1, speed1, start1, modu2, speed2, start2 ;
	int ret ;

	SetMouse16( 81, 0xf, 0x8 ) ;	/* マウスカーソルをウエイト表示 */
	setMsgColor( vibraMesId[0], EXE_COLOR ) ;

	if( tempFileCount == 0 )	/* テンポラリファイルの数が0なら */
	{
		ret = NO_DATA ;
		goto END_00 ;
	}
	else if( tempFileCount == 1 )	/* テンポラリファイルの数が1なら */
	{
		if( (ret = temp1_to_temp2()) != NOERR )		/* temp1をtemp2へ */
			goto END_00 ;
	}

	if( (ret = readWavDataInfo( &f, &bit, &kd, &sz )) != NOERR )
		goto END_00 ;

	MMI_SendMessage( vibraMainMixNumId, MM_GETNUMBOX, 5,	/* main mix */
						&var, &min, &max, &delta, &ptColumn ) ;
	mixM = var * 256 / 100 ;

	MMI_SendMessage( vibraDelayMixNumId, MM_GETNUMBOX, 5,	/* delay mix */
						&var, &min, &max, &delta, &ptColumn ) ;
	mixD = var * 256 / 100 ;

	MMI_SendMessage( vibraModu1NumId, MM_GETNUMBOX, 5,		/* modu1 */
						&var, &min, &max, &delta, &ptColumn ) ;
	d = var ;

	MMI_SendMessage( vibraSpeed1NumId, MM_GETNUMBOX, 5,		/* speed1 */
						&var, &min, &max, &delta, &ptColumn ) ;
	vf = var ;

	MMI_SendMessage( vibraStart1NumId, MM_GETNUMBOX, 5,		/* start1 */
						&var, &min, &max, &delta, &ptColumn ) ;
	s = var ;

	modu1 = .05946 * f * d / ( 2 * 3.14 * vf / 10 * 100 ) ;
	speed1 = (double)vf / 10 * 65535 * 4 / f ;
	start1 = 65536 * s / 90 + 65536 * 3 ;	/* 270°先送り */

	MMI_SendMessage( vibraModu2NumId, MM_GETNUMBOX, 5,		/* modu2 */
						&var, &min, &max, &delta, &ptColumn ) ;
	d = var ;

	MMI_SendMessage( vibraSpeed2NumId, MM_GETNUMBOX, 5,		/* speed2 */
						&var, &min, &max, &delta, &ptColumn ) ;
	vf = var ;

	MMI_SendMessage( vibraStart2NumId, MM_GETNUMBOX, 5,		/* start2 */
						&var, &min, &max, &delta, &ptColumn ) ;
	s = var ;

	modu2 = .05946 * f * d / ( 2 * 3.14 * vf / 10 * 100 ) ;
	speed2 = (double)vf / 10 * 65535 * 4 / f ;
	start2 = 65536 * s / 90 + 65536 * 3 ;	/* 270°先送り */

	delay = modu1 + modu2 ;					/* phase delay */

	ret = sndPhase( delay, mixM, mixD,
			modu1, speed1, start1, modu2, speed2, start2, vibraMode ) ;

END_00: ;
	setMsgColor( vibraMesId[0], MOJI_COLOR ) ;
	SetMouse16( 80, 0xf, 0x8 ) ;	/* マウスカーソルを元に */

	if( ret )
		errorCheck( ret ) ;

	MMI_FlushEvnt() ;	/* イベントをフラッシュ */

	return NOERR ;
}

/*	initDataIOTVIB:vibraPlayBtnId:MJ_DBUTTONL40の呼び出し関数	*/
int	vibraPlay(kobj, messId, argc, pev, trigger)
int		kobj ;
int		messId ;
int		argc ;
EVENT	*pev ;
int		trigger ;
{
	setMsgColor( vibraMesId[1], EXE_COLOR ) ;

	sndPlay() ;

	setMsgColor( vibraMesId[1], MOJI_COLOR ) ;

	return NOERR ;
}

/*	initDataIOTVIB:vibraUndoBtnId:MJ_DBUTTONL40の呼び出し関数	*/
int	vibraUndo(kobj, messId, argc, pev, trigger)
int		kobj ;
int		messId ;
int		argc ;
EVENT	*pev ;
int		trigger ;
{
	setMsgColor( vibraMesId[2], EXE_COLOR ) ;

	unDo() ;

	setMsgColor( vibraMesId[2], MOJI_COLOR ) ;

	MMI_FlushEvnt() ;	/* イベントをフラッシュ */

	return NOERR ;
}

/*	initDataIOTVIB:vibraFixBtnId:MJ_DBUTTONL40の呼び出し関数	*/
int	vibraFix(kobj, messId, argc, pev, trigger)
int		kobj ;
int		messId ;
int		argc ;
EVENT	*pev ;
int		trigger ;
{
	delTemp2() ;
	return NOERR ;
}

/*	initDataIOTVIB:vibraInfBtnId:MJ_DBUTTONL40の呼び出し関数	*/
int	vibraInf(kobj, messId, argc, pev, trigger)
int		kobj ;
int		messId ;
int		argc ;
EVENT	*pev ;
int		trigger ;
{
	/* ダイアログを使えないようにする */
	MTL_setAtrObj( vibraDialogId, MS_DSPONLYL40 ) ;

	sndInf() ;

	/* ダイアログを使えるように戻す */
	MTL_resetAtrObj( vibraDialogId, (~MS_DSPONLYL40) ) ;

	return NOERR ;
}

/*	initDataIOTVIB:vibraCanBtnId:MJ_DBUTTONL40の呼び出し関数	*/
int	vibraCanchk(kobj, messId, argc, pev, trigger)
int		kobj ;
int		messId ;
int		argc ;
EVENT	*pev ;
int		trigger ;
{
	MMI_SetHaltFlag( TRUE ) ;
	return NOERR ;
}

/*	initDataIOTVIB:vibraBtnId[0]:MJ_TICONL40の呼び出し関数	*/
/*	initDataIOTVIB:vibraBtnId[1]:MJ_TICONL40の呼び出し関数	*/
/*	initDataIOTVIB:vibraBtnId[2]:MJ_TICONL40の呼び出し関数	*/
int	vibraModeSet(kobj, messId, argc, pev, trigger)
int		kobj ;
int		messId ;
int		argc ;
EVENT	*pev ;
int		trigger ;
{
	int i ;

	for( i=0 ; i<3 ; i++ )
	{
		if( kobj == vibraBtnId[i] )
		{
			MTL_setFlagObj( vibraBtnId[i], MS_UNSELECT ) ;
			MTL_resetFlagObj( vibraBtnId[vibraMode],
								 (~(MS_UNSELECT | MS_TOGGLE)) ) ;
			MMI_SendMessage( vibraBtnId[vibraMode], MM_SHOW, 0 ) ;
			vibraMode = i ;
		}
	}
	return NOERR ;
}

/*	initDataIOTVIB:vibraMainMixVolumeId:MJ_SCRLL40の呼び出し関数	*/
/*	initDataIOTVIB:vibraMainMixNumId:MJ_NUMBOXL40の呼び出し関数	*/
int	vibraMainMixSet(kobj, messId, argc, pev, trigger)
int		kobj ;
int		messId ;
int		argc ;
EVENT	*pev ;
int		trigger ;
{
	int	var, min, max, len, page ;			/* スクロールの変数 */
	int	var2, min2, max2, delta2, ptColumn2 ;	/* 数値設定の変数 */

	if( kobj == vibraMainMixVolumeId )
	{
		MMI_SendMessage( kobj, MM_GETSCROLL, 5,
										&var, &min, &max, &len, &page ) ;
		MMI_SendMessage( vibraMainMixNumId, MM_GETNUMBOX, 5,
							&var2, &min2, &max2, &delta2, &ptColumn2 ) ;
		MMI_SendMessage( vibraMainMixNumId, MM_SETNUMBOX, 5,
							var, min2, max2, delta2, ptColumn2 ) ;
		MMI_SendMessage( vibraMainMixNumId, MM_SHOW, 0 ) ;
	}

	if( kobj == vibraMainMixNumId )
	{
		MMI_SendMessage( kobj, MM_GETNUMBOX, 5,
							&var2, &min2, &max2, &delta2, &ptColumn2 ) ;
		MMI_SendMessage( vibraMainMixVolumeId, MM_GETSCROLL, 5,
										&var, &min, &max, &len, &page ) ;
		MMI_SendMessage( vibraMainMixVolumeId, MM_SETSCROLL, 5,
										var2, min, max, len, page ) ;
		MMI_SendMessage( vibraMainMixVolumeId, MM_SHOW, 0 ) ;
	}

	return NOERR ;
}

/*	initDataIOTVIB:vibraDelayMixVolumeId:MJ_SCRLL40の呼び出し関数	*/
/*	initDataIOTVIB:vibraDelayMixNumId:MJ_NUMBOXL40の呼び出し関数	*/
int	vibraDelayMixSet(kobj, messId, argc, pev, trigger)
int		kobj ;
int		messId ;
int		argc ;
EVENT	*pev ;
int		trigger ;
{
	int	var, min, max, len, page ;			/* スクロールの変数 */
	int	var2, min2, max2, delta2, ptColumn2 ;	/* 数値設定の変数 */

	if( kobj == vibraDelayMixVolumeId )
	{
		MMI_SendMessage( kobj, MM_GETSCROLL, 5,
										&var, &min, &max, &len, &page ) ;
		MMI_SendMessage( vibraDelayMixNumId, MM_GETNUMBOX, 5,
							&var2, &min2, &max2, &delta2, &ptColumn2 ) ;
		MMI_SendMessage( vibraDelayMixNumId, MM_SETNUMBOX, 5,
							var, min2, max2, delta2, ptColumn2 ) ;
		MMI_SendMessage( vibraDelayMixNumId, MM_SHOW, 0 ) ;
	}

	if( kobj == vibraDelayMixNumId )
	{
		MMI_SendMessage( kobj, MM_GETNUMBOX, 5,
							&var2, &min2, &max2, &delta2, &ptColumn2 ) ;
		MMI_SendMessage( vibraDelayMixVolumeId, MM_GETSCROLL, 5,
										&var, &min, &max, &len, &page ) ;
		MMI_SendMessage( vibraDelayMixVolumeId, MM_SETSCROLL, 5,
										var2, min, max, len, page ) ;
		MMI_SendMessage( vibraDelayMixVolumeId, MM_SHOW, 0 ) ;
	}

	return NOERR ;
}


/* TREMOLO */

static tremoMode = 0 ;

int	sndEffectTremolo()
{
	MMI_SendMessage( tremoDialogId, MM_ATTACH, 1, MMI_GetBaseObj() ) ;

	MTL_setFlagObj( tremoBtnId[tremoMode], (MS_UNSELECT | MS_TOGGLE) ) ;

	MMI_SendMessage( tremoDialogId, MM_SHOW, 0 ) ;	/* 全体を見せる */

	MMI_ExecSystem() ;		/* Dialog表示へ･･･イベントループ */

	MMI_SendMessage( tremoDialogId, MM_ERASE, 0 ) ;
	MMI_SendMessage( tremoDialogId, MM_DETACH, 0 ) ;

	return NOERR ;
}

/*	initDataIOTTRE:tremoOkBtnId:MJ_DBUTTONL40の呼び出し関数	*/
int	tremoOkchk(kobj, messId, argc, pev, trigger)
int		kobj ;
int		messId ;
int		argc ;
EVENT	*pev ;
int		trigger ;
{
	int	var, min, max, delta, ptColumn ;
	int f, bit, kd, sz ;
	int mixM, mixT, speed ;
	int ret ;

	SetMouse16( 81, 0xf, 0x8 ) ;	/* マウスカーソルをウエイト表示 */
	setMsgColor( tremoMesId[0], EXE_COLOR ) ;

	if( tempFileCount == 0 )	/* テンポラリファイルの数が0なら */
	{
		ret = NO_DATA ;
		goto END_00 ;
	}
	else if( tempFileCount == 1 )	/* テンポラリファイルの数が1なら */
	{
		if( (ret = temp1_to_temp2()) != NOERR )		/* temp1をtemp2へ */
			goto END_00 ;
	}

	if( (ret = readWavDataInfo( &f, &bit, &kd, &sz )) != NOERR )
		goto END_00 ;

	MMI_SendMessage( tremoMainMixNumId, MM_GETNUMBOX, 5,	/* main mix */
						&var, &min, &max, &delta, &ptColumn ) ;
	mixM = var * 256 / 100 ;

	MMI_SendMessage( tremoTremoMixNumId, MM_GETNUMBOX, 5,	/* tremo mix */
						&var, &min, &max, &delta, &ptColumn ) ;
	mixT = var * 256 / 100 ;

	MMI_SendMessage( tremoSpeedNumId, MM_GETNUMBOX, 5,		/* speed */
						&var, &min, &max, &delta, &ptColumn ) ;
	speed = (double)var / 10 * 65536 * 4 / f ;

	ret = sndTremo( mixM, mixT, speed, tremoMode ) ;

END_00: ;
	setMsgColor( tremoMesId[0], MOJI_COLOR ) ;
	SetMouse16( 80, 0xf, 0x8 ) ;	/* マウスカーソルを元に */

	if( ret )
		errorCheck( ret ) ;

	MMI_FlushEvnt() ;	/* イベントをフラッシュ */

	return NOERR ;
}

/*	initDataIOTTRE:tremoPlayBtnId:MJ_DBUTTONL40の呼び出し関数	*/
int	tremoPlay(kobj, messId, argc, pev, trigger)
int		kobj ;
int		messId ;
int		argc ;
EVENT	*pev ;
int		trigger ;
{
	setMsgColor( tremoMesId[1], EXE_COLOR ) ;

	sndPlay() ;

	setMsgColor( tremoMesId[1], MOJI_COLOR ) ;

	return NOERR ;
}

/*	initDataIOTTRE:tremoUndoBtnId:MJ_DBUTTONL40の呼び出し関数	*/
int	tremoUndo(kobj, messId, argc, pev, trigger)
int		kobj ;
int		messId ;
int		argc ;
EVENT	*pev ;
int		trigger ;
{
	setMsgColor( tremoMesId[2], EXE_COLOR ) ;

	unDo() ;

	setMsgColor( tremoMesId[2], MOJI_COLOR ) ;

	MMI_FlushEvnt() ;	/* イベントをフラッシュ */

	return NOERR ;
}

/*	initDataIOTTRE:tremoFixBtnId:MJ_DBUTTONL40の呼び出し関数	*/
int	tremoFix(kobj, messId, argc, pev, trigger)
int		kobj ;
int		messId ;
int		argc ;
EVENT	*pev ;
int		trigger ;
{
	delTemp2() ;
	return NOERR ;
}

/*	initDataIOTTRE:tremoInfBtnId:MJ_DBUTTONL40の呼び出し関数	*/
int	tremoInf(kobj, messId, argc, pev, trigger)
int		kobj ;
int		messId ;
int		argc ;
EVENT	*pev ;
int		trigger ;
{
	/* ダイアログを使えないようにする */
	MTL_setAtrObj( tremoDialogId, MS_DSPONLYL40 ) ;

	sndInf() ;

	/* ダイアログを使えるように戻す */
	MTL_resetAtrObj( tremoDialogId, (~MS_DSPONLYL40) ) ;

	return NOERR ;
}

/*	initDataIOTTRE:tremoCanBtnId:MJ_DBUTTONL40の呼び出し関数	*/
int	tremoCanchk(kobj, messId, argc, pev, trigger)
int		kobj ;
int		messId ;
int		argc ;
EVENT	*pev ;
int		trigger ;
{
	MMI_SetHaltFlag( TRUE ) ;
	return NOERR ;
}

/*	initDataIOTTRE:tremoBtnId[0]:MJ_TICONL40の呼び出し関数	*/
/*	initDataIOTTRE:tremoBtnId[1]:MJ_TICONL40の呼び出し関数	*/
/*	initDataIOTTRE:tremoBtnId[2]:MJ_TICONL40の呼び出し関数	*/
int	tremoModeSet(kobj, messId, argc, pev, trigger)
int		kobj ;
int		messId ;
int		argc ;
EVENT	*pev ;
int		trigger ;
{
	int i ;

	for( i=0 ; i<3 ; i++ )
	{
		if( kobj == tremoBtnId[i] )
		{
			MTL_setFlagObj( tremoBtnId[i], MS_UNSELECT ) ;
			MTL_resetFlagObj( tremoBtnId[tremoMode],
								 (~(MS_UNSELECT | MS_TOGGLE)) ) ;
			MMI_SendMessage( tremoBtnId[tremoMode], MM_SHOW, 0 ) ;
			tremoMode = i ;
		}
	}
	return NOERR ;
}

/*	initDataIOTTRE:tremoMainMixVolumeId:MJ_SCRLL40の呼び出し関数	*/
/*	initDataIOTTRE:tremoMainMixNumId:MJ_NUMBOXL40の呼び出し関数	*/
int	tremoMainMixSet(kobj, messId, argc, pev, trigger)
int		kobj ;
int		messId ;
int		argc ;
EVENT	*pev ;
int		trigger ;
{
	int	var, min, max, len, page ;			/* スクロールの変数 */
	int	var2, min2, max2, delta2, ptColumn2 ;	/* 数値設定の変数 */

	if( kobj == tremoMainMixVolumeId )
	{
		MMI_SendMessage( kobj, MM_GETSCROLL, 5,
										&var, &min, &max, &len, &page ) ;
		MMI_SendMessage( tremoMainMixNumId, MM_GETNUMBOX, 5,
							&var2, &min2, &max2, &delta2, &ptColumn2 ) ;
		MMI_SendMessage( tremoMainMixNumId, MM_SETNUMBOX, 5,
							var, min2, max2, delta2, ptColumn2 ) ;
		MMI_SendMessage( tremoMainMixNumId, MM_SHOW, 0 ) ;
	}

	if( kobj == tremoMainMixNumId )
	{
		MMI_SendMessage( kobj, MM_GETNUMBOX, 5,
							&var2, &min2, &max2, &delta2, &ptColumn2 ) ;
		MMI_SendMessage( tremoMainMixVolumeId, MM_GETSCROLL, 5,
										&var, &min, &max, &len, &page ) ;
		MMI_SendMessage( tremoMainMixVolumeId, MM_SETSCROLL, 5,
										var2, min, max, len, page ) ;
		MMI_SendMessage( tremoMainMixVolumeId, MM_SHOW, 0 ) ;
	}

	return NOERR ;
}

/*	initDataIOTTRE:tremoTremoMixVolumeId:MJ_SCRLL40の呼び出し関数	*/
/*	initDataIOTTRE:tremoTremoMixNumId:MJ_NUMBOXL40の呼び出し関数	*/
int	tremoTremoMixSet(kobj, messId, argc, pev, trigger)
int		kobj ;
int		messId ;
int		argc ;
EVENT	*pev ;
int		trigger ;
{
	int	var, min, max, len, page ;			/* スクロールの変数 */
	int	var2, min2, max2, delta2, ptColumn2 ;	/* 数値設定の変数 */

	if( kobj == tremoTremoMixVolumeId )
	{
		MMI_SendMessage( kobj, MM_GETSCROLL, 5,
										&var, &min, &max, &len, &page ) ;
		MMI_SendMessage( tremoTremoMixNumId, MM_GETNUMBOX, 5,
							&var2, &min2, &max2, &delta2, &ptColumn2 ) ;
		MMI_SendMessage( tremoTremoMixNumId, MM_SETNUMBOX, 5,
							var, min2, max2, delta2, ptColumn2 ) ;
		MMI_SendMessage( tremoTremoMixNumId, MM_SHOW, 0 ) ;
	}

	if( kobj == tremoTremoMixNumId )
	{
		MMI_SendMessage( kobj, MM_GETNUMBOX, 5,
							&var2, &min2, &max2, &delta2, &ptColumn2 ) ;
		MMI_SendMessage( tremoTremoMixVolumeId, MM_GETSCROLL, 5,
										&var, &min, &max, &len, &page ) ;
		MMI_SendMessage( tremoTremoMixVolumeId, MM_SETSCROLL, 5,
										var2, min, max, len, page ) ;
		MMI_SendMessage( tremoTremoMixVolumeId, MM_SHOW, 0 ) ;
	}

	return NOERR ;
}

/*	initDataIOTTRE:tremoSpeedNumId:MJ_NUMBOXL40の呼び出し関数	*/
/*	initDataIOTTRE:tremoSpeedVolumeId:MJ_SCRLL40の呼び出し関数	*/
int	tremoSpeedSet(kobj, messId, argc, pev, trigger)
int		kobj ;
int		messId ;
int		argc ;
EVENT	*pev ;
int		trigger ;
{
	/* ボリュームは1/2 */

	int	var, min, max, len, page ;			/* スクロールの変数 */
	int	var2, min2, max2, delta2, ptColumn2 ;	/* 数値設定の変数 */

	if( kobj == tremoSpeedVolumeId )
	{
		MMI_SendMessage( kobj, MM_GETSCROLL, 5,
										&var, &min, &max, &len, &page ) ;
		MMI_SendMessage( tremoSpeedNumId, MM_GETNUMBOX, 5,
							&var2, &min2, &max2, &delta2, &ptColumn2 ) ;
		MMI_SendMessage( tremoSpeedNumId, MM_SETNUMBOX, 5,
							var*2, min2, max2, delta2, ptColumn2 ) ;
		MMI_SendMessage( tremoSpeedNumId, MM_SHOW, 0 ) ;
	}

	if( kobj == tremoSpeedNumId )
	{
		MMI_SendMessage( kobj, MM_GETNUMBOX, 5,
							&var2, &min2, &max2, &delta2, &ptColumn2 ) ;
		MMI_SendMessage( tremoSpeedVolumeId, MM_GETSCROLL, 5,
										&var, &min, &max, &len, &page ) ;
		MMI_SendMessage( tremoSpeedVolumeId, MM_SETSCROLL, 5,
										var2/2, min, max, len, page ) ;
		MMI_SendMessage( tremoSpeedVolumeId, MM_SHOW, 0 ) ;
	}

	return NOERR ;
}


/* これ以後は, このソースのＣによる音声処理ルーチン */

/***** エコールーチン *****/
/* 遅れ, ﾒｲﾝmixrate, 初期減衰率, 減衰率, 減衰処理count, 余韻バイト数, */
/* mode 0左右, 1反転, 2左, 3右 */
/* rateや率は0〜256 */
sndEcho( delay, mrate, fdec, dec, count, after, mode )
int delay ;
int mrate ;
int fdec ;
int dec ;
int count ;
int after ;
int mode ;
{
	int ret ;
	int fq, bit, kd, sz ;
	int i, j ;
	int len0, len1 ;
	int del1, d1, x1, del2, d2, x2 ;
	int decr[40] ;

	if( (ret = readWavData_init( &fq, &bit, &kd, &sz )) != NOERR )
	{
		return ret ;
	}
	if( kd == 1 )			// モノラルの時は左だけ実行
		mode = 2 ;

	len0 = sz / ( kd * bit/8 ) ;
	len1 = len0 + after ;	/* after = 余韻 */
	if( (ret = writeWavData_init( fq, bit, kd, (len1*kd*bit/8) )) != NOERR )
	{
		readWavData_end() ;
		return ret ;
	}
	if( count > 32 )
		count = 32 ;
	decr[1] = fdec ;
	for( i=2 ; i<=count ; i++ )
	{
		decr[i] = ( decr[i-1] * dec ) >> 8 ;
	}

	for( i=0 ; i<len1 ; i++ )
	{
		del1 = 0 ;
		del2 = 0 ;
		for( j=1 ; j<=count ; j++ )
		{
			if( (i-delay*j >= 0) && (i-delay*j < len0) )
			{
				if( (ret = readWavData( i-delay*j, &d1, &d2 )) != NOERR )
				{
					writeWavData_end() ;
					return ret ;
				}
				d1 = d1 * decr[j] ;
				d2 = d2 * decr[j] ;
				del1 += d1 ;
				del2 += d2 ;
			}
		}

		x1 = 0 ;
		x2 = 0 ;
		if( i < len0 )
		{
			if( (ret = readWavData( i, &x1, &x2 )) != NOERR )
			{
				writeWavData_end() ;
				return ret ;
			}
		}

		switch( mode )
		{
		case 0: x1 = x1 * mrate ;
				x2 = x2 * mrate ;
				x1 = ( x1 + del1 ) >> 8 ;
				x2 = ( x2 + del2 ) >> 8 ;
				break ;
		case 1:	x1 = x1 * mrate ;
				x2 = x2 * mrate ;
				x1 = ( x1 + del2 ) >> 8 ;
				x2 = ( x2 + del1 ) >> 8 ;
				break ;
		case 2:	x1 = x1 * mrate ;
				x1 = ( x1 + del1 ) >> 8 ;
				break ;
		case 3:	x2 = x2 * mrate ;
				x2 = ( x2 + del2 ) >> 8 ;
				break ;
		}

		if( (ret = writeWavData( x1, x2 )) != NOERR )
		{
			readWavData_end() ;
			return ret ;
		}
	}
	writeWavData_end() ;
	readWavData_end() ;

	return NOERR ;
}

int sndPhase( int delay, int mixM, int mixD, int modu1, int speed1, int start1,
							int modu2, int speed2, int start2, int mode )
{
	int ret ;
	int fq, bit, kd, sz ;
	int i ;
	int len, dp ;
	int x1, x2, d1, d2 ;

	if( (ret = readWavData_init( &fq, &bit, &kd, &sz )) != NOERR )
	{
		return ret ;
	}
	if( kd == 1 )			// モノラルの時は左だけ実行
		mode = 1 ;

	len = sz / ( kd * bit/8 ) ;
	if( (ret = writeWavData_init( fq, bit, kd, sz )) != NOERR )
	{
		readWavData_end() ;
		return ret ;
	}

	for( i=0 ; i<len ; i++ )
	{
		dp = i + delay
			 + modu1 * hiSpeedSin( start1 ) / 0x10000
			 + modu2 * hiSpeedSin( start2 ) / 0x10000 ;

		start1 += speed1 ;
		start2 += speed2 ;
	
		if( dp < 0 )dp = 0 ;
		if( dp >= len )dp = len - 1 ;

		if( (ret = readWavData( i, &x1, &x2 )) != NOERR )
		{
			writeWavData_end() ;
			return ret ;
		}

		if( (ret = readWavData( dp, &d1, &d2 )) != NOERR )
		{
			writeWavData_end() ;
			return ret ;
		}

		switch( mode )
		{
		case 0: x1 = x1 * mixM ;
				x2 = x2 * mixM ;
				d1 = d1 * mixD ;
				d2 = d2 * mixD ;
				x1 = ( x1 + d1 ) >> 8 ;
				x2 = ( x2 + d2 ) >> 8 ;
				break ;
		case 1: x1 = x1 * mixM ;
				d1 = d1 * mixD ;
				x1 = ( x1 + d1 ) >> 8 ;
				break ;
		case 2: x2 = x2 * mixM ;
				d2 = d2 * mixD ;
				x2 = ( x2 + d2 ) >> 8 ;
				break ;
		}

		if( (ret = writeWavData( x1, x2 )) != NOERR )
		{
			readWavData_end() ;
			return ret ;
		}
	}
	writeWavData_end() ;
	readWavData_end() ;

	return NOERR ;
}

int sndTremo( int mixM, int mixT, int speed, int mode )
{
	int ret ;
	int fq, bit, kd, sz ;
	int i, j ;
	int len, dp ;
	int x1, x2 ;

	if( (ret = readWavData_init( &fq, &bit, &kd, &sz )) != NOERR )
	{
		return ret ;
	}
	if( kd == 1 )			// モノラルの時は左だけ実行
		mode = 1 ;

	len = sz / ( kd * bit/8 ) ;
	if( (ret = writeWavData_init( fq, bit, kd, sz )) != NOERR )
	{
		readWavData_end() ;
		return ret ;
	}

	j = 0 ;

	for( i=0 ; i<len ; i++ )
	{
		dp = mixT * hiSpeedSin( j ) / 0x10000 + mixT + mixM * 2 ;
		j += speed ;

		if( (ret = readWavData( i, &x1, &x2 )) != NOERR )
		{
			writeWavData_end() ;
			return ret ;
		}

		switch( mode )
		{
		case 0: x1 = x1 * dp ;
				x2 = x2 * dp ;
				x1 = x1 >> 9 ;
				x2 = x2 >> 9 ;
				break ;
		case 1: x1 = x1 * dp ;
				x1 = x1 >> 9 ;
				break ;
		case 2: x2 = x2 * dp ;
				x2 = x2 >> 9 ;
				break ;
		}

		if( (ret = writeWavData( x1, x2 )) != NOERR )
		{
			readWavData_end() ;
			return ret ;
		}
	}
	writeWavData_end() ;
	readWavData_end() ;

	return NOERR ;
}

