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

📄 marmdcnv.c

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


/*==============================================================================
//	Function Name	: SINT32	DataEntryMSB(UINT8 bCh, UINT8 bVal)
//
//	Description		: Send BendRange message
//
//	Argument		: bCh			...	#Channel(0..15)
//					  bVal			...	data(0..127)
//
//	Return			: 0 : NoError, < 0 : Error
==============================================================================*/
static SINT32	DataEntryMSB(UINT8 bCh, UINT8 bVal)
{
	MARMDCNV_DBGMSG(("DataEntryMSB[%d] = %d\n", bCh, bVal));

	if (gwRPN[bCh] != 0) return (MA3RMDERR_NOERROR);

	return (MaSndDrv_SetCommand(gSeqID, -1, MASNDDRV_CMD_BEND_RANGE, (UINT32)bCh, (UINT32)bVal, 0));
}


/*==============================================================================
//	Function Name	: SINT32	SendAllSoundOff(UINT8 bCh)
//
//	Description		: Send AllSoundOff message
//
//	Argument		: bCh			...	#Channel(0..15)
//
//	Return			: 0 : NoError, < 0 : Error
==============================================================================*/
static SINT32	SendAllSoundOff(UINT8 bCh)
{
	MARMDCNV_DBGMSG(("SendAllSoundOff[%d] \n", bCh));

	return (MaSndDrv_SetCommand(gSeqID, -1, MASNDDRV_CMD_ALL_SOUND_OFF, (UINT32)bCh, 0, 0));
}


/*==============================================================================
//	Function Name	: SINT32	SendAllNoteOff(UINT8 bCh)
//
//	Description		: Message AllNoteOff message
//
//	Argument		: bCh			...	#Channel(0..15)
//
//	Return			: 0 : NoError, < 0 : Error
==============================================================================*/
static SINT32	SendAllNoteOff(UINT8 bCh)
{
	MARMDCNV_DBGMSG(("SendAllNoteOff[%d] \n", bCh));

	return (MaSndDrv_SetCommand(gSeqID, -1, MASNDDRV_CMD_ALL_NOTE_OFF, (UINT32)bCh, 0, 0));
}


/*==============================================================================
//	Function Name	: SINT32	SendResetAllCtl(UINT8 bCh)
//
//	Description		: Send ResetAllControllers message
//
//	Argument		: bCh			...	#Channel(0..15)
//
//	Return			: 0 : NoError, < 0 : Error
==============================================================================*/
static SINT32	SendResetAllCtl(UINT8 bCh)
{
	MARMDCNV_DBGMSG(("SendResetAllCtl[%d] \n", bCh));

	gwRPN[bCh] = 0x7F7F;
	gbExpression[bCh] = 127;

	return (MaSndDrv_SetCommand(gSeqID, -1, MASNDDRV_CMD_RESET_ALL_CONTROLLERS, (UINT32)bCh, 0, 0));
}


/*==============================================================================
//	Function Name	: SINT32	SendMonoOn(UINT8 bCh, UINT8 bVal)
//
//	Description		: Send MonoOn message
//
//	Argument		: bCh			...	#Channel(0..15)
//
//	Return			: 0 : NoError, < 0 : Error
==============================================================================*/
static SINT32	SendMonoOn(UINT8 bCh, UINT8 bVal)
{
	MARMDCNV_DBGMSG(("SendMonoOn[%d] \n", bCh));

	if (bVal != 1) return (MA3RMDERR_NOERROR);

	return (MaSndDrv_SetCommand(gSeqID, -1, MASNDDRV_CMD_MONO_MODE_ON, (UINT32)bCh, 0, 0));
}


/*==============================================================================
//	Function Name	: SINT32	SendPolyOn(UINT8 bCh, UINT8 bVal)
//
//	Description		: Send PolyOn message
//
//	Argument		: bCh			...	#Channel(0..15)
//
//	Return			: 0 : NoError, < 0 : Error
==============================================================================*/
static SINT32	SendPolyOn(UINT8 bCh, UINT8 bVal)
{
	MARMDCNV_DBGMSG(("SendPolyOn[%d] \n", bCh));

	if (bVal != 0) return (MA3RMDERR_NOERROR);

	return (MaSndDrv_SetCommand(gSeqID, -1, MASNDDRV_CMD_POLY_MODE_ON, (UINT32)bCh, 0, 0));
}


/*==============================================================================
//	Function Name	: SINT32	SendControl(UINT8 bCh, UNIT8 bMsg2, UINT8 bMsg3)
//
//	Description		: Control messages
//
//	Argument		: bCh			...	#Channel(0..15)
//					  bMsg2			...	Param-1
//					  bMsg3			...	Param-2
//
//	Return			: 0 : NoError, < 0 : Error
==============================================================================*/
static SINT32	SendControl(UINT8 bCh, UINT8 bMsg2, UINT8 bMsg3)
{
	MARMDCNV_DBGMSG(("SendControl[%d, %d, %d] \n", bCh, bMsg2, bMsg3));

	switch (bMsg2)
	{
	case 0x00:	/* Bank select(MSB) */
		gwBank[bCh] = (UINT16)((gwBank[bCh] & 0x00FF) | ((UINT16)bMsg3 << 8));
		break;
    
    case 0x20:	/* Bank select (LSB) */
		gwBank[bCh] = (UINT16)((gwBank[bCh] & 0xFF00) | ((UINT16)bMsg3));
		break;

	case 0x01:
		return (SendModDepth(bCh, bMsg3));

	case 0x06:
		return (DataEntryMSB(bCh, bMsg3));

	case 0x07:
		return (SendChVol(bCh, bMsg3));

	case 0x0A:
		return (SendPanpot(bCh, bMsg3));

	case 0x0B:
		return (SendExpression(bCh, bMsg3));

	case 0x40:
		return (SendHold1(bCh, bMsg3));

	case 0x62:	/* NRPN (LSB) */
	case 0x63:	/* NRPN (MSB) */
		gwRPN[bCh] |= 0x8000;
		break;

	case 0x64:	/* RPN (LSB) */
		gwRPN[bCh] = (UINT16)((gwRPN[bCh] & 0x7F00) | ((UINT16)bMsg3));
		break;

	case 0x65:	/* RPN (MSB) */
		gwRPN[bCh] = (UINT16)((gwRPN[bCh] & 0x007F) | ((UINT16)bMsg3 << 8));
		break;

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

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

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

	case 0x7e:
		SendAllNoteOff(bCh);
		return (SendMonoOn(bCh,bMsg3));
		
	case 0x7f:
		SendAllNoteOff(bCh);
		return (SendPolyOn(bCh, bMsg3));

	default:
		return (MA3RMDERR_NOERROR);
	}
	return (MA3RMDERR_NOERROR);
}


/*==============================================================================
//	Function Name	: SINT32	SendPitchBend(UINT8 bCh, UNIT8 bLl, UINT8 bHh)
//
//	Description		: Send PitchBend message
//
//	Argument		: bCh				...	#Channel(0..15)
//					  bLl				...	Lower 7bit of PitchBend (0..127)
//					  bHh				...	Upper 7bit of PitchBend (0..127)
//
//	Return			: 0 : NoError, < 0 : Error
==============================================================================*/
static SINT32	SendPitchBend(UINT8 bCh, UINT8 bLl, UINT8 bHh)
{
	MARMDCNV_DBGMSG(("SendPitchBend[%d] = %d\n", bCh, bHh));

	return (MaSndDrv_SetCommand(gSeqID, -1, MASNDDRV_CMD_PITCH_BEND, (UINT32)bCh, (((UINT32)bHh << 7) | ((UINT32)bLl)), 0));
}


/*==============================================================================
//	Function Name	: SINT32	SendGmOn(void)
//
//	Description		: Send GM_ON message
//
//	Argument		: none
//
//	Return			: 0:NoError丂 <0:僄儔乕僐乕僪
//
==============================================================================*/
static SINT32	SendGmOn(void)
{
	UINT8	bCh;
	
	MARMDCNV_DBGMSG(("SendGmOn\n"));

	gbMaxGain = MAX_MID_GAIN;
	gbMasterVolume = 127;
	for (bCh = 0; bCh < 16; bCh++)
	{
		SendAllSoundOff(bCh);
		gwRPN[bCh] = 0x7f7f;
		gwBank[bCh] = (bCh == 9) ? 0x7800 : 0x7900;
		gbChVolume[bCh] = 100;
		gbExpression[bCh] = 127;
	}

	return (MaSndDrv_SetCommand(gSeqID, -1, MASNDDRV_CMD_SYSTEM_ON, 0, 0, 0));
}


/*=============================================================================
//	Function Name	: SINT32	MaRmdCnv_Initialize(void)
//
//	Description		: Initialize RealtimeMIDI converter
//
//	Argument		: none
//
//	Return			: 0 : NoError, < 0 : Error
=============================================================================*/
SINT32	MaRmdCnv_Initialize(void)
{
	UINT8	i;

	MARMDCNV_DBGMSG(("MaRmdCnv_Initialize \n"));

	gSeqID = -1;						/* Sequence ID      */
	gFileID = -1;						/* File ID          */
	gEnable = 0;						/* 0:disabel        */
	gNumOfLoaded = 0;					/*                  */

	gbMaxGain = MAX_MID_GAIN;			/* MAX_MID_GAIN[dB] */
	gbMasterVolume = 127;

	gRamBase = 0;
	gRamOffset = 0;
	gRamSize = 0;

	for (i = 0; i < 128 ; i++) gWtWaveAdr[i] = 0;

	return (MA3RMDERR_NOERROR);
}


/*=============================================================================
//	Function Name	:	SINT32	MaRmdCnv_End(void)
//
//	Description		:	Ending of RealtimeMIDI converter
//
//	Argument		:	none
//
//	Return			: 0 : NoError, < 0 : Error
=============================================================================*/
SINT32	MaRmdCnv_End(void)
{
	MARMDCNV_DBGMSG(("MaRmdCnv_End \n"));

	return (MA3RMDERR_NOERROR);
}


/*=============================================================================
//	Function Name	: SINT32	MaRmdCnv_Load(UINT8* file_ptr, UINT32 file_size, UINT8 mode,
//												SINT32 (*func)(UINT8 id), void* ext_args)
//
//	Description		: Load MIDI settings
//
//	Argument		: file_ptr	... pointer to the data
//					  file_size	... size fo the data
//					  mode		... error check (0:No, 1:Yes, 2:Check)
//					  func		... pointer of rhe callback function
//					  ext_args	... NULL
//
//	Return			: 0 : NoError, < 0 : Error
=============================================================================*/
SINT32	MaRmdCnv_Load(UINT8* file_ptr, UINT32 file_size, UINT8 mode, SINT32 (*func)(UINT8 id), void* ext_args)
{
	(void)file_ptr;
	(void)file_size;
	(void)ext_args;

	MARMDCNV_DBGMSG(("MaRmdCnv_Load[%08lX %08lX %02X] \n", file_ptr, file_size, mode));

	if (mode > 1) return (MA3RMDERR_NOERROR);
	if (gNumOfLoaded > 0) return (MA3RMDERR_GENERAL);
	gNumOfLoaded++;
	gCallbackFunc = func;
	gFileID = gNumOfLoaded;
	gbIntervalTime = 0;
	
	return ((SINT32)gFileID);
}


/*=============================================================================
//	Function Name	: SINT32	MaRmdCnv_Unload(SINT32 file_id, void* ext_args)
//
//	Description		: Unload MIDI settings
//
//	Argument		: file_id		...	僨乕僞file ID
//					  ext_args		...	NULL
//
//	Return			: 0 : NoError, < 0 : Error
=============================================================================*/
SINT32	MaRmdCnv_Unload(SINT32 file_id, void* ext_args)
{
	(void)ext_args;

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

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

	gNumOfLoaded = 0;
	gFileID = -1;

	return (MA3RMDERR_NOERROR);
}


/*=============================================================================
//	Function Name	: MaRmdCnv_Open(SINT32 file_id, UINT16 mode, void* ext_args)
//
//	Description		: Enable MIDI
//
//	Argument		: file_id		...	file ID
//					  mode			...	0..16
//					  ext_args		...	NULL
//
//	Return			: 0 : NoError, < 0 : Error
=============================================================================*/
SINT32	MaRmdCnv_Open(SINT32 file_id, UINT16 mode, void* ext_args)
{
	UINT32	Ram;
	UINT32	Size;
	(void)mode;
	(void)ext_args;
	
	MARMDCNV_DBGMSG(("MaRmdCnv_Open[%d] \n", file_id));

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

	gSeqID = MaSndDrv_Create(
			(UINT8)MASMW_SEQTYPE_DIRECT,
			gbIntervalTime,							/* No Timer             */
			(UINT8)(DRUM_GML1 +						/*                      */
			        DRUM_NORMAL +					/*                      */
			        MELODY_NORMAL +					/*                      */
			        DVA_SIMPLE +					/*                      */
			        RMD_DEF_FM_MODE),				/*                      */
			(UINT8)0,								/*                      */
			(UINT8)0,								/* Num of Streams       */
			MaRmdCnv_Convert,						/*                      */
			&Ram,									/*                      */
			&Size);									/*                      */

	MARMDCNV_DBGMSG(("MaRmdCnv_Open/SeqID=%ld \n", gSeqID));
	if (gSeqID < 0) return (MA3RMDERR_GENERAL);

	gRamBase = Ram;
	gRamSize = Size;
	gbMaxGain = MAX_MID_GAIN;
	gbMasterVolume = 127;
	gEnable = 1;

	SendMasterVolume(gbMaxGain);

	return (SendGmOn());
}


/*=============================================================================
//	Function Name	: SINT32	MaRmdCnv_Close(SINT32 file_id, void* ext_args)
//
//	Description		: Disable MIDI
//
//	Argument		: file_id		...	file ID
//					  ext_args		...	NULL
//
//	Return			: 0 : NoError, < 0 : Error
=============================================================================*/
SINT32	MaRmdCnv_Close(SINT32 file_id, void* ext_args)
{
	UINT8	ch;
	(void)ext_args;

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

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

	for (ch = 0; ch < 15; ch++)
	{
		MaSndDrv_SetCommand(gSeqID, -1, MASNDDRV_CMD_ALL_SOUND_OFF, ch, 0, 0);
	}

	MaSndDrv_Free(gSeqID);

⌨️ 快捷键说明

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