⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 masnddva.c

📁 是一个手机功能的模拟程序
💻 C
📖 第 1 页 / 共 3 页
字号:
 *			MASMW_SUCCESS	if Success.
 *			MASMW_ERROR		if Error.
 ****************************************************************************/
SINT32 MaDva_End(void)
{
	return (MASMW_SUCCESS);
}


/****************************************************************************
 *	MaDva_GetAlt3Slot
 *
 *	Description:
 *			Get Alternate Info form NoteOn List.
 *	Argument:
 *			dKey		NoteOn Key# (0..127)
 *	Return:
 *			0 or Positive	if Success.	(Key << 4) + Ch)
 *											Key = 0..127
 *											Ch  = 0..15
 *			MASMW_ERROR		if Error.
 ****************************************************************************/
SINT32 MaDva_GetAlt3Slot(UINT32 dKey)
{
	SINT32	sdId;
	
	sdId = gpDvaInfo->sdAlt3Map[gbIsAltDrum[dKey & 0x7f]];
	
	return (sdId);
}


/****************************************************************************
 *	MaDva_GetFmSlot
 *
 *	Description:
 *			Get new FM slot.
 *	Argument:
 *			dCh			NoteOn Ch#	(0..15)
 *			dKey		NoteOn Key#	(0..127)
 *			dMode		NoteOn Mode	(0:Mono, 1:Poly, 2:Drum)
 *	Return:
 *			0 or Positive	if Success.
 *
 *			 31           14 13.......8 7....6 5......0
 *			+---------------+----------+------+--------+
 *          |       0       | OffSlot  | Mode | OnSlot |
 *			+---------------+----------+------+--------+
 *							OffSlot : WT SLOT#, should be MUTE (0..31)
 *							Mode    : 0: New, 1: Continue, 2:Mute&New
 *							OnSlot  : FM SLOT# (0..31)
 *
 *			MASMW_ERROR		if Error.
 ****************************************************************************/
