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

📄 masnddva.c

📁 是一个手机功能的模拟程序
💻 C
📖 第 1 页 / 共 3 页
字号:
	UINT32		dOffId;
	SINT32		sdId;
	PCHMAP		pCh;
	PSLOTINFO	pSlot;
	UINT8*		pbIx;
	UINT32		dOrgId;

	sdId = 0;
	pCh = &(gpDvaInfo->ChMap[dCh]);
	
	switch (pCh->Mode)
	{
	case DVA_DRUM_CH:
		if (gpDvaInfo->DrumAlt == DVA_MA5_ALT)
		{
			dOrgId = (gbIsAltDrum[dKey] << 4) + dCh;
			if (dOrgId > 16)
			{
				if (gpDvaInfo->sdAlt5Map[dOrgId] != (SINT32)((dKey << 4) + dCh))
				{
					return (MASMW_ERROR);		/* Nothing to be OFF */
				}
			}
			dKey = gdAltDrumKey[dKey];
			dOffId = (dKey << 4) + dCh;
			pbIx = &(gpDvaInfo->bPolyOnMap[dOffId]);
			if ((*pbIx & DVA_PMAP_ONOFF) == DVA_PMAP_OFF)
			{
				return (MASMW_ERROR);
			}
			
			gpDvaInfo->sdAlt5Map[dOrgId] = -1;
		}
		else
		{
			dOffId = (dKey << 4) + dCh;
			pbIx = &(gpDvaInfo->bPolyOnMap[dOffId]);
			if ((*pbIx & DVA_PMAP_ONOFF) == DVA_PMAP_OFF)
			{
				return (MASMW_ERROR);
			}
			
			if (gbIsAltDrum[dKey] > 0) gpDvaInfo->sdAlt3Map[gbIsAltDrum[dKey]] = -1;
		}
		
		*pbIx &= ~DVA_PMAP_ON;
		if ((*pbIx & DVA_PMAP_SYNTH) == DVA_PMAP_FM)
		{
			pSlot = &(gpDvaInfo->FmSlotInfo[*pbIx & DVA_PMAP_NUM]);
			sdId = (SINT32)pSlot->dSlotId;
			FmTurnOff(pSlot);
			return (sdId);
		}
		else
		{
			pSlot = &(gpDvaInfo->WtSlotInfo[*pbIx & DVA_PMAP_NUM]);
			sdId = (SINT32)pSlot->dSlotId + 32;
			WtTurnOff(pSlot);
			return (sdId);
		}
		break;
	
	case DVA_POLY_CH:
		dOffId = (dKey << 4) + dCh;
		pbIx = &(gpDvaInfo->bPolyOnMap[dOffId]);
		if ((*pbIx & DVA_PMAP_ONOFF) == DVA_PMAP_OFF)
		{
			return (MASMW_ERROR);
		}
		*pbIx &= ~DVA_PMAP_ON;
		if ((*pbIx & DVA_PMAP_SYNTH) == DVA_PMAP_FM)
		{
			pSlot = &(gpDvaInfo->FmSlotInfo[*pbIx & DVA_PMAP_NUM]);
			sdId = (SINT32)pSlot->dSlotId;
			FmTurnOff(pSlot);
			return (sdId);
		}
		else
		{
			pSlot = &(gpDvaInfo->WtSlotInfo[*pbIx & DVA_PMAP_NUM]);
			sdId = (SINT32)pSlot->dSlotId + 32;
			WtTurnOff(pSlot);
			return (sdId);
		}
		break;

	default:	/* DVA_MONO_CH */
		if (pCh->sdMonoOn <= 0)
		{
			return (MASMW_ERROR);		/* Nothing to be OFF */
		}
		pCh->sdMonoOn--;
		if (pCh->sdMonoOn > 0) return (MASMW_ERROR);		/* Contine */
		if (pCh->MonoSynth == DVA_FM_SYNTH)
		{
			pSlot = &(gpDvaInfo->FmSlotInfo[pCh->dMonoSlot]);
			sdId = (SINT32)pSlot->dSlotId;
			FmTurnOff(pSlot);
			return (sdId);
		}
		else
		{
			pSlot = &(gpDvaInfo->WtSlotInfo[pCh->dMonoSlot]);
			sdId = (SINT32)pSlot->dSlotId + 32;
			WtTurnOff(pSlot);
			return (sdId);
		}
	}
	return (MASMW_ERROR);
}


