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

📄 marmdcnv.c

📁 是一个手机功能的模拟程序
💻 C
📖 第 1 页 / 共 3 页
字号:
		gpRmdInfo->dFineTune[dCh] |= (dVal & 0x7f);
		return (MaSndDrv_SetCommand(gpRmdInfo->sdSeqID, -1, MASNDDRV_CMD_FINE_TUNE, dCh, gpRmdInfo->dFineTune[dCh], 0));
	}
	return (MASMW_SUCCESS);
}


/****************************************************************************
 *	SendAllSoundOff(UINT32 dCh)
 *
 *	Description
 *		Send AllSoundOff message
 *	Param
 *		dCh			...	#Channel(0..15)
 *	Return
 *		0 : NoError, < 0 : Error
 ****************************************************************************/
static SINT32	SendAllSoundOff(UINT32 dCh)
{
	MARMDCNV_DBGMSG(("SendAllSoundOff[%ld] \n", dCh));

	return (MaSndDrv_SetCommand(gpRmdInfo->sdSeqID, -1, MASNDDRV_CMD_ALL_SOUND_OFF, dCh, 0, 0));
}


/****************************************************************************
 *	SendAllNoteOff(UINT32 dCh)
 *
 *	Description
 *		Send AllNoteOff message
 *	Param
 *		dCh			...	#Channel(0..15)
 *	Return
 *		0 : NoError, < 0 : Error
 ****************************************************************************/
static SINT32	SendAllNoteOff(UINT32 dCh)
{
	MARMDCNV_DBGMSG(("SendAllNoteOff[%ld] \n", dCh));

	return (MaSndDrv_SetCommand(gpRmdInfo->sdSeqID, -1, MASNDDRV_CMD_ALL_NOTE_OFF, dCh, 0, 0));
}


/****************************************************************************
 *	SendResetAllCtl(UINT32 dCh)
 *
 *	Description
 *		Send ResetAllControllers message
 *	Param
 *		dCh			...	#Channel(0..15)
 *	Return
 *		0 : NoError, < 0 : Error
 ****************************************************************************/
static SINT32	SendResetAllCtl(UINT32 dCh)
{
	MARMDCNV_DBGMSG(("SendResetAllCtl[%ld] \n", dCh));

	gpRmdInfo->dRPNTable[dCh] = 0x7F7F;
	gpRmdInfo->dExpressionTable[dCh] = 127;

	return (MaSndDrv_SetCommand(gpRmdInfo->sdSeqID, -1, MASNDDRV_CMD_RESET_ALL_CONTROLLERS, dCh, 0, 0));
}


/****************************************************************************
 *	SendMonoOn(UINT32 dCh, UINT32 dVal)
 *
 *	Description
 *		Send MonoOn message
 *	Param
 *		dCh			...	#Channel(0..15)
 *		dVal		... 
 *	Return
 *		0 : NoError, < 0 : Error
 ****************************************************************************/
static SINT32	SendMonoOn(UINT32 dCh, UINT32 dVal)
{
	MARMDCNV_DBGMSG(("SendMonoOn[%ld] \n", dCh));

	if (dVal != 1) return (MASMW_SUCCESS);

	MaSndDrv_SetCommand(gpRmdInfo->sdSeqID, -1, MASNDDRV_CMD_ALL_NOTE_OFF, dCh, 0, 0);
	return (MaSndDrv_SetCommand(gpRmdInfo->sdSeqID, -1, MASNDDRV_CMD_MONO_MODE_ON, dCh, 0, 0));
}


/****************************************************************************
 *	SendPolyOn(UINT32 dCh, UINT32 dVal)
 *
 *	Description
 *		Send PolyOn message
 *	Param
 *		dCh			...	#Channel(0..15)
 *		dVal		... 
 *	Return
 *		0 : NoError, < 0 : Error
 ****************************************************************************/