SINT32 MaDva_GetFmSlot(UINT32 dCh, UINT32 dKey, UINT32 dMode)
{
	UINT32		dOnId;
	SINT32		sdId;
	PCHMAP		pCh;
	PSLOTINFO	pSlot;

	sdId = 0;
	pCh = &(gpDvaInfo->ChMap[dCh]);
	
	switch (dMode)
	{
	case 2:		/* DVA_DRUM_CH */
		if (gbIsAltDrum[dKey] > 0)
		{
			if (gpDvaInfo->DrumAlt == DVA_MA5_ALT)
			{
				gpDvaInfo->sdAlt5Map[(gbIsAltDrum[dKey] << 4) + dCh] = (SINT32)((dKey << 4) + dCh);
				dKey = gdAltDrumKey[dKey];
			}
			else
			{
				gpDvaInfo->sdAlt3Map[gbIsAltDrum[dKey]] = (SINT32)((dKey << 4) + dCh);
			}
		}
		/* fall through */

	case 1:		/* DVA_POLY_CH */
		dOnId = (dKey << 4) + dCh;
		if (pCh->Mode == DVA_MONO_CH)
		{
			if (pCh->sdMonoOn > 0)
			{
				pCh->sdMonoOn = 0;
				if (pCh->MonoSynth == DVA_FM_SYNTH)
				{	/* ERROR: Playing MONO.. */
					pCh->Mode = (DVACHMODE)dMode;
					pSlot = &(gpDvaInfo->FmSlotInfo[pCh->dMonoSlot]);
					pSlot->Mode = DVA_POLY_SLOT;
					pSlot->dKeyCh = dOnId;
					sdId = (SINT32)pSlot->dSlotId;
					FmTurnOn(pSlot);
					gpDvaInfo->bPolyOnMap[dOnId] = (UINT8)(pSlot->dIndex + DVA_PMAP_FM_ON);
					return (sdId);
				}
				else
				{	/* ERROR: Playing WT.. */
					pSlot = &(gpDvaInfo->WtSlotInfo[pCh->dMonoSlot]);
					sdId = (SINT32)((pSlot->dSlotId << 8) + 0x80);
					WtTurnOff(pSlot);
				}
			}
		}

		pCh->Mode = (DVACHMODE)dMode;
		switch (gpDvaInfo->bPolyOnMap[dOnId] & 0xC0)
		{
		case DVA_PMAP_FM_ON:	/* FM-On */
			pSlot = &(gpDvaInfo->FmSlotInfo[gpDvaInfo->bPolyOnMap[dOnId] & DVA_PMAP_NUM]);
			sdId = (SINT32)pSlot->dSlotId;
			FmTurnOn(pSlot);
			return (sdId);

		case DVA_PMAP_WT_ON:	/* Wt-On */
			pSlot= &(gpDvaInfo->WtSlotInfo[gpDvaInfo->bPolyOnMap[dOnId] & DVA_PMAP_NUM]);
			sdId = (pSlot->dSlotId << 8) + 0x80;
			WtTurnOff(pSlot);
			/* fall through */
		
		default:	/* Off */
			pSlot = gpDvaInfo->pFmSlotTop->pNext;
			if (pSlot == gpDvaInfo->pFmSlotOnTop) pSlot = pSlot->pNext;
			sdId += pSlot->dSlotId;
			if (pSlot->NoteOn == DVA_NOTE_ON)
			{
				if (pSlot->Mode == DVA_POLY_SLOT)
				{
					gpDvaInfo->bPolyOnMap[pSlot->dKeyCh] &= ~DVA_PMAP_ON;
				}
				else
				{
					gpDvaInfo->ChMap[pSlot->dKeyCh & 0x0F].sdMonoOn = 0;
				}
			}
			FmTurnOn(pSlot);
			gpDvaInfo->bPolyOnMap[dOnId] = (UINT8)(pSlot->dIndex + DVA_PMAP_FM_ON);
			pSlot->dKeyCh = dOnId;
			pSlot->Mode = DVA_POLY_SLOT;
			return (sdId);
		}
		break;

	default:	/* DVA_MONO_CH */
		if (pCh->Mode == DVA_MONO_CH)
		{
			if (pCh->sdMonoOn > 0)
			{
				if (pCh->MonoSynth == DVA_FM_SYNTH)
				{
					pSlot = &(gpDvaInfo->FmSlotInfo[pCh->dMonoSlot]);
					sdId = pSlot->dSlotId + 0x40;
					pCh->sdMonoOn++;
					FmTurnOn(pSlot);
					return (sdId);
				}
				else
				{	/* ERROR: WT mono */
					pSlot = &(gpDvaInfo->WtSlotInfo[pCh->dMonoSlot]);
					sdId = (SINT32)((pSlot->dSlotId << 8) + 0x80);
					WtTurnOff(pSlot);
				}
			}
		}
		
		dOnId = (dKey << 4) + dCh;
		gpDvaInfo->bPolyOnMap[dOnId] = 0;
		
		pSlot = gpDvaInfo->pFmSlotTop->pNext;
		if (pSlot == gpDvaInfo->pFmSlotOnTop) pSlot = pSlot->pNext;
		sdId += pSlot->dSlotId;

		if (pSlot->NoteOn == DVA_NOTE_ON)
		{
			if (pSlot->Mode == DVA_POLY_SLOT)
			{
				gpDvaInfo->bPolyOnMap[pSlot->dKeyCh] &= ~DVA_PMAP_ON;
			}
			else
			{
				gpDvaInfo->ChMap[pSlot->dKeyCh & 0x0F].sdMonoOn = 0;
			}
		}

		pCh->Mode = DVA_MONO_CH;
		pCh->MonoSynth = DVA_FM_SYNTH;
		pCh->sdMonoOn = 1;

		FmTurnOn(pSlot);
		pSlot->dKeyCh = dOnId;
		pSlot->Mode = DVA_MONO_SLOT;
		pCh->dMonoSlot = pSlot->dIndex;
		return (sdId);
	}
	return (MASMW_ERROR);
}


/****************************************************************************
 *	MaDva_GetWtSlot
 *
 *	Description:
 *			Get new WT slot.
 *	Argument:
 *			dCh			NoteOn Ch#	(0..15)
 *			dKey		NoteOn Key#	(0..127)
 *			dMode		NoteOn Mode	(0:Mono, 1:Poly, 2:Drum)
 *	Return:
 *			0 or Positive	if Success.
 *
 *			 31           14 13.......8 7....6 5......0
 *			+---------------+----------+------+--------+
 *          |       0       | OffSlot  | Mode | OnSlot |
 *			+---------------+----------+------+--------+
 *							OffSlot : FM SLOT#, should be MUTE (0..31)
 *							Mode    : 0: New, 1: Continue, 2:Mute&New
 *							OnSlot  : WT SLOT# (0..31)
 *
 *			MASMW_ERROR		if Error.
 ****************************************************************************/
