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

📄 marmdcnv.c

📁 是一个手机功能的模拟程序
💻 C
📖 第 1 页 / 共 3 页
字号:
/****************************************************************************
 *
 *		Copyright (C) 2002-2003	YAMAHA CORPORATION. All rights reserved.
 *
 *		Module		: marmdcnv.c
 *
 *		Description	: Realtime MIDI/GML Stream Converter Module.
 *
 *		Version		: 1.0.3 	2003.06.26
 *
 ****************************************************************************/


#include "marmdcnv.h"

/*--------------------------------------------------------------------------*/
/*   Defines                                                                */
/*--------------------------------------------------------------------------*/
#define	RMD_MAX_GAIN		76				/* - 9[dB]                  */
											/* - 6[dB] : 90             */
											/* - 9[dB] : 76             */
											/* -12[dB] : 64             */
											/* -18[dB] : 45             */

#define RMD_INTERVAL_CB		(17)

#define ENC_8BIT			(0)
#define ENC_7BIT			(1)

#define	MAX_NUM_OF_WAVES	(32)

#define MODE_DRUM			(0x00)			/* GMX 			*/

/*--------------------------------------------------------------------------*/
/*   Types                                                                  */
/*--------------------------------------------------------------------------*/
typedef struct _MASMW_MIDIMSG
{
	UINT8*	pbMsg;						/* pointer to MIDI message */
	UINT32	dSize;						/* size of MIDI message */
} MASMW_MIDIMSG, *PMASMW_MIDIMSG;


typedef	struct _MASMW_GETCTL
{
	UINT8	bControl;					/* contorl number */
	UINT8 	bCh;						/* channel number */
} MASMW_GETCTL, *PMASMW_GETCTL;


typedef	struct _tagRmdGlobals
{
 	SINT32		(*pfnCallbackFunc)(UINT8 bId);	/*                       */

	SINT32		sdSeqID;						/* Sequence ID           */
	SINT32		sdFileID;						/* File ID               */
	UINT32		dOpend;							/* 0:Closed, 1:Opend     */
	UINT32		dNumOfLoaded;					/*                       */
	UINT32		dIntervalTime;					/* 0 or 20[ms]           */

	UINT32		dMaxGain;						/* MaxGain (0..127)      */
	UINT32		dMasterVolume;					/* MasterVolume (0..127) */

	UINT32		dRamBase;						/*                       */
	UINT32		dRamOffset;						/*                       */
	UINT32		dRamSize;						/*                       */

	UINT32		dBankTable[16];					/* 0..0x7F7F             */
	UINT32		dRPNTable[16];					/* 0..0xFF7F             */
	UINT32		dChVolumeTable[16];				/* 0..127                */
	UINT32		dExpressionTable[16];			/* 0..127                */
	UINT32		dFineTune[16];					/* 0..0x3FFF			 */
	UINT32		dWtAdrTable[MAX_NUM_OF_WAVES];	/*                       */
} RMDGLOBAL, *PRMDGLOBAL;

/*--------------------------------------------------------------------------*/
/*   Consts                                                                 */
/*--------------------------------------------------------------------------*/

/*---------------------------------------------------------------------------*/
/*   Globals                                                                 */
/*---------------------------------------------------------------------------*/
static RMDGLOBAL	gRmdInfo;
static PRMDGLOBAL	gpRmdInfo;

/*---------------------------------------------------------------------------*/
/*   Functions (internal use only)                                           */
/*---------------------------------------------------------------------------*/

/****************************************************************************
 *	SendMasterVolume(UINT32 dVol)
 *
 *	Description
 *		Send SetMasterVolume message
 *	Param
 *		dVol	Master volume (0..127)
 *	Return
 *		0 : NoError, < 0 : Error
 ****************************************************************************/
static SINT32	SendMasterVolume(UINT32 dVol)
{
	if (gpRmdInfo->sdSeqID > 0)
	{
		MaSndDrv_SetCommand(gpRmdInfo->sdSeqID, -1, MASNDDRV_CMD_MASTER_VOLUME, dVol, 0, 0);
	}
	return (MASMW_SUCCESS);
}


