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

📄 masnddrv.c

📁 是一个手机功能的模拟程序
💻 C
📖 第 1 页 / 共 5 页
字号:
/****************************************************************************
 *
 *		Copyright (C) 2002-2003	YAMAHA CORPORATION. All rights reserved.
 *
 *		Module		: masnddrv.c
 *
 *		Description	: MA Sound Driver
 *
 *		Version		: 2.7.13 	2003.08.22
 *
 ****************************************************************************/

#include "mamachdep.h"
#include "madefs.h"
#include "masnddrv.h"
#include "matable.h"
#if MASMW_SRMCNV_HVS
#include "mahvdrv.h"
#endif
#include "masnddva.h"
#include "maresmgr.h"
#include "masndseq.h"
#include "madevdrv.h"


/*--------------------------------------------------------------------------*/
/* macro definitions                                                        */
/*--------------------------------------------------------------------------*/

#define MAKE_TIMER_PART(num, delta_time)							\
{																	\
	if ( delta_time >= 0 )											\
	{																\
		pbPacketBuf[num++] = (UINT8)( 0x80 );						\
	}																\
}

#define MAKE_ADDRESS_PART(num, reg_index)							\
{																	\
	pbPacketBuf[num++] = (UINT8)(  reg_index       & 0x7F );		\
	pbPacketBuf[num++] = (UINT8)( (reg_index >> 7) | 0x80 );		\
}

#define MAKE_KEY_ON(num, voice_id, vo_volume, pitch, ch, mtr, led)	\
{																	\
	pbPacketBuf[num++] = (UINT8)( (voice_id >> 7)  & 0x7F );		\
	pbPacketBuf[num++] = (UINT8)(  voice_id        & 0x7F );		\
	pbPacketBuf[num++] = (UINT8)( (vo_volume       & 0x7C)			\
							   | ((mtr << 1)       & 0x02)			\
							   | ( led             & 0x01));		\
	pbPacketBuf[num++] = (UINT8)( (pitch >> 7)     & 0x7F );		\
	pbPacketBuf[num++] = (UINT8)(  pitch           & 0x7F );		\
	pbPacketBuf[num++] = (UINT8)( (0x40 + ch)      | 0x80 );		\
}

#define MAKE_KEY_OFF(num, ch)										\
{																	\
	pbPacketBuf[num++] = (UINT8)(  ch              | 0x80 );		\
}

#define MAKE_VEL_PITCH(num, vo_volume, pitch, mtr, led)						\
{																	\
	pbPacketBuf[num++] = (UINT8)( (vo_volume       & 0x7C)		\
							   | ((mtr << 1)       & 0x02)			\
							   | ( led             & 0x01));		\
	pbPacketBuf[num++] = (UINT8)( (pitch >> 7)     & 0x7F );		\
	pbPacketBuf[num++] = (UINT8)(  pitch           | 0x80 );		\
}

#define MAKE_PITCH(num, pitch)										\
{																	\
	pbPacketBuf[num++] = (UINT8)( (pitch >> 7)     & 0x7F );		\
	pbPacketBuf[num++] = (UINT8)(  pitch           | 0x80 );		\
}

#define MAKE_MUTE(num, ch)											\
{																	\
	pbPacketBuf[num++] = (UINT8)( (0x20 + ch)  	   | 0x80 );		\
}

#define MAKE_RST(num, ch)											\
{																	\
	pbPacketBuf[num++] = (UINT8)( (0x10 + ch)  	   | 0x80 );		\
}

#define MAKE_RST_MUTE(num, ch)										\
{																	\
	pbPacketBuf[num++] = (UINT8)( (0x30 + ch)  	   | 0x80 );		\
}

#define MAKE_CHANNEL_VOLUME(num, volume, interp)					\
{																	\
	pbPacketBuf[num++] = (UINT8)( (volume & 0x7C)					\
								| (interp & 0x01)  | 0x80 );		\
}

