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

📄 marmdcnv.c

📁 是一个手机功能的模拟程序
💻 C
📖 第 1 页 / 共 3 页
字号:
/*==============================================================================
//	Copyright (C) 2001-2003 YAMAHA CORPORATION
//
//	Title		: MARMDCNV.C
//
//	Description	: MA-3 Realtime MIDI/GML Stream Converter Module.
//
//	Version		: 1.5.2.0
//
//	History		:
//				  May 8, 2001			1st try.
//				  July 16, 2001			Fix warnings.
//				  July 18, 2001			Add #BankMSB = 0x78/0x79.
//				  July 24, 2001			Fix MidVolTable.
//				  July 31, 2001			Change MonoModeOn message.
//				  September 18, 2001	Set MAX_MID_GAIN = -9[dB].
//				  Nobember 2, 2001		Change NoteOn(vel=0) => NoteOff().
//				  May 15, 2002			Add MasterVolume(Universal SysEx).
//============================================================================*/
#include "marmdcnv.h"

#define	MAX_MID_GAIN		76				/* - 9[dB] : 76             */
											/* -12[dB] : 64             */
											/* -18[dB] : 45             */

#define RMD_INTERVAL_CB		17

#define	DVA_NORMAL			0
#define	DVA_SIMPLE			2
#define	DVA_MONO			4
#define	DRUM_NORMAL			0
#define	DRUM_SIMPLE			1
#define	MELODY_NORMAL		0
#define	MELODY_SIMPLE		8
#define DRUM_GML1			0x20
#define ENC_8BIT			0
#define ENC_7BIT			1

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

/*=============================================================================
//	gloval values
=============================================================================*/

static const UINT32	gdwDBVolTable[128] =	/* -80 * Log(index/127) */
{
	 192, 168, 144, 130, 120, 112, 106, 101,
	  96,  92,  88,  85,  82,  79,  77,  74,
	  72,  70,  68,  66,  64,  63,  61,  59,
	  58,  56,  55,  54,  53,  51,  50,  49,
	  48,  47,  46,  45,  44,  43,  42,  41,
	  40,  39,  38,  38,  37,  36,  35,  35,
	  34,  33,  32,  32,  31,  30,  30,  29,
	  28,  28,  27,  27,  26,  25,  25,  24,
	  24,  23,  23,  22,  22,  21,  21,  20,
	  20,  19,  19,  18,  18,  17,  17,  16,
	  16,  16,  15,  15,  14,  14,  14,  13,
	  13,  12,  12,  12,  11,  11,  10,  10,
	  10,   9,   9,   9,   8,   8,   8,   7,
	   7,   7,   6,   6,   6,   5,   5,   5,
	   4,   4,   4,   3,   3,   3,   3,   2,
	   2,   2,   1,   1,   1,   1,   0,   0
};

static const UINT32	gdwMidVolTable[193] =	/* 127*10^(index / 80) */
{
	 127,  123,  120,  116,  113,  110,  107,  104,
	 101,   98,   95,   93,   90,   87,   85,   82,
	  80,   78,   76,   74,   71,   69,   67,   66,
	  64,   62,   60,   58,   57,   55,   54,   52,
	  51,   49,   48,   46,   45,   44,   43,   41,
	  40,   39,   38,   37,   36,   35,   34,   33,
	  32,   31,   30,   29,   28,   28,   27,   26,
	  25,   25,   24,   23,   23,   22,   21,   21,
	  20,   20,   19,   18,   18,   17,   17,   16,
	  16,   16,   15,   15,   14,   14,   13,   13,
	  13,   12,   12,   12,   11,   11,   11,   10,
	  10,   10,   10,    9,    9,    9,    8,    8,
	   8,    8,    8,    7,    7,    7,    7,    7,
	   6,    6,    6,    6,    6,    6,    5,    5,
	   5,    5,    5,    5,    5,    4,    4,    4,
	   4,    4,    4,    4,    4,    3,    3,    3,
	   3,    3,    3,    3,    3,    3,    3,    3,
	   3,    2,    2,    2,    2,    2,    2,    2,
	   2,    2,    2,    2,    2,    2,    2,    2,
	   2,    2,    2,    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,    1,    1,    1,    1,    1,    1,
	   0
};

static 	SINT32 (*gCallbackFunc)(UINT8 id);			/*              */

static SINT32		gSeqID;							/* Sequence ID  */
static SINT32		gFileID;						/* File ID      */
static UINT8		gEnable;						/* 0:disabel    */
static UINT8		gNumOfLoaded;					/*              */

