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

📄 mamidcnv.c

📁 是一个手机功能的模拟程序
💻 C
📖 第 1 页 / 共 5 页
字号:
				{
					pbVoiceParam = (UINT8*)&gbDrumVoiceTable[j][2];
					dDrumKey = (UINT32)gbDrumVoiceTable[j][1];
					dAdr = gpMidInfo->dRamBase + gpMidInfo->dRamOffset;
					MaDevDrv_SendDirectRamData(dAdr, 0, pbVoiceParam, 30);
					MaSndDrv_SetVoice(gpMidInfo->sdSeqID, 0x80, i, 1, dDrumKey, dAdr);
					gpMidInfo->dRamOffset += 30;
				}
			}
		}
	}
}


/****************************************************************************
 *	ErrorFunction(SINT32 sdTime, UINT32 dCh, UINT32 dPara1, UINT32 dPara2)
 *
 *	Desc.
 *		Error function
 *	Param
 *		sdTime		Delta time
 *		dCh			#Channel(0..15)
 *		dPara1		Undefined
 *		dPara2		Undefined
 *	Return
 *      none
 ****************************************************************************/
static void	ErrorFunction(SINT32 sdTime, UINT32 dCh, UINT32 dPara1, UINT32 dPara2)
{
	(void)sdTime;
	(void)dCh;
	(void)dPara1;
	(void)dPara2;

	MASMFCNV_DBGMSG(("MaMidCnv : ErrorFunction\n"));
}


/****************************************************************************
 *	NotSupported(SINT32 sdTime, UINT32 dCh, UINT32 dPara1, UINT32 dPara2)
 *
 *	Desc.
 *		Error function
 *	Param
 *		sdTime		Delta time
 *		dCh			#Channel(0..15)
 *		dPara1		Undefined
 *		dPara2		Undefined
 *	Return
 *      none
 ****************************************************************************/
static void	NotSupported(SINT32 sdTime, UINT32 dCh, UINT32 dPara1, UINT32 dPara2)
{
	(void)sdTime;
	(void)dCh;
	(void)dPara1;
	(void)dPara2;

	MASMFCNV_DBGMSG(("MaMidCnv : NotSupported\n"));
}


/****************************************************************************
 *	SendLedSync(SINT32 sdTime, UINT32 dCh, UINT32 dVal)
 *
 *	Desc.
 *		Send LedSync message
 *	Param
 *		sdTime		Delta time
 *		dCh			#Channel(0..15)
 *		dVal		0:OFF, 1:SYNC_ON
 *	Return
 *      none
 ****************************************************************************/
static void SendLedSync(SINT32 sdTime, UINT32 dCh, UINT32 dVal)
{
	PMIDPACKET	pMsg;

	MASMFCNV_DBGMSG(("MaMidCnv : %8ld:SendLedSync[%d] = %8ld\n", sdTime, dCh, dVal));

	if (sdTime >= 0)
	{
		pMsg = &gpMidInfo->MsgBuffer[gpMidInfo->dHoldMsgs++];
		pMsg->sdDeltaTime = sdTime;
		pMsg->dMsgID = MASNDDRV_CMD_SET_LED_SYNC_CH;
		pMsg->dP1 = dCh;
		pMsg->dP2 = dVal;
		gpMidInfo->sdLastMsgTime += sdTime << (SMF_TIMEBASE_SHIFT + 10);
	}
}


/****************************************************************************
 *	SendVibSync(SINT32 sdTime, UINT32 dCh, UINT32 dVal)
 *
 *	Desc.
 *		Send MotorSync message
 *	Param
 *		sdTime		Delta time
 *		dCh			#Channel(0..15)
 *		dVal		0:OFF, 1:SYNC_ON
 *	Return
 *      none
 ****************************************************************************/
static void SendVibSync(SINT32 sdTime, UINT32 dCh, UINT32 dVal)
{
	PMIDPACKET	pMsg;

	MASMFCNV_DBGMSG(("MaMidCnv : %8ld:SendVibSync[%d] = %8ld\n", sdTime, dCh, dVal));

	if (sdTime >= 0)
	{
		pMsg = &gpMidInfo->MsgBuffer[gpMidInfo->dHoldMsgs++];
		pMsg->sdDeltaTime = sdTime;
		pMsg->dMsgID = MASNDDRV_CMD_SET_MOTOR_SYNC_CH;
		pMsg->dP1 = dCh;
		pMsg->dP2 = dVal;
		gpMidInfo->sdLastMsgTime += sdTime << (SMF_TIMEBASE_SHIFT + 10);
	}
}