#define MAKE_PANPOT(num, pan, interp)								\
{																	\
	pbPacketBuf[num++] = (UINT8)( (pan & 0x7C)						\
								| (interp & 0x01)  | 0x80 );		\
}

#define MAKE_SFX(num, sfx)											\
{																	\
	pbPacketBuf[num++] = (UINT8)(  sfx             | 0x80 );		\
}

#define MAKE_STREAM_ON(num, ram_adrs, vo_volume, pitch, ch, mtr, led)	\
{																	\
	pbPacketBuf[num++] = (UINT8)( (ram_adrs >> 7)  & 0x7F );		\
	pbPacketBuf[num++] = (UINT8)(  ram_adrs        & 0x7F );		\
	pbPacketBuf[num++] = (UINT8)( (vo_volume       & 0x7C)			\
								| ((mtr << 1)      & 0x02)			\
								| ( led            & 0x01));		\
	pbPacketBuf[num++] = (UINT8)( (pitch >> 7)     & 0x7F );		\
	pbPacketBuf[num++] = (UINT8)( (pitch & 0x7F)   | 0x80 );		\
}

#define MAKE_STREAM_OFF(num, ch)	\
{																	\
	pbPacketBuf[num++] = (UINT8)(  ch | 0x30       | 0x80 );		\
}

#define MAKE_SOFTINT_RAM(num, ram_val)								\
{																	\
	pbPacketBuf[num++] = (UINT8)(  ram_val         | 0x80 );		\
}

#define MAKE_SOFTINT(num, int_val)									\
{																	\
	pbPacketBuf[num++] = (UINT8)(  int_val         | 0x80 );		\
}

#define MAKE_LED(num, led)											\
{																	\
	pbPacketBuf[num++] = (UINT8)(  led             | 0x80 );		\
}

#define MAKE_MOTOR(num, mtr)										\
{																	\
	pbPacketBuf[num++] = (UINT8)(  mtr             | 0x80 );		\
}

#define MAKE_PITCH_BEND(num, bend)									\
{																	\
	pbPacketBuf[num++] = (UINT8)( (bend >> 7)      & 0x7F );		\
	pbPacketBuf[num++] = (UINT8)(  bend            | 0x80 );		\
}

#define MAKE_NOP(num, reg_index)									\
{																	\
	pbPacketBuf[num++] = (UINT8)(  reg_index       & 0x7F );		\
	pbPacketBuf[num++] = (UINT8)( (reg_index >> 7) | 0x80 );		\
	pbPacketBuf[num++] = (UINT8)(  0x00            | 0x80 );		\
}

#define MAKE_FCOFFSET(num, lfo_rst, fc_offset)						\
{																	\
	pbPacketBuf[num++] = (UINT8)( (lfo_rst         & 0x40 )			\
								| ((fc_offset >> 7) & 0x3F ));		\
	pbPacketBuf[num++] = (UINT8)( fc_offset       | 0x80 );			\
}

#define MAKE_LPFQ(num, lpfq)										\
{																	\
	pbPacketBuf[num++] = (UINT8)(  lpfq            | 0x80 );		\
}

#define MAKE_LPFFC3(num, lpfcof)									\
{																	\
	pbPacketBuf[num++] = (UINT8)( (lpfcof >> 7)    & 0x3F );		\
	pbPacketBuf[num++] = (UINT8)( (lpfcof & 0x7F)  | 0x80 );		\
}

#define MAKE_LPFCLR_OFF(num)										\
{																	\
	pbPacketBuf[num++] = (UINT8)( 0xC0 );							\
}

#define MAKE_FIX_DISABLE(num)										\
{																	\
	pbPacketBuf[num++] = (UINT8)( 0x00 );							\
	pbPacketBuf[num++] = (UINT8)( 0x00 );							\
	pbPacketBuf[num++] = (UINT8)( 0x00 );							\
	pbPacketBuf[num++] = (UINT8)( 0x00 );							\
	pbPacketBuf[num++] = (UINT8)( 0x00 );							\
	pbPacketBuf[num++] = (UINT8)( 0x00 );							\
	pbPacketBuf[num++] = (UINT8)( 0x00 );							\
	pbPacketBuf[num++] = (UINT8)( 0x80 );							\
}