/****************************************************************************
 *	MaDva_ReleaseFmOnSlot
 *
 *	Description:
 *			Release FM slot which is ON.
 *	Argument:
 *			dCh			NoteOff Ch#	(0..15)
 *	Return:
 *			FM-SLOT Off Map
 *
 *			    31    .................      1      0
 *			+-------+---------------------+------+------+
 *          | FM#31 |                     | FM#1 | FM#0 |
 *			+-------+---------------------+------+------+
 *							FM#n    : 0: none, 1: OFF
 *
 *			MASMW_ERROR		if Error.
 ****************************************************************************/
UINT32 MaDva_ReleaseFmOnSlot(UINT32 dCh)
{
	UINT32		dOffMap;
	PSLOTINFO	pSlot;
	PSLOTINFO	pNext;
	UINT32		dIndex;
	
	dOffMap = 0;
	pSlot = gpDvaInfo->pFmSlotOnTop->pNext;
	
	while (pSlot != gpDvaInfo->pFmSlotBottom)
	{
		pNext = pSlot->pNext;
		if ((pSlot->dKeyCh & 0x0F) == dCh)
		{
			switch (pSlot->Mode)
			{
			case DVA_POLY_SLOT:
				gpDvaInfo->bPolyOnMap[pSlot->dKeyCh] &= ~DVA_PMAP_ONOFF;
				if (gpDvaInfo->ChMap[pSlot->dKeyCh & 0x0F].Mode == DVA_DRUM_CH)
				{
					dIndex = gbIsAltDrum[(pSlot->dKeyCh >> 4) & 0x7F];
					gpDvaInfo->sdAlt3Map[dIndex] = -1;
					gpDvaInfo->sdAlt5Map[(dIndex << 4) + (pSlot->dKeyCh & 0x0F)] = -1;
				}
				FmTurnOff(pSlot);
				break;
				
			default: /* DVA_MONO_SLOT */
				gpDvaInfo->ChMap[pSlot->dKeyCh & 0x0F].sdMonoOn = 0;
				FmTurnOff(pSlot);
			}
			dOffMap |= (1L << pSlot->dSlotId);
		}
		pSlot = pNext;
	}
	return (dOffMap);
}


/****************************************************************************
 *	MaDva_ReleaseWtOnSlot
 *
 *	Description:
 *			Release WT slot which is ON.
 *	Argument:
 *			dCh			NoteOff Ch#	(0..15)
 *	Return:
 *			WT-SLOT Off Map
 *
 *			    31    .................      1      0
 *			+-------+---------------------+------+------+
 *          | WT#31 |                     | WT#1 | WT#0 |
 *			+-------+---------------------+------+------+
 *							WT#n    : 0: none, 1: OFF
 ****************************************************************************/
UINT32 MaDva_ReleaseWtOnSlot(UINT32 dCh)
{
	UINT32		dOffMap;
	PSLOTINFO	pSlot;
	PSLOTINFO	pNext;
	UINT32		dIndex;
	
	dOffMap = 0;
	pSlot = gpDvaInfo->pWtSlotOnTop->pNext;
	
	while (pSlot != gpDvaInfo->pWtSlotBottom)
	{
		pNext = pSlot->pNext;
		if ((pSlot->dKeyCh & 0x0F) == dCh)
		{
			switch (pSlot->Mode)
			{
			case DVA_POLY_SLOT:
				gpDvaInfo->bPolyOnMap[pSlot->dKeyCh] &= ~DVA_PMAP_ONOFF;
				if (gpDvaInfo->ChMap[pSlot->dKeyCh & 0x0F].Mode == DVA_DRUM_CH)
				{
					dIndex = gbIsAltDrum[(pSlot->dKeyCh >> 4) & 0x7F];
					gpDvaInfo->sdAlt3Map[dIndex] = -1;
					gpDvaInfo->sdAlt5Map[(dIndex << 4) + (pSlot->dKeyCh & 0x0F)] = -1;
				}
				WtTurnOff(pSlot);
				break;
				
			default: /* DVA_MONO_SLOT */
				gpDvaInfo->ChMap[pSlot->dKeyCh & 0x0F].sdMonoOn = 0;
				WtTurnOff(pSlot);
			}
			dOffMap |= (1L << pSlot->dSlotId);
		}
		pSlot = pNext;
	}
	return (dOffMap);
}