static UINT8		gbMaxGain;						/* MaxGain      */
static UINT8		gbMasterVolume;					/* MasterVolume */

static UINT32		gRamBase;						/* */
static UINT32		gRamOffset;						/* */
static UINT32		gRamSize;						/* */

static UINT32		gWtWaveAdr[128];				/* */   

static UINT16		gwBank[16];
static UINT16		gwRPN[16];
static UINT8		gbExpression[16];
static UINT8		gbChVolume[16];					/* */
static UINT8		gbIntervalTime;					/* 0 or 20[ms]  */


/*=============================================================================
//	Function Name	: SINT32	SendMasterVolume(UINT8 bVol)
//
//	Description		: Send SetMasterVolume message
//
//	Argument		: bVol	Master volume (0..127)
//
//	Return			: 0 : NoError, < 0 : Error
=============================================================================*/
static SINT32	SendMasterVolume(UINT8 bVol)
{
	if (gSeqID > 0)
	{
		MaSndDrv_SetCommand(gSeqID, -1, MASNDDRV_CMD_MASTER_VOLUME, (UINT32)bVol, 0, 0);
	}
	return (MA3RMDERR_NOERROR);
}


/*==============================================================================
//	Function Name	: SINT32	ErrorFunction(UINT8 bCh, UINT8 bPara1, UINT8 bPara2)
//
//	Description		: Invalid messages
//
//	Argument		: bCh		MIDI channel (0..15)
//					  bPara1	Undefined
//					  bPara1	Undefined
//
//	Return			: 0 : NoError, < 0 : Error
//
==============================================================================*/
static SINT32	ErrorFunction(UINT8 bCh, UINT8 bPara1, UINT8 bPara2)
{
	(void)bCh;
	(void)bPara1;
	(void)bPara2;

	MARMDCNV_DBGMSG(("ErrorFunction\n"));

	return (MA3RMDERR_ARGUMENT);
}


/*==============================================================================
//	Function Name	:	SINT32	NotSupported(UINT8 bCh, UINT8 bPara1, UINT8 bPara2)
//
//	Description		:	Unsupported messages
//
//	Argument		: bCh		MIDI channel (0..15)
//					  bPara1	Undefined
//					  bPara1	Undefined
//
//	Return			: 0 : NoError, < 0 : Error
==============================================================================*/
static SINT32	NotSupported(UINT8 bCh, UINT8 bPara1, UINT8 bPara2)
{
	(void)bCh;
	(void)bPara1;
	(void)bPara2;

	MARMDCNV_DBGMSG(("NotSupported\n"));

	return (MA3RMDERR_NOERROR);
}