/****************************************************************************
 *	SendMasterVolume(SINT32 sdTime, UINT32 dVol)
 *
 *	Desc.
 *		Send MasterVolume message
 *	Param
 *		sdTime		Delta time
 *		dVol		Master volume (0..127)
 *	Return
 *      none
 ****************************************************************************/
static void	SendMasterVolume(SINT32 sdTime, UINT32 dVol)
{
	PMIDPACKET	pMsg;

	MASMFCNV_DBGMSG(("MaMidCnv : %8ld:SendMasterVolume[%ld]\n", sdTime, dVol));

	if (sdTime >= 0)
	{
		if (gpMidInfo->dHoldMsgs < MAX_SMF_MESSAGES)
		{
			pMsg = &gpMidInfo->MsgBuffer[gpMidInfo->dHoldMsgs++];
			pMsg->sdDeltaTime = sdTime;
			pMsg->dMsgID = MASNDDRV_CMD_MASTER_VOLUME;
			pMsg->dP1 = dVol;
			gpMidInfo->sdLastMsgTime += sdTime << (SMF_TIMEBASE_SHIFT + 10);
		}
	}
}


/****************************************************************************
 *	SendUserEvent(SINT32 sdTime, UINT32 dID)
 *
 *	Desc.
 *		Send USER_EVENT message
 *	Param
 *		sdTime		Delta time
 *		dID			#UserEvent(0..127)
 *	Return
 *      none
 ****************************************************************************/
static void	SendUserEvent(SINT32 sdTime, UINT32 dID)
{
	PMIDPACKET	pMsg;

	MASMFCNV_DBGMSG(("MaMidCnv : %8ld:SendUserEvent[%ld]\n", sdTime, dID));

	if (sdTime >= 0)
	{
		pMsg = &gpMidInfo->MsgBuffer[gpMidInfo->dHoldMsgs++];
		pMsg->sdDeltaTime = sdTime;
		pMsg->dMsgID = MASNDDRV_CMD_USER_EVENT;
		pMsg->dP1 = dID;
		gpMidInfo->sdLastMsgTime += sdTime << (SMF_TIMEBASE_SHIFT + 10);
	}
}


/****************************************************************************
 *	SendNoteOff(SINT32 sdTime, UINT32 dCh, UINT32 dKey, UINT32 dVel)
 *
 *	Desc.
 *		Send NoteOff message
 *	Param
 *		sdTime		Delta time
 *		dCh			#Channel(0..15)
 *		dKey		#Key (0..127)
 *		dVel		Velocity (0..127)
 *	Return
 *      none
 ****************************************************************************/
static void	SendNoteOff(SINT32 sdTime, UINT32 dCh, UINT32 dKey, UINT32 dVel)
{
	PMIDPACKET	pMsg;
	(void)dVel;

	MASMFCNV_DBGMSG(("MaMidCnv : %8ld:SendNoteOff[%ld, %ld, %ld]\n", sdTime, dCh, dKey, dVel));

	if (sdTime >= 0)
	{
		pMsg = &gpMidInfo->MsgBuffer[gpMidInfo->dHoldMsgs++];
		pMsg->sdDeltaTime = sdTime;
		pMsg->dMsgID = MASNDDRV_CMD_NOTE_OFF;
		pMsg->dP1 = dCh;
		pMsg->dP2 = dKey;
		gpMidInfo->sdLastMsgTime += sdTime << (SMF_TIMEBASE_SHIFT + 10);
	}
}


/****************************************************************************
 *	SendNoteOn(SINT32 sdTime, UINT32 dCh, UINT32 dKey, UINT32 dVel)
 *
 *	Desc.
 *		Send NoteOn message
 *	Param
 *		sdTime		Delta time
 *		dCh			#Channel(0..15)
 *		dKey		#Key (0..127)
 *		dVel		Velocity (0..127)
 *	Return
 *      none
 ****************************************************************************/
static void	SendNoteOn(SINT32 sdTime, UINT32 dCh, UINT32 dKey, UINT32 dVel)
{
	PMIDPACKET	pMsg;
	PMIDCHINFO	pCh;

	MASMFCNV_DBGMSG(("MaMidCnv : %8ld:SendNoteOn[%ld, %ld, %ld]\n", sdTime, dCh, dKey, dVel));

	if (sdTime >= 0)
	{
		if (dVel > 0)
		{
			pCh = &gpMidInfo->DataInfo[1].ChInfo[dCh];
			if (pCh->dMipMute == 0)									/* MIP support             */
			{
				pMsg = &gpMidInfo->MsgBuffer[gpMidInfo->dHoldMsgs++];
				pMsg->sdDeltaTime = sdTime;
				pMsg->dMsgID = MASNDDRV_CMD_NOTE_ON;
				pMsg->dP1 = dCh;
				pMsg->dP2 = dKey;
				pMsg->dP3 = dVel;
				gpMidInfo->sdLastMsgTime += sdTime << (SMF_TIMEBASE_SHIFT + 10);

				if ((dKey == gpMidInfo->dSyncNoteKey) && (dCh == gpMidInfo->dSyncNoteCh))
					SendUserEvent(0, MASMW_SET_EVENTNOTE);
			}
			else
			{
				if ((dKey == gpMidInfo->dSyncNoteKey) && (dCh == gpMidInfo->dSyncNoteCh))
					SendUserEvent(sdTime, MASMW_SET_EVENTNOTE);
			}
		}
		else
		{
		 	SendNoteOff(sdTime, dCh, dKey, dVel);
		}
	}
}


/****************************************************************************
 *	SendProgram(SINT32 sdTime, UINT32 dCh, UINT32 dProg, UINT32 dPara2)
 *
 *	Desc.
 *		Send ProgramChange message
 *	Param
 *		sdTime		Delta time
 *		dCh			#Channel(0..15)
 *		dProg		#Program (0..127)
 *		dPara2	Undefined
 *	Return
 *		none
 ****************************************************************************/
static void	SendProgram(SINT32 sdTime, UINT32 dCh, UINT32 dProg, UINT32 dPara2)
{
	UINT32		dBk, dPg;
	UINT32		dBb;
	UINT32		dPp;
	PMIDPACKET	pMsg;
	PMIDCHINFO	pCh;
	UINT32		dVibChange;
	(void)dPara2;
	
	MASMFCNV_DBGMSG(("MaMidCnv : %8ld:SendProgram[%ld] = %ld\n", sdTime, dCh, dProg));

	pCh = &gpMidInfo->DataInfo[1].ChInfo[dCh];
	pCh->dProg = dProg;
	dBb = pCh->dBank;
	pCh->dCurrBank = dBb;

	dVibChange = 0;
	if ((dBb == 0x7906) && (dProg == 0x7C))
	{
		if (pCh->dVibSync == 0)
		{
			gpMidInfo->dVibNote = 1;
			dVibChange = 1;
			pCh->dVibSync = 1;
		}
	}
	else
	{
		if (gpMidInfo->dVibNote == 1)
		{
			if (pCh->dVibSync == 1)
			{
				dVibChange = 1;
				pCh->dVibSync = 0;
			}
		}
	}
	
	if (sdTime >= 0)
	{
		dPp = dProg;
		
		switch (dBb)
		{
		case 0x7900:	/* Melody */
			dBk = 0;
			dPg = dPp;
			break;

		case 0x7800:	/* Drum */
			dBk = 128;
			dPg = 0;
			break;

		case 0x7906:	/* Ring Vibrator (SP-MIDI) */
			dBk = 6;
			dPg = 0x7C;
			break;

		default:		/* Unkonwn : Default GM */
			if ((dBb >> 8) == 0x79)
			{
				/* Melody */
				dBk = 0;
				dPg = dPp;
			}
			else
			{
				/* default */
				if (dCh == 9)
				{
					dBk = 128;
					dPg = 0;
				}
				else
				{
					dBk = 0;
					dPg = dPp;
				}
			}
		}
		pMsg = &gpMidInfo->MsgBuffer[gpMidInfo->dHoldMsgs++];
		pMsg->sdDeltaTime = sdTime;
		pMsg->dMsgID = MASNDDRV_CMD_PROGRAM_CHANGE;
		pMsg->dP1 = dCh;
		pMsg->dP2 = dBk;
		pMsg->dP3 = dPg;
		gpMidInfo->sdLastMsgTime += sdTime << (SMF_TIMEBASE_SHIFT + 10);
		
		if (dVibChange == 1) SendVibSync(0, dCh, pCh->dVibSync);
	}
}


/****************************************************************************
 *	SendModDepth(SINT32 sdTime, UINT32 dCh, UINT32 dMod)
 *
 *	Desc.
 *		Send ModDepth message
 *	Param
 *		sdTime		Delta time
 *		dCh			#Channel(0..15)
 *		dMod		Modulation(0..127)
 *	Return
 *      none
 ****************************************************************************/