/****************************************************************************
 *	MaDva_ReleaseFmAllSlot
 *
 *	Description:
 *			Release FM slot.
 *	Argument:
 *			dCh			Mute Ch#	(0..15)
 *	Return:
 *			FM-SLOT Off Map
 *
 *			    31    .................      1      0
 *			+-------+---------------------+------+------+
 *          | FM#31 |                     | FM#1 | FM#0 |
 *			+-------+---------------------+------+------+
 *							FM#n    : 0: none, 1: OFF
 ****************************************************************************/
UINT32 MaDva_ReleaseFmAllSlot(UINT32 dCh)
{
	UINT32		dOffMap;
	PSLOTINFO	pSlot;
	PSLOTINFO	pNext;
	UINT32		dIndex;
	
	dOffMap = 0;
	pSlot = gpDvaInfo->pFmSlotTop->pNext;
	if (pSlot == gpDvaInfo->pFmSlotOnTop) pSlot = pSlot->pNext;

	while (pSlot != gpDvaInfo->pFmSlotBottom)
	{
		pNext = pSlot->pNext;
		if (pNext == gpDvaInfo->pFmSlotOnTop) pNext = pNext->pNext;
		if ((pSlot->dKeyCh & 0x0F) == dCh)
		{
			if (pSlot->NoteOn != DVA_NOTE_MUTE)
			{
				switch (pSlot->Mode)
				{
				case DVA_POLY_SLOT:
					gpDvaInfo->bPolyOnMap[pSlot->dKeyCh] &= ~DVA_PMAP_ONOFF;
					if (gpDvaInfo->ChMap[pSlot->dKeyCh & 0x0F].Mode == DVA_DRUM_CH)
					{
						dIndex = gbIsAltDrum[(pSlot->dKeyCh >> 4) & 0x7F];
						gpDvaInfo->sdAlt3Map[dIndex] = -1;
						gpDvaInfo->sdAlt5Map[(dIndex << 4) + (pSlot->dKeyCh & 0x0F)] = -1;
					}
					FmMute(pSlot);
					break;
					
				default: /* DVA_MONO_SLOT */
					gpDvaInfo->ChMap[pSlot->dKeyCh & 0x0F].sdMonoOn = 0;
					FmMute(pSlot);
					break;
				}
				dOffMap |= (1L << pSlot->dSlotId);
			}
		}
		pSlot = pNext;
	}
	return (dOffMap);
}


/****************************************************************************
 *	MaDva_ReleaseWtAllSlot
 *
 *	Description:
 *			Release WT slot.
 *	Argument:
 *			dCh			Mute Ch#	(0..15)
 *	Return:
 *			WT-SLOT Off Map
 *
 *			    31    .................      1      0
 *			+-------+---------------------+------+------+
 *          | WT#31 |                     | WT#1 | WT#0 |
 *			+-------+---------------------+------+------+
 *							WT#n    : 0: none, 1: OFF
 ****************************************************************************/
UINT32 MaDva_ReleaseWtAllSlot(UINT32 dCh)
{
	UINT32		dOffMap;
	PSLOTINFO	pSlot;
	PSLOTINFO	pNext;
	UINT32		dIndex;
	
	dOffMap = 0;
	pSlot = gpDvaInfo->pWtSlotTop->pNext;
	if (pSlot == gpDvaInfo->pWtSlotOnTop) pSlot = pSlot->pNext;
	gpDvaInfo->ChMap[pSlot->dKeyCh & 0x0F].sdMonoOn = 0;
	
	while (pSlot != gpDvaInfo->pWtSlotBottom)
	{
		pNext = pSlot->pNext;
		if (pNext == gpDvaInfo->pWtSlotOnTop) pNext = pNext->pNext;
		if ((pSlot->dKeyCh & 0x0F) == dCh)
		{
			if (pSlot->NoteOn != DVA_NOTE_MUTE)
			{
				if (pSlot->Mode == DVA_POLY_SLOT)
				{
					gpDvaInfo->bPolyOnMap[pSlot->dKeyCh] &= DVA_PMAP_MASK;
					if (gpDvaInfo->ChMap[pSlot->dKeyCh & 0x0F].Mode == DVA_DRUM_CH)
					{
						dIndex = gbIsAltDrum[(pSlot->dKeyCh >> 4) & 0x7F];
						gpDvaInfo->sdAlt3Map[dIndex] = -1;
						gpDvaInfo->sdAlt5Map[(dIndex << 4) + (pSlot->dKeyCh & 0x0F)] = -1;
					}
				}
				WtMute(pSlot);
				dOffMap |= (1L << pSlot->dSlotId);
			}
		}
		pSlot = pNext;
	}
	return (dOffMap);
}


/****************************************************************************
 *	MaDva_ReleaseStreamSlot
 *
 *	Description:
 *			Release STREAM slot.
 *	Argument:
 *			dCh			StreamOff Ch#	(0..15)
 *			dKey		StreamOff Key#	(0..31)
 *	Return:
 *			0..1			Stream Slot#
 *			MASMW_ERROR		if Error.
 ****************************************************************************/
SINT32 MaDva_ReleaseStreamSlot(UINT32 dCh, UINT32 dKey)
{
	SINT32		sdId;
	UINT32		dOffId;
	PSTREAMINFO	pSlot;
	
	if (gpDvaInfo->dStreamNum == 0) return (MASMW_ERROR);
	dOffId = (dKey << 4) + dCh;

	sdId = 0;
	pSlot = &(gpDvaInfo->StreamSlotInfo[sdId]);
	if (pSlot->NoteOn == DVA_STREAM_ON)
	{
		if (pSlot->dIndex == dOffId)
		{
			pSlot->NoteOn = DVA_STREAM_OFF;
			gpDvaInfo->dStreamNextID = (UINT32)sdId;
			return (sdId);
		}
	}
	if (gpDvaInfo->dStreamNum == 1) return (MASMW_ERROR);
	sdId = 1;
	pSlot = &(gpDvaInfo->StreamSlotInfo[sdId]);
	if (pSlot->NoteOn == DVA_STREAM_ON)
	{
		if (pSlot->dIndex == dOffId)
		{
			pSlot->NoteOn = DVA_STREAM_OFF;
			gpDvaInfo->dStreamNextID = (UINT32)sdId;
			return (sdId);
		}
	}
	return (MASMW_ERROR);
}


/****************************************************************************
 *	MaDva_ReleaseStreamAllSlot
 *
 *	Description:
 *			Release STREAM slot.
 *	Argument:
 *			dCh			StreamOff Ch#	(0..15)
 *	Return:
 *			STREAM-SLOT Off Map
 *
 *			    31    .................      1      0
 *			+-----------------------------+------+------+
 *          |            0                | ST#1 | ST#0 |
 *			+-----------------------------+------+------+
 *							STREAM#n    : 0: none, 1: OFF
 ****************************************************************************/
UINT32 MaDva_ReleaseStreamAllSlot(UINT32 dCh)
{
	UINT32		dOffMap;
	PSTREAMINFO	pSlot;
	
	dOffMap = 0;
	if (gpDvaInfo->dStreamNum == 0) return (dOffMap);

	pSlot = &(gpDvaInfo->StreamSlotInfo[0]);
	if (pSlot->NoteOn == DVA_STREAM_ON)
	{
		if ((pSlot->dIndex & 0x0F) == dCh)
		{
			pSlot->NoteOn = DVA_STREAM_OFF;
			gpDvaInfo->dStreamNextID = 0;
			dOffMap = 1;
		}
	}
	
	if (gpDvaInfo->dStreamNum == 1) return (dOffMap);

	pSlot = &(gpDvaInfo->StreamSlotInfo[1]);
	if (pSlot->NoteOn == DVA_STREAM_ON)
	{
		if ((pSlot->dIndex & 0x0F) == dCh)
		{
			pSlot->NoteOn = DVA_STREAM_OFF;
			gpDvaInfo->dStreamNextID = 1;
			dOffMap += 2;
		}
	}
	return (dOffMap);
}


/****************************************************************************
 *	MaDva_GetStreamKey
 *
 *	Description:
 *			Release STREAM slot.
 *	Argument:
 *			dSlot			Slot#	(0..1)
 *	Return:
 *			0..31			Key
 ****************************************************************************/
UINT32 MaDva_GetStreamKey(UINT32 dSlot)
{
	UINT32		dKey;
	
	dKey = (gpDvaInfo->StreamSlotInfo[dSlot].dIndex >> 4) & 0x1F;
	
	return (dKey);
}

⌨️ 快捷键说明

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