/*==============================================================================
//	Function Name	: SINT32	SendNoteOff(UINT8 bCh, UNIT8 bKey, UINT8 bVel)
//
//	Description		: Send NoteOff message
//
//	Argument		: bCh			...	#Channel(0..15)
//					  bKey			...	#Key (0..127)
//					  bVel			...	Velocity (0..127)
//
//	Return			: 0 : NoError, < 0 : Error
==============================================================================*/
static SINT32	SendNoteOff(UINT8 bCh, UINT8 bKey, UINT8 bVel)
{
	(void)bVel;

	MARMDCNV_DBGMSG(("SendNoteOff[%d, %d] \n", bCh, bKey));

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


/*==============================================================================
//	Function Name	: SINT32	SendNoteOn(UINT8 bCh, UINT8 bKey, UINT8 bVel)
//
//	Description		: Send NoteOn message
//
//	Argument		: bCh			...	#Channel(0..15)
//					  bKey			...	#Key (0..127)
//					  bVel			...	Velocity (0..127)
//
//	Return			: 0 : NoError, < 0 : Error
==============================================================================*/
static SINT32	SendNoteOn(UINT8 bCh, UINT8 bKey, UINT8 bVel)
{
#if !RMD_DEF_VELOCITY_MODE
	static const UINT8	VelocityTable[128] = 
	{
		  0,    0,   16,   20,   23,   25,   28,   30,
		 32,   34,   36,   38,   39,   40,   43,   44,
		 45,   46,   48,   49,   51,   52,   54,   54,
		 55,   57,   57,   58,   60,   60,   62,   64,
		 64,   66,   66,   67,   67,   69,   69,   69,
		 71,   71,   74,   74,   76,   76,   76,   78,
		 78,   78,   80,   80,   80,   82,   82,   82,
		 85,   85,   85,   87,   87,   87,   90,   90,
		 90,   90,   93,   93,   93,   93,   95,   95,
		 95,   95,   98,   98,   98,   98,  101,  101,
		101,  101,  101,  104,  104,  104,  104,  104,
		107,  107,  107,  107,  107,  110,  110,  110,
		110,  110,  110,  113,  113,  113,  113,  113,
		116,  116,  116,  116,  116,  116,  120,  120,
		120,  120,  120,  120,  120,  123,  123,  123,
		123,  123,  123,  123,  127,  127,  127,  127
	};
#endif

	if (bVel == 0) return(SendNoteOff(bCh, bKey, bVel));

	MARMDCNV_DBGMSG(("SendNoteOn[%d, %d, %d]\n", bCh, bKey, bVel));

#if RMD_DEF_VELOCITY_MODE
	return (MaSndDrv_SetCommand(gSeqID, -1, MASNDDRV_CMD_NOTE_ON, (UINT32)bCh, (UINT32)bKey, (UINT32)bVel));
#else
	return (MaSndDrv_SetCommand(gSeqID, -1, MASNDDRV_CMD_NOTE_ON, (UINT32)bCh, (UINT32)bKey, (UINT32)VelocityTable[bVel & 0x7f]));
#endif
}


/*==============================================================================
//	Function Name	: SINT32	SendProgram(UINT8 bCh, UNIT8 bProg, UINT8 bPara2)
//
//	Description		: Send SetProgram message
//
//	Argument		: bCh			...	#Channel(0..15)
//					  bProg			...	#Program(0..127)
//
//	Return			: 0 : NoError, < 0 : Error
==============================================================================*/
static SINT32	SendProgram(UINT8 bCh, UINT8 bProg, UINT8 bPara2)
{
	UINT8	bBk, bPg;
	UINT16	wBb;
	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)bPara2;
	
	MARMDCNV_DBGMSG(("SendProgram[%d] = %d\n", bCh, bProg));

	bPp = (UINT8)(bProg & 0x7f);
	wBb = gwBank[bCh];
	
	if (wBb == 0)
	{
		if (bCh == 9)
		{
			bBk = 128;
			bPg = 0;
		} else {
			bBk = 0;
			bPg = bPp;
		}
	} else {
		switch (wBb & 0xFF00)
		{
		case 0x7900:	/* Melody */
			bBk = 0;
			bPg = bPp;
			break;

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

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

		case 0x7D00:	/* Drum */
			bBk = (UINT8)(128 + bMBank[bPp]);
			bPg = 0;
			break;

		default:
			return (MA3RMDERR_ARGUMENT);
		}
	}
	return (MaSndDrv_SetCommand(gSeqID, -1, MASNDDRV_CMD_PROGRAM_CHANGE, (UINT32)bCh, (UINT32)bBk, (UINT32)bPg));
}

/*==============================================================================
//	Function Name	: SINT32	SendModDepth(UINT8 bCh, UINT8 bMod)
//
//	Description		: Send SetModulation message
//
//	Argument		: bCh			...	#Channel(0..15)
//					  bMod			...	Modulation(0..127)
//
//	Return			: 0 : NoError, < 0 : Error
==============================================================================*/
static SINT32	SendModDepth(UINT8 bCh, UINT8 bMod)
{
	static const UINT8	ModTable[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[%d] = %d\n", bCh, bMod));

	return (MaSndDrv_SetCommand(gSeqID, -1, MASNDDRV_CMD_MODULATION_DEPTH, (UINT32)bCh, (UINT32)ModTable[bMod], 0));
}


/*==============================================================================
//	Function Name	: SINT32	SendChVol(UINT8 bCh, UINT8 bVol)
//
//	Description		: Send ChannelVolume nessage
//
//	Argument		: bCh			...	#Channel(0..15)
//					  bVol			...	Volume(0..127)
//
//	Return			: 0 : NoError, < 0 : Error
==============================================================================*/
static SINT32	SendChVol(UINT8 bCh, UINT8 bVol)
{
	MARMDCNV_DBGMSG(("SendChVol[%d] =  %d\n", bCh, bVol));

	gbChVolume[bCh] = bVol;

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


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

	gbExpression[bCh] = bVol;
	
	dwVol = gdwDBVolTable[bVol & 0x7f] + gdwDBVolTable[gbMasterVolume];
	if (dwVol > 192) dwVol = 192;
	dwVol = gdwMidVolTable[dwVol];

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


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

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


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

	return (MaSndDrv_SetCommand(gSeqID, -1, MASNDDRV_CMD_HOLD1, (UINT32)bCh, (UINT32)((bVal < 64) ? 0 : 1), 0));
}

⌨️ 快捷键说明

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