static SINT32	SendPolyOn(UINT32 dCh, UINT32 dVal)
{
	MARMDCNV_DBGMSG(("SendPolyOn[%ld] \n", dCh));

	if (dVal != 0) return (MASMW_SUCCESS);

	MaSndDrv_SetCommand(gpRmdInfo->sdSeqID, -1, MASNDDRV_CMD_ALL_NOTE_OFF, dCh, 0, 0);
	return (MaSndDrv_SetCommand(gpRmdInfo->sdSeqID, -1, MASNDDRV_CMD_POLY_MODE_ON, dCh, 0, 0));
}


/****************************************************************************
 *	SendControl(UINT32 dCh, UNIT32 dMsg2, UINT32 dMsg3)
 *
 *	Description
 *		Control messages
 *	Param
 *		dCh			...	#Channel(0..15)
 *		dMsg2		...	Param-1
 *		dMsg3		...	Param-2
 *	Return
 *		0 : NoError, < 0 : Error
 ****************************************************************************/
static SINT32	SendControl(UINT32 dCh, UINT32 dMsg2, UINT32 dMsg3)
{
	MARMDCNV_DBGMSG(("SendControl[%ld, %ld, %ld] \n", dCh, dMsg2, dMsg3));

	switch (dMsg2)
	{
	case 0x00:	/* Bank select(MSB) */
		gpRmdInfo->dBankTable[dCh] = (gpRmdInfo->dBankTable[dCh] & 0x00FF) | ((UINT32)dMsg3 << 8);
		break;
    
    case 0x20:	/* Bank select (LSB) */
		gpRmdInfo->dBankTable[dCh] = (gpRmdInfo->dBankTable[dCh] & 0xFF00) | ((UINT32)dMsg3);
		break;

	case 0x01:
		return (SendModDepth(dCh, dMsg3));

	case 0x06:
		return (DataEntryMSB(dCh, dMsg3));

	case 0x07:
		return (SendChVol(dCh, dMsg3));

	case 0x0A:
		return (SendPanpot(dCh, dMsg3));

	case 0x0B:
		return (SendExpression(dCh, dMsg3));

	case 0x26:
		return (DataEntryLSB(dCh, dMsg3));

	case 0x40:
		return (SendHold1(dCh, dMsg3));


	case 0x62:	/* NRPN (LSB) */
	case 0x63:	/* NRPN (MSB) */
		gpRmdInfo->dRPNTable[dCh] |= 0x8000;
		break;

	case 0x64:	/* RPN (LSB) */
		gpRmdInfo->dRPNTable[dCh] = (gpRmdInfo->dRPNTable[dCh] & 0x7F00) | ((UINT32)dMsg3);
		break;

	case 0x65:	/* RPN (MSB) */
		gpRmdInfo->dRPNTable[dCh] = (gpRmdInfo->dRPNTable[dCh] & 0x007F) | ((UINT32)dMsg3 << 8);
		break;

	case 0x78:
		return (SendAllSoundOff(dCh));

	case 0x7B:
		return (SendAllNoteOff(dCh));

	case 0x79:
		return (SendResetAllCtl(dCh));

	case 0x7e:
		return (SendMonoOn(dCh,dMsg3));
		
	case 0x7f:
		return (SendPolyOn(dCh, dMsg3));

	default:
		return (MASMW_SUCCESS);
	}
	return (MASMW_SUCCESS);
}


/****************************************************************************
 *	SendPitchBend(UINT32 dCh, UNIT32 dLl, UINT32 dHh)
 *
 *	Description
 *		Send PitchBend message
 *	Param
 *		dCh			...	#Channel(0..15)
 *		dLl			...	Lower 7bit of PitchBend (0..127)
 *		dHh			...	Upper 7bit of PitchBend (0..127)
 *	Return
 *		0 : NoError, < 0 : Error
 ****************************************************************************/
static SINT32	SendPitchBend(UINT32 dCh, UINT32 dLl, UINT32 dHh)
{
	MARMDCNV_DBGMSG(("SendPitchBend[%ld] = %ld\n", dCh, dHh));

	return (MaSndDrv_SetCommand(gpRmdInfo->sdSeqID, -1, MASNDDRV_CMD_PITCH_BEND, dCh, ((dHh << 7) | (dLl)), 0));
}