SINT32 MaDva_GetWtSlot(UINT32 dCh, UINT32 dKey, UINT32 dMode)
{
	UINT32		dOnId;
	SINT32		sdId;
	PCHMAP		pCh;
	PSLOTINFO	pSlot;
	
	sdId = 0;
	pCh = &(gpDvaInfo->ChMap[dCh]);
	
	switch (dMode)
	{
	case 2:		/* DVA_DRUM_CH */
		if (gbIsAltDrum[dKey] > 0)
		{
			if (gpDvaInfo->DrumAlt == DVA_MA5_ALT)
			{
				gpDvaInfo->sdAlt5Map[(gbIsAltDrum[dKey] << 4) + dCh] = (SINT32)((dKey << 4) + dCh);
				dKey = gdAltDrumKey[dKey];
			}
			else
			{
				gpDvaInfo->sdAlt3Map[gbIsAltDrum[dKey]] = (SINT32)((dKey << 4) + dCh);
			}
		}
		/* fall through */

	case 1:		/* DVA_POLY_CH */
		dOnId = (dKey << 4) + dCh;
		if (pCh->Mode == DVA_MONO_CH)
		{
			if (pCh->sdMonoOn > 0)
			{
				pCh->sdMonoOn = 0;
				if (pCh->MonoSynth == DVA_WT_SYNTH)
				{	/* ERROR: Playing MONO.. */
					pCh->Mode = (DVACHMODE)dMode;
					pSlot = &(gpDvaInfo->WtSlotInfo[pCh->dMonoSlot]);
					pSlot->Mode = DVA_POLY_SLOT;
					pSlot->dKeyCh = dOnId;
					sdId = (SINT32)pSlot->dSlotId;
					WtTurnOn(pSlot);
					gpDvaInfo->bPolyOnMap[dOnId] = (UINT8)(pSlot->dIndex + DVA_PMAP_WT_ON);
					return (sdId);
				}
				else
				{	/* ERROR: Playing FM.. */
					pSlot = &(gpDvaInfo->FmSlotInfo[pCh->dMonoSlot]);
					sdId = (SINT32)((pSlot->dSlotId << 8) + 0x80);
					FmTurnOff(pSlot);
				}
			}
		}

		pCh->Mode = (DVACHMODE)dMode;
		switch (gpDvaInfo->bPolyOnMap[dOnId] & 0xC0)
		{
		case DVA_PMAP_WT_ON:	/* WT-On */
			pSlot = &(gpDvaInfo->WtSlotInfo[gpDvaInfo->bPolyOnMap[dOnId] & DVA_PMAP_NUM]);
			sdId = (SINT32)pSlot->dSlotId;
			WtTurnOn(pSlot);
			return (sdId);

		case DVA_PMAP_FM_ON:	/* FM-On */
			pSlot= &(gpDvaInfo->FmSlotInfo[gpDvaInfo->bPolyOnMap[dOnId] & DVA_PMAP_NUM]);
			sdId = (pSlot->dSlotId << 8) + 0x80;
			FmTurnOff(pSlot);
			/* fall through */
		
		default:	/* Off */
			pSlot = gpDvaInfo->pWtSlotTop->pNext;
			if (pSlot == gpDvaInfo->pWtSlotOnTop) pSlot = pSlot->pNext;
			sdId += pSlot->dSlotId;
			if (pSlot->NoteOn == DVA_NOTE_ON)
			{
				if (pSlot->Mode == DVA_POLY_SLOT)
				{
					gpDvaInfo->bPolyOnMap[pSlot->dKeyCh] &= ~DVA_PMAP_ON;
				}
				else
				{
					gpDvaInfo->ChMap[pSlot->dKeyCh & 0x0F].sdMonoOn = 0;
				}
			}
			gpDvaInfo->bPolyOnMap[dOnId] = (UINT8)(pSlot->dIndex + DVA_PMAP_WT_ON);
			WtTurnOn(pSlot);
			pSlot->dKeyCh = dOnId;
			pSlot->Mode = DVA_POLY_SLOT;
			return (sdId);
		}

	default:	/* DVA_MONO_CH */
		if (pCh->Mode == DVA_MONO_CH)
		{
			if (pCh->sdMonoOn > 0)
			{
				if (pCh->MonoSynth == DVA_WT_SYNTH)
				{
					pSlot = &(gpDvaInfo->WtSlotInfo[pCh->dMonoSlot]);
					sdId = pSlot->dSlotId + 0x40;
					pCh->sdMonoOn++;
					FmTurnOn(pSlot);
					return (sdId);
				}
				else
				{	/* ERROR: FM mono */
					pSlot = &(gpDvaInfo->FmSlotInfo[pCh->dMonoSlot]);
					sdId = (SINT32)((pSlot->dSlotId << 8) + 0x80);
					FmTurnOff(pSlot);
				}
			}
		}
		
		dOnId = (dKey << 4) + dCh;
		gpDvaInfo->bPolyOnMap[dOnId] = 0;
		
		pSlot = gpDvaInfo->pWtSlotTop->pNext;
		if (pSlot == gpDvaInfo->pWtSlotOnTop) pSlot = pSlot->pNext;
		sdId += pSlot->dSlotId;
		if (pSlot->NoteOn == DVA_NOTE_ON)
		{
			if (pSlot->Mode == DVA_POLY_SLOT)
			{
				gpDvaInfo->bPolyOnMap[pSlot->dKeyCh] &= ~DVA_PMAP_ON;
			}
			else
			{
				gpDvaInfo->ChMap[pSlot->dKeyCh & 0x0F].sdMonoOn = 0;
			}
		}

		pCh->Mode = DVA_MONO_CH;
		pCh->MonoSynth = DVA_WT_SYNTH;
		pCh->sdMonoOn = 1;

		pSlot->dKeyCh = dOnId;
		WtTurnOn(pSlot);
		pSlot->Mode = DVA_MONO_SLOT;
		pCh->dMonoSlot = pSlot->dIndex;
		return (sdId);
	}
	return (MASMW_ERROR);
}