static void	SendModDepth(SINT32 sdTime, UINT32 dCh, UINT32 dMod)
{
	PMIDPACKET	pMsg;
	PMIDCHINFO	pCh;
	static const UINT8	bModTable[128] = 
	{
		0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
		1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
		2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
		2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
		3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
		3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
		4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
		4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4
	};

	MASMFCNV_DBGMSG(("MaMidCnv : %8ld:SendModDepth[%ld, %ld]\n", sdTime, dCh, dMod));

	if (sdTime >= 0)
	{
		pMsg = &gpMidInfo->MsgBuffer[gpMidInfo->dHoldMsgs++];
		pMsg->sdDeltaTime = sdTime;
		pMsg->dMsgID = MASNDDRV_CMD_MODULATION_DEPTH;
		pMsg->dP1 = dCh;
		pMsg->dP2 = (UINT32)bModTable[dMod & 0x7F];
		gpMidInfo->sdLastMsgTime += sdTime << (SMF_TIMEBASE_SHIFT + 10);
	} else {
		pCh = &gpMidInfo->DataInfo[1].ChInfo[dCh];
		pCh->dModulation = dMod;
	}
}


/****************************************************************************
 *	SendChVol(SINT32 sdTime, UINT32 dCh, UINT32 dVol)
 *
 *	Desc.
 *		Send ChVol message
 *	Param
 *		sdTime		Delta time
 *		dCh			#Channel(0..15)
 *		dVol		ChVolume (0..127)
 *	Return
 *      none
 ****************************************************************************/
static void	SendChVol(SINT32 sdTime, UINT32 dCh, UINT32 dVol)
{
	PMIDPACKET	pMsg;
	PMIDCHINFO	pCh;

	MASMFCNV_DBGMSG(("MaMidCnv : %8ld:SendChVol[%ld] = %ld\n", sdTime, dCh, dVol));

	dVol &= 0x7F;
	if (sdTime >= 0)
	{
		pMsg = &gpMidInfo->MsgBuffer[gpMidInfo->dHoldMsgs++];
		pMsg->sdDeltaTime = sdTime;
		pMsg->dMsgID = MASNDDRV_CMD_CHANNEL_VOLUME;
		pMsg->dP1 = dCh;
		pMsg->dP2 = dVol;
		gpMidInfo->sdLastMsgTime += sdTime << (SMF_TIMEBASE_SHIFT + 10);
	} else {
		pCh = &gpMidInfo->DataInfo[1].ChInfo[dCh];
		pCh->dVolume = dVol;
	}
}


/****************************************************************************
 *	SendExpression(SINT32 sdTime, UINT32 dCh, UINT32 dVol)
 *
 *	Desc.
 *		Send Expression message
 *	Param
 *		sdTime		Delta time
 *		dCh			#Channel(0..15)
 *		dVol		Expression(0..127)
 *	Return
 *      none
 ****************************************************************************/
static void	SendExpression(SINT32 sdTime, UINT32 dCh, UINT32 dVol)
{
	PMIDPACKET	pMsg;
	PMIDCHINFO	pCh;
	
	MASMFCNV_DBGMSG(("MaMidCnv : %8ld:SendExpression[%ld] = %ld, %ld\n", sdTime, dCh, dVol, gpMidInfo->dMasterVolume));

	dVol &= 0x7F;
	pCh = &gpMidInfo->DataInfo[1].ChInfo[dCh];
	pCh->dExpression = dVol;

	if (sdTime >= 0)
	{
		pMsg = &gpMidInfo->MsgBuffer[gpMidInfo->dHoldMsgs++];
		pMsg->sdDeltaTime = sdTime;
		pMsg->dMsgID = MASNDDRV_CMD_EXPRESSION;
		pMsg->dP1 = dCh;
		pMsg->dP2 = MaSndDrv_Mix40LogVol(dVol, gpMidInfo->dMasterVolume);
		gpMidInfo->sdLastMsgTime += sdTime << (SMF_TIMEBASE_SHIFT + 10);
	}
}


/****************************************************************************
 *	SendPanpot(SINT32 sdTime, UINT32 dCh, UINT32 dPan)
 *
 *	Desc.
 *		Send Expression message
 *	Param
 *		sdTime		Delta time
 *		dCh			#Channel(0..15)
 *		dPan		Panpot (0..127)

⌨️ 快捷键说明

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