/****************************************************************************
 *	SendGmOn(void)
 *
 *	Description
 *		Send GM_ON message
 *	Param
 *		none
 *	Return
 *		0 : NoError, < 0 : Error
 ****************************************************************************/
static SINT32	SendGmOn(void)
{
	SINT32	sdRet;
	UINT32	dCh;
	
	MARMDCNV_DBGMSG(("SendGmOn\n"));

	gpRmdInfo->dMaxGain = RMD_MAX_GAIN;
	gpRmdInfo->dMasterVolume = 127;
	for (dCh = 0; dCh < 16; dCh++)
	{
		SendAllSoundOff(dCh);
		gpRmdInfo->dRPNTable[dCh] = 0x7f7f;
		gpRmdInfo->dBankTable[dCh] = (dCh == 9) ? 0x7800 : 0x7900;
		gpRmdInfo->dChVolumeTable[dCh] = 100;
		gpRmdInfo->dExpressionTable[dCh] = 127;
	}
	sdRet = MaSndDrv_SetCommand(gpRmdInfo->sdSeqID, -1, MASNDDRV_CMD_SYSTEM_ON, 0, 0, 0);
	if (sdRet < 0) return (sdRet);
	sdRet = SendMasterVolume(gpRmdInfo->dMaxGain);
	return (sdRet);
}


/****************************************************************************
 *	Decode7Enc(UINT8* pbSrc, UINT32 dSrcSize, UINT8* pbDst, UINT32 dDstSize)
 *
 *	Desc.
 *		7bit->8bit decoder
 *	Param
 *		pbSrc		Pointer to the source
 *		pbSrcSize	Size of the source[byte]
 *		pbDst		Pointer to the destination
 *		pbDstSize	Size of the destination[byte]
 *	Return
 *      size of decoded data
 ****************************************************************************/
static UINT32 Decode7Enc(UINT8* pbSrc, UINT32 dSrcSize, UINT8* pbDst, UINT32 dDstSize)
{
	UINT32	i, j;
	UINT8*	pbEnd;
	UINT8	bTag;
	
	i = 0;
	pbEnd = pbSrc + dSrcSize;

	while (i < dDstSize)
	{
		bTag = *(pbSrc++);
		if (pbSrc >= pbEnd) break;
		
		for (j = 0; j < 7; j++)
		{
			bTag <<= 1;
			pbDst[i++] = (UINT8)((bTag & 0x80) | *(pbSrc++));
			if (pbSrc >= pbEnd) break;
			if (i >= dDstSize) return (i);
		}
	}
	return (i);
}



/*---------------------------------------------------------------------------*/
/*   Functions                                                               */
/*---------------------------------------------------------------------------*/

/****************************************************************************
 *	MaRmdCnv_Initialize(void)
 *
 *	Description
 *		Initialize RealtimeMIDI converter
 *	Param
 *		none
 *	Return
 *		0 : NoError, < 0 : Error
 ****************************************************************************/
SINT32	MaRmdCnv_Initialize(void)
{
	gpRmdInfo = &gRmdInfo;
	gpRmdInfo->sdSeqID = -1;						/* Sequence ID      */
	gpRmdInfo->sdFileID = -1;						/* File ID          */
	gpRmdInfo->dOpend = 0;							/* 0:disabed        */
	gpRmdInfo->dNumOfLoaded = 0;					/*                  */

	return (MASMW_SUCCESS);
}


/****************************************************************************
 *	MaRmdCnv_End(void)
 *
 *	Description
 *		Ending of RealtimeMIDI converter
 *	Param
 *		none
 *	Return
 *		0 : NoError, < 0 : Error
 ****************************************************************************/
SINT32	MaRmdCnv_End(void)
{
	return (MASMW_SUCCESS);
}


/****************************************************************************
 *	MaRmdCnv_Convert(void)
 *
 *	Description
 *		No effect
 *	Param
 *		none
 *	Return
 *		1 : Continue
 ****************************************************************************/
static SINT32	MaRmdCnv_Convert(void)
{
	if ((gpRmdInfo->dIntervalTime > 0) && (gpRmdInfo->pfnCallbackFunc != NULL))
	{
		gpRmdInfo->pfnCallbackFunc(RMD_INTERVAL_CB);
	}
	return (1);
}