/****************************************************************************
 *	MaDva_GetStreamSlot
 *
 *	Description:
 *			Get new STREAM slot.
 *	Argument:
 *			dCh			NoteOn Ch#	(0..15)
 *			dKey		NoteOn Key#	(0..31)
 *			dMode		NoteOn Mode	(0:MONO, 1:STEREO)
 *	Return:
 *			0 or 1			STREAM SLOT# (0..1)
 *			MASMW_ERROR		if Error.
 ****************************************************************************/
SINT32 MaDva_GetStreamSlot(UINT32 dCh, UINT32 dKey, UINT32 dMode)
{
	UINT32		dOnId;
	SINT32		sdId;
	PSTREAMINFO	pSlot;
	
	sdId = 0;
	dOnId = (dKey << 4) + dCh;
	
	switch (gpDvaInfo->dStreamNum)
	{
	case 2:
		if (dMode == 0)
		{	/* MONO */
			sdId = gpDvaInfo->dStreamNextID;
			pSlot = &(gpDvaInfo->StreamSlotInfo[sdId]);
			pSlot->dIndex = dOnId;
			pSlot->NoteOn = DVA_STREAM_ON;
			pSlot->Stereo = DVA_MONO_STREAM;
			gpDvaInfo->dStreamNextID = (1L - sdId);
			return (sdId);
		}
		else
		{	/* STEREO */
			sdId = 0;
			pSlot = &(gpDvaInfo->StreamSlotInfo[sdId]);
			pSlot->dIndex = dOnId;
			pSlot->NoteOn = DVA_STREAM_ON;
			pSlot->Stereo = DVA_STEREO_STREAM;
			gpDvaInfo->StreamSlotInfo[1].NoteOn = DVA_STREAM_OFF;
			gpDvaInfo->dStreamNextID = 0;
			return (sdId);
		}
		break;

	case 1:
		if (dMode == 0)
		{	/* MONO */
			sdId = 0;
			pSlot = &(gpDvaInfo->StreamSlotInfo[sdId]);
			pSlot->dIndex = dOnId;
			pSlot->NoteOn = DVA_STREAM_ON;
			pSlot->Stereo = DVA_MONO_STREAM;
			return (sdId);
		}
		else
		{	/*STEREO */
			sdId = 0;
			pSlot = &(gpDvaInfo->StreamSlotInfo[sdId]);
			pSlot->dIndex = dOnId;
			pSlot->NoteOn = DVA_STREAM_ON;
			pSlot->Stereo = DVA_STEREO_STREAM;
			return (sdId);
		}
		break;
	}
	return (MASMW_ERROR);
}


/****************************************************************************
 *	MaDva_ReleaseSlot
 *
 *	Description:
 *			Release slot.
 *	Argument:
 *			dCh			NoteOff Ch#	(0..15)
 *			dKey		NoteOff Key#	(0..127)
 *	Return:
 *			0 or Positive	SLOT MAP
 *
 *			 31....................6    5    4.......0
 *			+-----------------------+-------+---------+
 *          |           0           | Synth | OffSlot |
 *			+-----------------------+-------+---------+
 *							Synth    : 0: FM, 1: WT
 *							OnSlot  : SLOT# (0..31)
 *
 *			MASMW_ERROR		if Error.
 ****************************************************************************/
SINT32 MaDva_ReleaseSlot(UINT32 dCh, UINT32 dKey)
{

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -