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

📄 marmdcnv.c

📁 是一个手机功能的模拟程序
💻 C
📖 第 1 页 / 共 3 页
字号:
	gSeqID = -1;
	gEnable = 0;

	return (MA3RMDERR_NOERROR);
}


/*=============================================================================
//	Function Name	: SINT32	MaRmdCnv_Standby(SINT32 file_id, void* ext_args)
//
//	Description		: Initialize MIDI Engine
//
//	Argument		: file_id		...	file ID
//					  ext_args		...	NULL
//
//	Return			: 0 : NoError, < 0 : Error
=============================================================================*/
SINT32	MaRmdCnv_Standby(SINT32 file_id, void* ext_args)
{
	(void)ext_args;

	MARMDCNV_DBGMSG(("MaRmdCnv_Standby[%d] \n", file_id));

	if ((file_id < 0) || (file_id != gFileID))
	{
		return (MA3RMDERR_GENERAL);
	}

	return (MA3RMDERR_NOERROR);
}


/*=============================================================================
//	Function Name	: SINT32	MaRmdCnv_Seek(SINT32 file_id, UINT32 pos, UINT8 flag, void* ext_args)
//
//	Description		: No effect
//
//	Argument		: file_id		...	file ID
//					  pos			...	Start point(msec)
//					  flag			...	Wait丂0:No wait丂1: 20[ms] wait
//					  ext_args		...	NULL
//
//	Return			: 0 : NoError, < 0 : Error
=============================================================================*/
SINT32	MaRmdCnv_Seek(SINT32 file_id, UINT32 pos, UINT8 flag, void* ext_args)
{
	(void)pos;
	(void)flag;
	(void)ext_args;

	MARMDCNV_DBGMSG(("MaRmdCnv_Seek[%d %ld] \n", file_id, pos));

	if ((file_id < 0) || (file_id != gFileID))
	{
		return (MA3RMDERR_GENERAL);
	}

	return (MA3RMDERR_NOERROR);
}


/*=============================================================================
//	Function Name	: SINT32	MaRmdCnv_Start(SINT32 file_id, void* ext_args)
//
//	Description		: No effect
//
//	Argument		: file_id		...	file ID
//					  ext_args	...	NULL
//
//	Return			: 0 : NoError, < 0 : Error
=============================================================================*/
SINT32	MaRmdCnv_Start(SINT32 file_id, void* ext_args)
{
	(void)ext_args;

	MARMDCNV_DBGMSG(("MaRmdCnv_Start[%d] \n", file_id));

	if ((file_id < 0) || (file_id != gFileID))
	{
		return (MA3RMDERR_GENERAL);
	}
	MaSndDrv_ControlSequencer(gSeqID, 1);

	return (MA3RMDERR_NOERROR);
}


/*=============================================================================
//	Function Name	: SINT32	MaRmdCnv_Stop(SINT32 file_id, void* ext_args)
//
//	Description		: Stop MIDI Play
//
//	Argument		: file_id		...	file ID
//					  ext_args		...	NULL
//
//	Return			: 0 : NoError, < 0 : Error
=============================================================================*/
SINT32	MaRmdCnv_Stop(SINT32 file_id, void* ext_args)
{
	UINT8	bCh;
	(void)ext_args;
	
	MARMDCNV_DBGMSG(("MaRmdCnv_Stop[%d] \n", file_id));

	if ((file_id < 0) || (file_id != gFileID))
	{
		return (MA3RMDERR_GENERAL);
	}

	MaSndDrv_ControlSequencer(gSeqID, 0);

	for (bCh = 0; bCh < 16; bCh++)
	{
		MaSndDrv_SetCommand(gSeqID, -1, MASNDDRV_CMD_ALL_SOUND_OFF, bCh, 0, 0);
	}
	
	return (MA3RMDERR_NOERROR);
}


/*=============================================================================
//	Function Name	:	SINT32	MaRmdCnv_SetShortMsg(SINT32 file_id, UINT32 dwMsg)
//
//	Description		:	Send MIDI short message
//
//	Argument		: file_id		...	file ID
//					  dwMsg			...	MIDI message
//
//	Return			: 0 : NoError, < 0 : Error
=============================================================================*/
static SINT32	MaRmdCnv_SetShortMsg(SINT32 file_id, UINT32 dwMsg)
{
	UINT8	bMsg1, bMsg2, bMsg3;
	UINT8	bCh;

	static SINT32 (*MidiMsg[16])(UINT8 bChannel, UINT8 bPara1, UINT8 bPara2) =
	{
		ErrorFunction,	ErrorFunction,	ErrorFunction,	ErrorFunction, 
		ErrorFunction, 	ErrorFunction,	ErrorFunction,	ErrorFunction, 
		SendNoteOff,	SendNoteOn,		NotSupported,	SendControl,
		SendProgram,	NotSupported,	SendPitchBend,	NotSupported
	};
	(void)file_id;

	MARMDCNV_DBGMSG(("MaRmdCnv_SetShortMsg[%08lX]\n", dwMsg));

	if (gEnable == 0) return (MA3RMDERR_NOERROR);

	bMsg1 = (UINT8)((dwMsg & 0xf0) >> 4);
	bCh = (UINT8)(dwMsg & 0x0f);
	bMsg2 = (UINT8)((dwMsg >> 8) & 0x7f);
	bMsg3 = (UINT8)((dwMsg >> 16) & 0x7f);

	return (MidiMsg[bMsg1](bCh, bMsg2, bMsg3));
}


/*=============================================================================*/
/*	Decode7Enc()                                                               */
/*                                                                             */
/*	Desc.                                                                      */
/*		7bit->8bit decoder                                                     */
/*	Param                                                                      */
/*		none                                                                   */
/*	Return                                                                     */
/*      size of decoded data                                                   */
/*=============================================================================*/
static UINT32 Decode7Enc(UINT8* pSrc, UINT32 sSize, UINT8* pDst, UINT32 dSize)
{
	UINT32	i, j;
	UINT8*	sEnd;
	UINT8	tag;
	
	i = 0;
	sEnd = pSrc + sSize;

	while (i < dSize)
	{
		tag = *(pSrc++);
		if (pSrc >= sEnd) break;
		
		for (j = 0; j < 7; j++)
		{
			tag <<= 1;
			pDst[i++] = (UINT8)((tag & 0x80) | *(pSrc++));
			if (pSrc >= sEnd) break;
			if (i >= dSize) return (i);
		}
	}
	return (i);
}


/*=============================================================================
//	Function Name	:	SINT32	MaRmdCnv_SetLongMsg(SINT32 file_id, UINT8* pMsg, UINT32 dwSize)
//
//	Description		:	Send MIDI Long message
//
//	Argument		: file_id		...	file ID
//					  pMsg			...	pointer to the SysEx meassage
//					  dwSize		...	Size of the message[byte]
//
//	Return			: 0 : NoError, < 0 : Error
=============================================================================*/
static SINT32	MaRmdCnv_SetLongMsg(SINT32 file_id, UINT8* pMsg, UINT32 dwSize)
{
	SINT32	dwRet;
	UINT8	bBk, bPg, bKey;
	UINT8	bBl, bPc, bFlg;
	UINT32	dwKey, dwAdr, dwRom;
	UINT32	dwWsize;
	UINT8	bWaveID;
	UINT8	bVoice[32];
	UINT8	bCh;
	
	(void)file_id;

	MARMDCNV_DBGMSG(("MaRmdCnv_SetLongMsg[0x%08lX, %ld] \n", pMsg, dwSize));

	dwRet = MA3RMDERR_NOERROR;
	if (gEnable == 0) return (MA3RMDERR_NOERROR);
	if (dwSize < 6) return (MA3RMDERR_NOERROR);
	if (pMsg[0] != 0xf0) return (MA3RMDERR_GENERAL);
	if (pMsg[dwSize - 1] != 0xf7) return (MA3RMDERR_GENERAL);
	
	if ((pMsg[1] == 0x7e) &&
	    (pMsg[2] == 0x7f) &&
	    (pMsg[3] == 0x09) &&
	    ((pMsg[4] == 0x01) || (pMsg[4] == 0x03)) &&
	    (dwSize == 6)) return (SendGmOn());
	
	if ((pMsg[1] == 0x7f) &&
	    (pMsg[2] == 0x7f) &&
	    (pMsg[3] == 0x04) &&
	    (pMsg[4] == 0x01) &&
	    (dwSize == 8))
	{
		gbMasterVolume = pMsg[6] & 0x7f;
		SendExpression(0, gbExpression[0]);
		for (bCh = 1; bCh < 16; bCh++) SendExpression(bCh, gbExpression[bCh]);
		return (MA3RMDERR_NOERROR);
	}
	
	if ((pMsg[1] != 0x43) ||
	    (pMsg[2] != 0x79) ||
	    (pMsg[3] != 0x06) ||
	    (pMsg[4] != 0x7f) ||
	    (dwSize < 8)) return (MA3RMDERR_NOERROR);

	switch (pMsg[5])
	{
	case 0x00:		/* Max Gain */
		if (dwSize != 8) return (MA3RMDERR_GENERAL);
		gbMaxGain = (UINT8)(pMsg[6] & 0x7f);
		SendMasterVolume(gbMaxGain);
		return (MA3RMDERR_NOERROR);
	
	case 0x10:		/* UserEvent */
		if (dwSize != 8) return (MA3RMDERR_GENERAL);
		if (gCallbackFunc == NULL) return (MA3RMDERR_GENERAL);
		return (gCallbackFunc((UINT8)(pMsg[6] & 0x0f)));
	
	case 0x01:		/* Set Voice params */
		if (dwSize < 31) return (MA3RMDERR_GENERAL);
		bBl = (UINT8)(pMsg[7] & 0x7f);
		bPc = (UINT8)(pMsg[8] & 0x7f);
		bKey = (UINT8)(pMsg[9] & 0x7f);
		bFlg = (UINT8)(pMsg[10] + 1);

		switch (pMsg[6])
		{
		case 0x7c:
			bBk = (UINT8)(1 + bBl);
			bPg = bPc;
			break;
		case 0x7d:
			bBk = (UINT8)(129 + bPc);
			bPg = bKey;
			break;
		default:
			return (MA3RMDERR_GENERAL);
		}

		dwAdr = gRamBase + gRamOffset;

		switch (dwSize)
		{
		case 31:	/* WT */
			if (bFlg != 2) return (MA3RMDERR_GENERAL);
			if ((gRamOffset + 13) > gRamSize) return (MA3RMDERR_NOERROR);
			Decode7Enc(&pMsg[11], 19, bVoice, 16);

			dwKey = ((UINT32)bVoice[0] << 8) | (UINT32)bVoice[1];
			bWaveID = bVoice[15];

			if (bWaveID < 128)
			{
				bVoice[9] = (UINT8)((gWtWaveAdr[bWaveID] >> 8) & 0xff);
				bVoice[10] = (UINT8)(gWtWaveAdr[bWaveID] & 0xff);
			} else {
				dwRom = MaResMgr_GetDefWaveAddress((UINT8)(bWaveID & 0x7f));
				if (dwRom <= 0) return (MA3RMDERR_GENERAL);
				bVoice[9] = (UINT8)((dwRom >> 8) & 0xff);
				bVoice[10] = (UINT8)(dwRom & 0xff);
			}
			MaDevDrv_SendDirectRamData(dwAdr, ENC_8BIT, &bVoice[2], 13);
			dwRet = MaSndDrv_SetVoice(gSeqID, bBk, bPg, bFlg, dwKey, dwAdr);
			gRamOffset += 14;
			break;

		case 32:	/* 2-OP FM */
			if (bFlg != 1) return (MA3RMDERR_GENERAL);
			if ((gRamOffset + 16) > gRamSize) return (MA3RMDERR_NOERROR);
			Decode7Enc(&pMsg[11], 20, bVoice, 17);
			dwKey = bVoice[0];
			MaDevDrv_SendDirectRamData(dwAdr, ENC_8BIT, &bVoice[1], 16);
			dwRet = MaSndDrv_SetVoice(gSeqID, bBk, bPg, bFlg, dwKey, dwAdr);
			gRamOffset += 16;
			break;

		case 48:	/* 4-OP FM */
			if (RMD_DEF_FM_MODE != FM_4OP_MODE) return (MA3RMDERR_GENERAL);
			if (bFlg != 1) return (MA3RMDERR_GENERAL);
			if ((gRamOffset + 31) > gRamSize) return (MA3RMDERR_NOERROR);
			Decode7Enc(&pMsg[11], 36, bVoice, 31);
			dwKey = bVoice[0];
			MaDevDrv_SendDirectRamData(dwAdr, ENC_8BIT, &bVoice[1], 30);
			dwRet = MaSndDrv_SetVoice(gSeqID, bBk, bPg, bFlg, dwKey, dwAdr);
			gRamOffset += 30;
			break;
		
		default:
			return (MA3RMDERR_GENERAL);
		}
		break;
		
	case 0x03:		/* Set Wave */
		dwAdr = gRamBase + gRamOffset;
		if (dwSize < 10) return (MA3RMDERR_GENERAL);
		if (pMsg[dwSize - 1] != 0xf7) return (MA3RMDERR_GENERAL);
		dwWsize = dwSize - 9;
		dwWsize = (dwWsize >> 3) * 7 + (((dwWsize & 0x07) == 0) ? 0 : ((dwWsize & 0x07)-1));
		if ((gRamOffset + dwWsize) > gRamSize) return (MA3RMDERR_NOERROR);
		bPc = (UINT8)(pMsg[6] & 0x7f);
		bFlg = (UINT8)(pMsg[7] & 0x7f);
		dwRet = MaDevDrv_SendDirectRamData(dwAdr, ENC_7BIT, &(pMsg[8]), dwSize - 9);
		gRamOffset += ((dwWsize + 1) >> 1) << 1;
		gWtWaveAdr[bPc] = dwAdr;
		break;
		
	default:
		return (MA3RMDERR_NOERROR);
	}

	return (dwRet);
}


/*=============================================================================
//	Function Name	: SINT32	MaRmdCnv_Control(SINT32 file_id, UINT8 ctrl_num, void* prm, void* ext_args)
//
//	Description		: Special commands
//
//	Argument		: file_id		...	file ID
//					  ctrl_num		...	Command ID
//					  prm			...	param for the command
//
//	Return			: 0 : NoError, < 0 : Error
=============================================================================*/
SINT32	MaRmdCnv_Control(SINT32 file_id, UINT8 ctrl_num, void* prm, void* ext_args)
{
	(void)ext_args;

	MARMDCNV_DBGMSG(("MaRmdCnv_Control[%d, %d] \n", file_id, ctrl_num));

	if ((file_id < 0) || (file_id != gFileID))
	{
		return (MA3RMDERR_GENERAL);
	}

	switch(ctrl_num)
	{
	case MASMW_SET_VOLUME :
		return (MaSndDrv_SetVolume(gSeqID, *((UINT8*)prm)));
		
	case MASMW_SEND_MIDIMSG :
		return (MaRmdCnv_SetShortMsg(file_id, *((UINT32*)prm)));
		
	case MASMW_SEND_SYSEXMIDIMSG :
		return (MaRmdCnv_SetLongMsg(file_id, ((PMASMW_MIDIMSG)prm)->pbMsg, ((PMASMW_MIDIMSG)prm)->dSize));
		
	case MASMW_GET_LENGTH :
		return (1000);			/* dummy length (1sec)*/

	case MASMW_SET_REPEAT :
		return (MASMW_SUCCESS);			/* dummy func */

	case MASMW_GET_CONTROL_VAL:
		switch (((PMASMW_GETCTL)prm)->bControl)
		{
		case 0:	/* Master Volume */
			return (gbMasterVolume);
			
		case 1:	/* Channel Volume */
			if (((PMASMW_GETCTL)prm)->bCh >= 16) return (MASMW_ERROR);
			return (gbChVolume[((PMASMW_GETCTL)prm)->bCh]);
		}
		return (MASMW_ERROR);

	case MASMW_SET_CB_INTERVAL: 
		if ((*(UINT8*)prm != 0) && (*(UINT8*)prm != 20)) return (MASMW_ERROR);
		gbIntervalTime = *(UINT8*)prm;
		return (MASMW_SUCCESS);
	}

	return (MA3RMDERR_NOERROR);
}


/*=============================================================================
//	Function Name	: SINT32	MaRmdCnv_Convert(void)
//
//	Description		: No effect
//
//	Argument		: none
//
//	Return			: 1 : Continue
=============================================================================*/
SINT32	MaRmdCnv_Convert(void)
{
	if ((gbIntervalTime > 0) && (gCallbackFunc != NULL))
	{
		gCallbackFunc(RMD_INTERVAL_CB);
	}
	return (1);
}

⌨️ 快捷键说明

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