/****************************************************************************
 *	MaRmdCnv_Load(UINT8* pbFile, UINT32 dFileSize, 
 *					UINT32 dMode, SINT32 (*pfnFunc)(UINT8 bID), void* pvExtArgs)
 *
 *	Description
 *		Load MIDI settings
 *	Param
 *		pbFile		... pointer to the data
 *		dFileSize	... size fo the data
 *		dMode		... error check (0:No, 1:Yes, 2:Check)
 *		pfnFunc		... pointer of rhe callback function
 *		pvExtArgs	... NULL
 *	Return
 *		0 : NoError, < 0 : Error
 ****************************************************************************/
SINT32	MaRmdCnv_Load(UINT8* pbFile, UINT32 dFileSize, UINT32 dMode, SINT32 (*pfnFunc)(UINT8 bID), void* pvExtArgs)
{
	(void)pbFile;
	(void)dFileSize;
	(void)pvExtArgs;

	MARMDCNV_DBGMSG(("MaRmdCnv_Load\n"));

	if (dMode > 1) return (MASMW_SUCCESS);
	if (gpRmdInfo->dNumOfLoaded > 0) return (MASMW_ERROR);
	gpRmdInfo->dNumOfLoaded++;
	gpRmdInfo->pfnCallbackFunc = pfnFunc;
	gpRmdInfo->sdFileID = gpRmdInfo->dNumOfLoaded;
	gpRmdInfo->dIntervalTime = 0;

	return ((SINT32)gpRmdInfo->sdFileID);
}


/****************************************************************************
 *	MaRmdCnv_Unload(SINT32 sdFileID, void* pvExtArgs)
 *
 *	Description
 *		Unload MIDI settings
 *	Param
 *		sdFileID		...	file ID
 *		pvExtArgs		...	NULL
 *	Return
 *		0 : NoError, < 0 : Error
 ****************************************************************************/
SINT32	MaRmdCnv_Unload(SINT32 sdFileID, void* pvExtArgs)
{
	(void)pvExtArgs;

	MARMDCNV_DBGMSG(("MaRmdCnv_Unload[%ld] \n", sdFileID));

	if ((sdFileID < 0) || (sdFileID != (SINT32)gpRmdInfo->sdFileID))
	{
		return (MASMW_ERROR);
	}

	gpRmdInfo->dNumOfLoaded = 0;
	gpRmdInfo->sdFileID = -1;

	return (MASMW_SUCCESS);
}


/****************************************************************************
 *	MaRmdCnv_Open(SINT32 sdFileID, void* pvExtArgs)
 *
 *	Description
 *		Enable MIDI
 *	Param
 *		sdFileID		...	file ID
 *		pvExtArgs		...	NULL
 *	Return
 *		0 : NoError, < 0 : Error
 ****************************************************************************/
SINT32	MaRmdCnv_Open(SINT32 sdFileID, void* pvExtArgs)
{
	UINT32	i;
	UINT32	dRam;
	UINT32	dSize;

	(void)pvExtArgs;
	
	MARMDCNV_DBGMSG(("MaRmdCnv_Open[%ld] \n", sdFileID));

	if ((sdFileID < 0) || (sdFileID != gpRmdInfo->sdFileID))
	{
		return (MASMW_ERROR);
	}

	gpRmdInfo->sdSeqID = MaSndDrv_Create(
			MASMW_SEQTYPE_DIRECT,
			gpRmdInfo->dIntervalTime,				/* Interval Timer       */
			4L,										/* 16+16 Mode           */
			7L,										/* 4-OP,GML,MA5VOL      */
			0L,										/* No Streams           */
			255L,									/* No AL                */
			MaRmdCnv_Convert,						/*                      */
			&dRam,									/*                      */
			&dSize);								/*                      */

	MARMDCNV_DBGMSG(("MaRmdCnv_Open/SeqID=%ld \n", gpRmdInfo->sdSeqID));
	if (gpRmdInfo->sdSeqID < 0) return (gpRmdInfo->sdSeqID);

⌨️ 快捷键说明

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