/****************************************************************************
 *	ErrorFunction(UINT32 dCh, UINT32 dPara1, UINT32 dPara2)
 *
 *	Description
 *		Invalid messages
 *
 *	Param
 *		dCh		MIDI channel (0..15)
 *		dPara1	Undefined
 *		dPara2	Undefined
 *	Return
 *		0 : NoError, < 0 : Error
 ****************************************************************************/
static SINT32	ErrorFunction(UINT32 dCh, UINT32 dPara1, UINT32 dPara2)
{
	(void)dCh;
	(void)dPara1;
	(void)dPara2;

	MARMDCNV_DBGMSG(("ErrorFunction\n"));

	return (MASMW_ERROR_ARGUMENT);
}


/****************************************************************************
 *	NotSupported(UINT32 dCh, UINT32 dPara1, UINT32 dPara2)
 *
 *	Description
 *		Unsupported messages
 *	Param
 *		dCh		MIDI channel (0..15)
 *		dPara1	Undefined
 *		dPara2	Undefined
 *	Return
 *		0 : NoError, < 0 : Error
 ****************************************************************************/
static SINT32	NotSupported(UINT32 dCh, UINT32 dPara1, UINT32 dPara2)
{
	(void)dCh;
	(void)dPara1;
	(void)dPara2;

	MARMDCNV_DBGMSG(("NotSupported\n"));

	return (MASMW_SUCCESS);
}


/****************************************************************************
 *	SendNoteOff(UINT32 dCh, UNIT32 dKey, UINT32 dVel)
 *
 *	Description
 *		Send NoteOff message
 *	Param
 *		dCh			...	#Channel(0..15)
 *		dKey		...	#Key (0..127)
 *		dVel		...	Velocity (0..127)
 *	Return
 *		0 : NoError, < 0 : Error
 ****************************************************************************/
static SINT32	SendNoteOff(UINT32 dCh, UINT32 dKey, UINT32 dVel)
{
	(void)dVel;

	MARMDCNV_DBGMSG(("SendNoteOff[%ld, %ld] \n", dCh, dKey));

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


/****************************************************************************
 *	SendNoteOn(UINT32 dCh, UINT32 dKey, UINT32 dVel)
 *
 *	Description
 *		Send NoteOn message
 *	Param
 *		dCh			...	#Channel(0..15)
 *		dKey		...	#Key (0..127)
 *		dVel		...	Velocity (0..127)
 *	Return
 *		0 : NoError, < 0 : Error
 ****************************************************************************/
static SINT32	SendNoteOn(UINT32 dCh, UINT32 dKey, UINT32 dVel)
{
	if (dVel == 0) return(SendNoteOff(dCh, dKey, dVel));

	MARMDCNV_DBGMSG(("SendNoteOn[%ld, %ld, %ld]\n", dCh, dKey, dVel));

	return (MaSndDrv_SetCommand(gpRmdInfo->sdSeqID, -1, MASNDDRV_CMD_NOTE_ON, dCh, dKey, dVel));
}


/****************************************************************************
 *	SendProgram(UINT32 dCh, UNIT32 dProg, UINT32 dPara2)
 *
 *	Description
 *		Send Program message
 *	Param
 *		dCh			...	#Channel(0..15)
 *		dProg		...	#Program(0..127)
 *		dPara2
 *	Return
 *		0 : NoError, < 0 : Error
 ****************************************************************************/
static SINT32	SendProgram(UINT32 dCh, UINT32 dProg, UINT32 dPara2)
{
	UINT8	bBk, bPg;
	UINT32	dBb;
	UINT8	bPp;

	static const UINT8	bMBank[128] = 
	{
		1, 2, 3, 4, 5, 6, 7, 8, 9, 10,0, 0, 0, 0, 0, 0,
		0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
		0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
		0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
		0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
		0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
		0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
		0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
	};
	(void)dPara2;
	
	MARMDCNV_DBGMSG(("SendProgram[%ld] = %ld\n", dCh, dProg));

	bPp = (UINT8)(dProg & 0x7f);

	dBb = gpRmdInfo->dBankTable[dCh];

	switch (dBb)
	{
	case 0x7900:	/* Melody */
		bBk = 0;
		bPg = bPp;
		break;

	case 0x7800:	/* Drum */
		bBk = 128;
		bPg = 0;
		break;

	default:		/* Unknown : default GM */
		switch (dBb >> 8)
		{
		case 0x79:	/* Default Melody */
			bBk = 0;
			bPg = bPp;
			break;

		case 0x7C:	/* Ex Melody */
			bBk = (UINT8)(bMBank[dBb & 0x7F]);
			bPg = bPp;
			break;

		case 0x7D:	/* Ex Drum */
			bBk = (UINT8)(128 + bMBank[bPp]);
			bPg = 0;
			break;
		
		default:
			if (dCh == 9)
			{
				bBk = 128;
				bPg = 0;
			} else {
				bBk = 0;
				bPg = bPp;
			}
		}
	}
	return (MaSndDrv_SetCommand(gpRmdInfo->sdSeqID, -1, MASNDDRV_CMD_PROGRAM_CHANGE, dCh, (UINT32)bBk, (UINT32)bPg));
}

/****************************************************************************
 *	SendModDepth(UINT32 dCh, UINT32 dMod)
 *
 *	Description
 *		Send SetModulation message
 *	Param
 *		dCh			...	#Channel(0..15)
 *		dMod		...	Modulation(0..127)
 *	Return
 *		0 : NoError, < 0 : Error
 ****************************************************************************/
static SINT32	SendModDepth(UINT32 dCh, UINT32 dMod)
{
	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
	};

	MARMDCNV_DBGMSG(("SendModDepth[%ld] = %ld\n", dCh, dMod));

	return (MaSndDrv_SetCommand(gpRmdInfo->sdSeqID, -1, MASNDDRV_CMD_MODULATION_DEPTH, dCh, (UINT32)bModTable[dMod], 0));
}


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

	gpRmdInfo->dChVolumeTable[dCh] = dVol;

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