/*--------------------------------------------------------------------------*/
/*   Definitions                                                            */
/*--------------------------------------------------------------------------*/

#define MASNDDRV_DEFAULT_MASTER_VOLUME	(100)
#define MASNDDRV_DEFAULT_API_VOLUME		(100)
#define MASNDDRV_DEFAULT_API_BALANCE	(127)
#define MASNDDRV_MAI_EXT_CTRL			(0xBC)
#define MASNDDRV_DEFAULT_HV_CH_VOLUME	(100)

/* control sequener status */
#define MASNDDRV_STATUS_IDLE		(0)
#define MASNDDRV_STATUS_REGISTERED	(1)
#define MASNDDRV_STATUS_PLAYING		(2)
#define MASNDDRV_STATUS_WAITING		(3)

/* for device control */
#define MASNDDRV_LED_MODE_OFF		(0)
#define MASNDDRV_LED_MODE_DIRECT	(1)
#define MASNDDRV_LED_MODE_SYNC		(2)
#define MASNDDRV_MTR_MODE_OFF		(0)
#define MASNDDRV_MTR_MODE_DIRECT	(1)
#define MASNDDRV_MTR_MODE_SYNC		(2)
#define MASNDDRV_LED_SYNC			(1)
#define	MASNDDRV_MTR_SYNC			(2)
#define	MASNDDRV_NUM_DEVICETYPE		(3)
#define	MASNDDRV_NUM_BANK3			(38)

#define MASNDDRV_RESMODE1_NORMAL	(0)
#define MASNDDRV_RESMODE1_MA2		(1)
#define MASNDDRV_RESMODE1_MA3		(2)
#define MASNDDRV_RESMODE2_NORMAL	(0)
#define MASNDDRV_RESMODE2_MA5MONO	(1)
#define MASNDDRV_WTVOL_MODE_MA3		(0)
#define MASNDDRV_WTVOL_MODE_NORMAL	(1)

#define MASNDDRV_DIRECT_TIMERCOUNT	(20)
#define MASNDDRV_HV_TIMERCOUNT		(20)

#define MASNDDRV_FM_VOICE			(1)
#define MASNDDRV_WT_VOICE			(2)
#define MASNDDRV_ST_VOICE			(3)
#define MASNDDRV_AL_VOICE			(4)

#define MASNDDRV_FM_SLOT			(0)
#define MASNDDRV_WT_SLOT			(1)
#define MASNDDRV_ST_SLOT			(2)

#define MASNDDRV_MODE_MONO			(0)
#define MASNDDRV_MODE_POLY			(1)

/* timer */
/* 2.85742 * 7 [ms] */
#define MASNDDRV_TIMER_MST			(0x4D)
#define MASNDDRV_TIMER_COUNT		(7)

/* slot */
#define MASNDDRV_NUM_SLOT			(MA_MAX_FM_SLOT+MA_MAX_WT_SLOT+MA_MAX_STREAM_AUDIO)
#define MASNDDRV_MAX_FM_SLOT		(15)
#define MASNDDRV_MAX_FM_EXT_SLOT	(31)
#define MASNDDRV_MIN_WT_SLOT		(32)
#define MASNDDRV_MAX_WT_SLOT		(47)
#define MASNDDRV_MAX_WT_EXT_SLOT	(63)
#define MASNDDRV_MIN_STM_SLOT		(64)
#define MASNDDRV_MAX_STM_SLOT		(65)
#define MASNDDRV_MASK_FM_SLOT		(0x1F)
#define MASNDDRV_MASK_WT_SLOT		(0x1F)

/* create parameter */
#define MASNDDRV_MAX_CNVMODE		(0x7F)		/* maximum value of cnv_mode */
#define MASNDDRV_MAX_RESMODE		(5)			/* maximum value of res_mode */

