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

📄 mamidcnv.c

📁 是一个手机功能的模拟程序
💻 C
📖 第 1 页 / 共 5 页
字号:
 *	Return
 *      none
 ****************************************************************************/
static void	SendPanpot(SINT32 sdTime, UINT32 dCh, UINT32 dPan)
{
	PMIDPACKET	pMsg;
	PMIDCHINFO	pCh;

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

	dPan &= 0x7F;

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


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

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

	if (sdTime >= 0)
	{
		pMsg = &gpMidInfo->MsgBuffer[gpMidInfo->dHoldMsgs++];
		pMsg->sdDeltaTime = sdTime;
		pMsg->dMsgID = MASNDDRV_CMD_HOLD1;
		pMsg->dP1 = dCh;
		pMsg->dP2 = ((dVal < 64) ? 0 : 1);
		gpMidInfo->sdLastMsgTime += sdTime << (SMF_TIMEBASE_SHIFT + 10);
	} else {
		pCh = &gpMidInfo->DataInfo[1].ChInfo[dCh];
		pCh->dHold1 = dVal;
	}
}


/****************************************************************************
 *	SendBendRange(SINT32 sdTime, UINT32 dCh, UINT32 dVal)
 *
 *	Desc.
 *		Send PitchBendRange message
 *	Param
 *		sdTime		Delta time
 *		dCh			#Channel(0..15)
 *		dVal		BendRange (0..24)
 *	Return
 *      none
 ****************************************************************************/
static void	SendBendRange(SINT32 sdTime, UINT32 dCh, UINT32 dVal)
{
	PMIDPACKET	pMsg;
	PMIDCHINFO	pCh;

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

	if (sdTime >= 0)
	{
		pMsg = &gpMidInfo->MsgBuffer[gpMidInfo->dHoldMsgs++];
		pMsg->sdDeltaTime = sdTime;
		if (dVal <= 24)
		{
			pMsg->dMsgID = MASNDDRV_CMD_BEND_RANGE;
			pMsg->dP1 = dCh;
			pMsg->dP2 = dVal;
		}
		else
		{
			pMsg->dMsgID = MASNDDRV_CMD_NOP;
			pMsg->dP1 = 0;
		}
		gpMidInfo->sdLastMsgTime += sdTime << (SMF_TIMEBASE_SHIFT + 10);
	} else {
		pCh = &gpMidInfo->DataInfo[1].ChInfo[dCh];
		pCh->dPreBendRange = dVal;
	}
}


/****************************************************************************
 *	SendFineTune(SINT32 sdTime, UINT32 dCh, UINT32 dVal)
 *
 *	Desc.
 *		Send FineTune message
 *	Param
 *		sdTime		Delta time
 *		dCh			#Channel(0..15)
 *		dVal		Tune (0..0x3FFF)
 *	Return
 *      none
 ****************************************************************************/
static void	SendFineTune(SINT32 sdTime, UINT32 dCh, UINT32 dVal)
{
	PMIDPACKET	pMsg;

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

	if (sdTime >= 0)
	{
		pMsg = &gpMidInfo->MsgBuffer[gpMidInfo->dHoldMsgs++];
		pMsg->sdDeltaTime = sdTime;

		pMsg->dMsgID = MASNDDRV_CMD_FINE_TUNE;
		pMsg->dP1 = dCh;
		pMsg->dP2 = dVal;

		gpMidInfo->sdLastMsgTime += sdTime << (SMF_TIMEBASE_SHIFT + 10);
	}
}


/****************************************************************************
 *	SendCoaseTune(SINT32 sdTime, UINT32 dCh, UINT32 dVal)
 *
 *	Desc.
 *		Send CoaseTune message
 *	Param
 *		sdTime		Delta time
 *		dCh			#Channel(0..15)
 *		dVal		Tune (0..0x7F)
 *	Return
 *      none
 ****************************************************************************/
static void	SendCoaseTune(SINT32 sdTime, UINT32 dCh, UINT32 dVal)
{
	PMIDPACKET	pMsg;

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

	if (sdTime >= 0)
	{
		pMsg = &gpMidInfo->MsgBuffer[gpMidInfo->dHoldMsgs++];
		pMsg->sdDeltaTime = sdTime;

		pMsg->dMsgID = MASNDDRV_CMD_COASE_TUNE;
		pMsg->dP1 = dCh;
		pMsg->dP2 = dVal;

		gpMidInfo->sdLastMsgTime += sdTime << (SMF_TIMEBASE_SHIFT + 10);
	}
}


/****************************************************************************
 *	SendAllSoundOff(SINT32 sdTime, UINT32 dCh)
 *
 *	Desc.
 *		Send AllSoundOff message
 *	Param
 *		sdTime		Delta time
 *		dCh			#Channel(0..15)
 *	Return
 *      none
 ****************************************************************************/
static void	SendAllSoundOff(SINT32 sdTime, UINT32 dCh)
{
	PMIDPACKET	pMsg;

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

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


/****************************************************************************
 *	SendAllNoteOff(SINT32 sdTime, UINT32 dCh)
 *
 *	Desc.
 *		Send AllNoteOff message
 *	Param
 *		sdTime		Delta time
 *		dCh			#Channel(0..15)
 *	Return
 *      none
 ****************************************************************************/
static void	SendAllNoteOff(SINT32 sdTime, UINT32 dCh)
{
	PMIDPACKET	pMsg;

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

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


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

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

	pCh = &gpMidInfo->DataInfo[1].ChInfo[dCh];
	pCh->dRPN = 0x7F7F;
	pCh->dExpression = 127;

	if (sdTime >= 0)
	{
		pMsg = &gpMidInfo->MsgBuffer[gpMidInfo->dHoldMsgs++];
		pMsg->sdDeltaTime = sdTime;
		pMsg->dMsgID = MASNDDRV_CMD_RESET_ALL_CONTROLLERS;
		pMsg->dP1 = dCh;
		gpMidInfo->sdLastMsgTime += sdTime << (SMF_TIMEBASE_SHIFT + 10);
		
		SendExpression(0, dCh, pCh->dExpression);
	} else {
		pCh->dModulation = 0;
		pCh->dBendRange = pCh->dPreBendRange;
		pCh->dPitchBend = 0x40;
		pCh->dHold1 = 0;
	}
}


/****************************************************************************
 *	SendMonoOn(SINT32 sdTime, UINT32 dCh, UINT32 dVal)
 *
 *	Desc.
 *		Send MonoOn message
 *	Param
 *		sdTime		Delta time
 *		dCh			#Channel(0..15)
 *		dVal		Shuld be 0
 *	Return
 *      none
 ****************************************************************************/
static void	SendMonoOn(SINT32 sdTime, UINT32 dCh, UINT32 dVal)
{
	PMIDPACKET	pMsg;
	PMIDCHINFO	pCh;
	(void)		dVal;

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

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


/****************************************************************************
 *	SendPolyOn(SINT32 sdTime, UINT32 dCh, UINT32 dVal)
 *
 *	Desc.
 *		Send MonoOn message
 *	Param
 *		sdTime		Delta time
 *		dCh			#Channel(0..15)
 *		dVal		Shuld be 0
 *	Return
 *      none
 ****************************************************************************/
static void	SendPolyOn(SINT32 sdTime, UINT32 dCh, UINT32 dVal)
{
	PMIDPACKET	pMsg;
	PMIDCHINFO	pCh;
	(void)		dVal;

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

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


/****************************************************************************
 *	SendControl(SINT32 sdTime, UINT32 dCh, UINT32 dMsg2, UINT32 dMsg3)
 *
 *	Desc.
 *		Send Control message
 *	Param
 *		sdTime		Delta time
 *		dCh			#Channel(0..15)
 *		dMsg2		Parameter 1
 *		dMsg3		Parameter 2
 *	Return
 *      none
 ****************************************************************************/
static void	SendControl(SINT32 sdTime, UINT32 dCh, UINT32 dMsg2, UINT32 dMsg3)
{
	PMIDCHINFO	pCh;

	switch (dMsg2)
	{
	case 0x07:	/* Channel volume */
		SendChVol(sdTime, dCh, dMsg3);
		break;

	case 0x0B:	/* Expression */
		SendExpression(sdTime, dCh, dMsg3);
		break;

	case 0x0A:	/* Panpot */
		SendPanpot(sdTime, dCh, dMsg3);
		break;

	case 0x40:	/* Hold1 */
		SendHold1(sdTime, dCh, dMsg3);
		break;

	case 0x01:	/* Modulation */
		SendModDepth(sdTime, dCh, dMsg3);
		break;

	case 0x00:	/* Bank select(MSB) */
		pCh = &gpMidInfo->DataInfo[1].ChInfo[dCh];
		pCh->dBank = (pCh->dBank & 0x00FF) | (dMsg3 << 8);
		break;
    
    case 0x20:	/* Bank select (LSB) */
		pCh = &gpMidInfo->DataInfo[1].ChInfo[dCh];
		pCh->dBank = (pCh->dBank & 0xFF00) | dMsg3;
		break;

	case 0x06:	/* Data Entry MSB */
		pCh = &gpMidInfo->DataInfo[1].ChInfo[dCh];
		switch (pCh->dRPN)
		{
		case 0:	/* BendSens */
			SendBendRange(sdTime, dCh, dMsg3);
			break;
		case 1:	/* FineTune */
			pCh->dFineTune = (dMsg3 & 0x7f) << 7;
			SendFineTune(sdTime, dCh, pCh->dFineTune);
			break;
		case 2:	/* CoaseTune */
			pCh->dCoaseTune = dMsg3 & 0x7F;
			SendCoaseTune(sdTime, dCh, pCh->dCoaseTune);
		}
		break;

	case 0x26:	/* Data Entry LSB */
		pCh = &gpMidInfo->DataInfo[1].ChInfo[dCh];
		switch (pCh->dRPN)
		{
		case 1:	/* FineTune */
			pCh->dFineTune &= 0x3F80;
			pCh->dFineTune |= dMsg3 & 0x7f;
			SendFineTune(sdTime, dCh, pCh->dFineTune);
		}
		break;

	case 0x62:	/* NRPN (LSB) */
	case 0x63:	/* NRPN (MSB) */
		pCh = &gpMidInfo->DataInfo[1].ChInfo[dCh];
		pCh->dRPN |= 0x8000;
		break;

	case 0x64:	/* RPN (LSB) */
		pCh = &gpMidInfo->DataInfo[1].ChInfo[dCh];
		pCh->dRPN = (pCh->dRPN & 0x7F00) | dMsg3;
		break;

	case 0x65:	/* RPN (MSB) */
		pCh = &gpMidInfo->DataInfo[1].ChInfo[dCh];
		pCh->dRPN = (pCh->dRPN & 0x007F) | (dMsg3 << 8);
		break;

	case 0x78:
		SendAllSoundOff(sdTime, dCh);
		break;

	case 0x7B:
		SendAllNoteOff(sdTime, dCh);
		break;

	case 0x79:
		SendResetAllCtl(sdTime, dCh);
		break;

	case 0x7e:
		SendAllNoteOff(sdTime, dCh);
		SendMonoOn(0, dCh, dMsg3);
		break;

	case 0x7f:
		SendAllNoteOff(sdTime, dCh);
		SendPolyOn(0, dCh, dMsg3);
		break;
		
	default:
		MASMFCNV_DBGMSG(("MaMidCnv : %8ld:UnknownControl[%ld, %ld, %ld] \n", sdTime, dCh, dMsg2, dMsg3));
	}
}


/****************************************************************************
 *	SendPitchBend(SINT32 sdTime, UINT32 dCh, UINT32 dLl, UINT32 dHh)
 *
 *	Desc.
 *		Send PitchBend message
 *	Param
 *		sdTime		Delta time
 *		dCh			#Channel(0..15)
 *		dLl			Lower 7bit of PitchBend (0..127)
 *		bHh			Upper 7bit of PitchBend (0..127)
 *	Return
 *      none
 ****************************************************************************/
static void SendPitchBend(SINT32 sdTime, UINT32 dCh, UINT32 dLl, UINT32 dHh)
{
	PMIDPACKET	pMsg;
	PMIDCHINFO	pCh;

	MASMFCNV_DBGMSG(("MaMidCnv : %8ld:SendPitchBend[%d] = %02lX:%02lX\n", sdTime, dCh, dHh, dLl));

	if (sdTime >= 0)
	{
		pMsg = &gpMidInfo->MsgBuffer[gpMidInfo->dHoldMsgs++];
		pMsg->sdDeltaTime = sdTime;
		pMsg->dMsgID = MASNDDRV_CMD_PITCH_BEND;
		pMsg->dP1 = dCh;
		pMsg->dP2 = (dHh << 7) + dLl;
		gpMidInfo->sdLastMsgTime += sdTime << (SMF_TIMEBASE_SHIFT + 10);
	} else {
		pCh = &gpMidInfo->DataInfo[1].ChInfo[dCh];
		pCh->dBendRange = pCh->dPreBendRange;
		pCh->dPitchBend = dHh;
	}
}


/****************************************************************************
 *	SendGmOn(SINT32 sdTime)
 *
 *	Desc.
 *		Send GmOn message
 *	Param
 *		sdTime		Delta time
 *	Return
 *      none

⌨️ 快捷键说明

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