/****************************************************************************
 *	SendExpression(UINT32 dCh, UINT32 dVol)
 *
 *	Description
 *		Send Expression message
 *	Param
 *		dCh			...	#Channel(0..15)
 *		dVol		...	Volume(0..127)
 *	Return
 *		0 : NoError, < 0 : Error
 ****************************************************************************/
static SINT32	SendExpression(UINT32 dCh, UINT32 dVol)
{
	UINT32	dMix;
	
	MARMDCNV_DBGMSG(("SendExpression[%ld] =  %ld\n", dCh, dVol));

	gpRmdInfo->dExpressionTable[dCh] = dVol;
	
	dMix = MaSndDrv_Mix40LogVol(dVol, gpRmdInfo->dMasterVolume);
	return (MaSndDrv_SetCommand(gpRmdInfo->sdSeqID, -1, MASNDDRV_CMD_EXPRESSION, dCh, dMix, 0));
}


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

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


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

	return (MaSndDrv_SetCommand(gpRmdInfo->sdSeqID, -1, MASNDDRV_CMD_HOLD1, dCh, (UINT32)((dVal < 64) ? 0 : 1), 0));
}


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

	dVal &= 0x7f;
	switch (gpRmdInfo->dRPNTable[dCh])
	{
	case 0:	/* BendSens */
		return (MaSndDrv_SetCommand(gpRmdInfo->sdSeqID, -1, MASNDDRV_CMD_BEND_RANGE, dCh, dVal, 0));

	case 1:	/* FineTune */
		gpRmdInfo->dFineTune[dCh] = dVal << 7;
		return (MaSndDrv_SetCommand(gpRmdInfo->sdSeqID, -1, MASNDDRV_CMD_FINE_TUNE, dCh, gpRmdInfo->dFineTune[dCh], 0));
		break;

	case 2:	/* CoaseTune */
		return (MaSndDrv_SetCommand(gpRmdInfo->sdSeqID, -1, MASNDDRV_CMD_COASE_TUNE, dCh, dVal, 0));
		break;
	}
	return (MASMW_SUCCESS);
}


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

	switch (gpRmdInfo->dRPNTable[dCh])
	{
	case 1:	/* FineTune */
		gpRmdInfo->dFineTune[dCh] &= 0x3F80;

⌨️ 快捷键说明

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