/* voice */
#define MASNDDRV_MAX_REG_VOICE		(128)
#define MASNDDRV_MAX_RAM_BANK		(16)
#define MASNDDRV_NUM_VOICEINFO		(2)			/* number of voice information */

#define MASNDDRV_NUM_SETBANK		(16)
#define MASNDDRV_NUM_ALVOICE		(16)
#define MASNDDRV_MASK_ALVOICE		(0xF)
#define MASNDDRV_MASK_ALFLAG		(0x80)
#define MASNDDRV_MASK_ALNOISE		(0x02)

/* stream */
#define MASNDDRV_STMADPCM_ENDPOINT			(0x07C0)	/* steram audio ADPCM end point */
#define MASNDDRV_STMADPCM_ST_ENDPOINT		(0x03E0)	/* stream audio ADPCM stereo end point */
#define MASNDDRV_STMPCM_ENDPOINT			(0x03DF)	/* stream audio PCM end point */
#define MASNDDRV_STMPCM_ST_ENDPOINT			(0x01EF)	/* stream audio PCM stereo end point */
#define MASNDDRV_STM16PCM_ENDPOINT			(0x01EF)	/* stream audio 16bit PCM end point */
#define MASNDDRV_STM16PCM_ST_ENDPOINT		(0x00F7)	/* stream audio 16bit PCM stereo end point */

#define MASNDDRV_MAX_DB						(192)
#define MASNDDRV_FS 						(48000)
#define MASNDDRV_MIN_GML1_DRUM				(35)		/* minimum number of GM Level1 drum */
#define MASNDDRV_MAX_GML1_DRUM				(81)		/* maximum number of GM Level1 drum */

/*--- for DVA ---*/
#define MASNDDRV_MASK_MODE		(0xC0)

/*--- for HV ---*/
#define MASNDDRV_NUM_HVTYPE						(2)
#define MASNDDRV_HV_NOTE_ON						(0)
#define MASNDDRV_HV_NOTE_OFF					(1)
#define MASNDDRV_HV_SET_VOICE					(2)
#define MASNDDRV_HV_PROGRAM_CHANGE				(3)
#define MASNDDRV_HV_PITCH_BEND					(4)
#define MASNDDRV_HV_PITCH_BEND_SENS				(5)
#define MASNDDRV_HV_PROSODIC_PITCH_BEND_SENS	(6)
#define MASNDDRV_HV_FRAME_ON					(37)
#define MASNDDRV_HV_FRAME_OFF					(1)
#define MASNDDRV_HV_FRAME_NORMAL				(28)
#define MASNDDRV_HV_FRAME_CHANGE				(36)
#define MASNDDRV_HV_EXCHANNEL					(127)
#define MASNDDRV_HV_CHANNEL_NUMBER				(0)
#define MASNDDRV_HV_EXIST						(0x80)

#define MASNDDRV_DUMMY_HVDRVFUNC		\
	{									\
		dummy_mahvdrv_Initialize,		\
		dummy_mahvdrv_SetDictionary,	\
		dummy_mahvdrv_SetCommand,		\
		dummy_mahvdrv_Generate,			\
		dummy_mahvdrv_Terminate			\
	}

/*--- for AL ---*/
#define MASNDDRV_MAX_LPFQ			(0x1F)
#define MASNDDRV_MIN_LPFCOF			(0x0008)
#define MASNDDRV_MAX_LPFCOF			(0x1FF8)
#define MASNDDRV_KEY_CENTER			(60)

/* mask for setcommand */
#define MASNDDRV_MASK_CHANNEL		(0x0F)
#define MASNDDRV_MASK_KEY			(0x7F)
#define MASNDDRV_MASK_BANK			(0xFF)
#define MASNDDRV_MASK_PROGRAM		(0x7F)
#define MASNDDRV_MASK_VOLUME		(0x7F)
#define MASNDDRV_MASK_XVB			(0xF8)
#define MASNDDRV_MASK_SUS			(0xEF)
#define MASNDDRV_MASK_BEND			(0x3FFF)
#define MASNDDRV_MASK_DEPTH			(0x07)
#define MASNDDRV_MASK_WAVEID		(0x1F)
#define MASNDDRV_MASK_LPF			(0x7F)
#define MASNDDRV_MASK_HVEVENT		(0x3F)

/* for coase tune, fine tune */
#define	MASNDDRV_MASK_COASETUNE		(0x7F)
#define	MASNDDRV_MASK_FINETUNE		(0x3FFF)
#define	MASNDDRV_MAX_HW_PITCHBEND	(0x0FFF)


/*--------------------------------------------------------------------------*/
/*   Struct Definitions                                                     */
/*--------------------------------------------------------------------------*/

typedef struct _MASNDDRVCHINFO
{
	UINT8	bBankNo;					/* bank number */
	UINT8	bProgNo;					/* program number */
	UINT8	bPoly;						/* poly/mono */
	UINT8	bSfx;						/* sfx */
	UINT8	bVolume;					/* volume */
	UINT8	bExpression;				/* expression */
	UINT8	bBendRange;					/* bend range */
	UINT8	bKeyControl;				/* key control */
	UINT8	bNoteOn;					/* note on */
	UINT8	bSlotNo;					/* slot number */
	UINT8	bAlFlag;					/* al flag  bit7=1:alch, bit0-6=1:al voice number */
	UINT8	bLedSync;					/* led sync flag  1:sync */
	UINT8	bMtrSync;					/* motor sync flag 1:sync */
	UINT8	bVolInterp;					/* volume interpolation 0:off  1:on */
	UINT8	bPcFlag;					/* program change flag  0:none 1:done for AL */
	UINT32	dLpfQ;						/* AL resonance */
	UINT32	dLpfCof;					/* AL brightness */
	SINT32	sdLpfQShift;				/* AL resonance shift value */
	SINT32	sdLpfCofShift;				/* AL brightness shift value */
	UINT32	dPitchBend;					/* pitchbend value [6.10] (default:0x0400) */
	UINT32	dCoaseTune;					/* coase tune value [6.10] (default:0x0400) */
	UINT32	dFineTune;					/* fine tune value [6.10] (default:0x0400) */
	UINT32	dTunePitch;					/* (coase tune * fine tune) [6.10] (default:0x0400) */
} MASNDDRVCHINFO, *PMASNDDRVCHINFO;

typedef struct _MASNDDRVSTREAMINFO
{
	UINT8	bFormat;					/* format */
	UINT8	bPan;						/* pan */
	UINT32	dFrequency;					/* frequency */
	UINT32	dSeekP;						/* seek point (byte) */
} MASNDDRVSTMINFO, * PMASNDDRVSTMINFO;

typedef struct _MASNDDRVSLOTINFO
{
	UINT8	bCh;						/* channel number */
	UINT32	dKey;						/* key number */
} MASNDDRVSLOTINFO;

typedef struct _MASNDDRVVOICEINFO
{
	UINT16	wBankProg;					/* bank, program number */
	UINT8	bSynth;						/* synth type */
	UINT16	wKey;						/* key number */
	UINT16	wRamAdrs;					/* ram address */
} MASNDDRVVOICEINFO, * PMASNDDRVVOICEINFO;

typedef struct _MASNDDRVALVOICEINFO
{
	UINT32	dBankNo;					/* bank number */
	UINT32	dProgNo;					/* program number */
	UINT8  *pAlVoice;					/* pointer to AL voice parameter */
	UINT32	dAlVoiceSize;				/* size of AL voice parameter */
} MASNDDRVALVOICEINFO, * PMASNDDRVALVOICEINFO;

typedef struct _MASNDDRVVINFO
{
	UINT8	bSynth;						/* synth type */
	UINT16	wKey;						/* key number */
	UINT16	wAddress;					/* address */
} MASNDDRVVINFO, * PMASNDDRVVINFO;

typedef struct _MASNDDRVLEDINFO
{
	UINT32	dCtrl;						/* control 0:off 1:direct 2:sync */

⌨️ 快捷键说明

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