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

📄 mammfcnv.c

📁 是一个手机功能的模拟程序
💻 C
📖 第 1 页 / 共 5 页
字号:
/****************************************************************************
 *
 *		Copyright (C) 2002-2003	YAMAHA CORPORATION. All rights reserved.
 *
 *		Module		: mammfcnv.c
 *
 *		Description	: SMAF Converter
 *
 *		Version		: 2.0.1 	2003.09.02
 *
 ****************************************************************************/

#include "masnddrv.h"
#include "mamachdep.h"
#include "madevdrv.h"
#include "maresmgr.h"
#include "malib.h"
#include "mammfcnv.h"

#define	MMF_MAX_TRACK_NUM			8
#define	MMF_MAX_PHRASE_INFO			7
#define	MMF_MAX_EVENT_NUM			10
#define	MMF_MAX_NOTE_OFF_NUM		256
#define	MMF_MAX_STREAM_DATA_NUM2	62
#define	MMF_MAX_STREAM_DATA_NUM3	32
#define	MMF_MAX_VOICE_DATA_NUM2		16
#define	MMF_MAX_WAVE_DATA_NUM3		127
#define	MMF_CHANNEL_NUM				16

#define	MMF_FUNC_SUCCESS			MASMW_SUCCESS
#define	MMF_FUNC_ERROR				MASMW_ERROR

#define	MMF_ERR_ARGUMENT			MASMW_ERROR_ARGUMENT
#define	MMF_ERR_FILE				MASMW_ERROR_FILE
#define	MMF_ERR_CLASS				MASMW_ERROR_CONTENTS_CLASS
#define	MMF_ERR_TYPE				MASMW_ERROR_CONTENTS_TYPE
#define	MMF_ERR_SIZE				MASMW_ERROR_CHUNK_SIZE
#define	MMF_ERR_CHUNK				MASMW_ERROR_CHUNK
#define	MMF_ERR_NOTAG				MASMW_ERROR_UNMATCHED_TAG
#define	MMF_ERR_SLENGTH				MASMW_ERROR_SHORT_LENGTH
#define	MMF_ERR_LLENGTH				MASMW_ERROR_LONG_LENGTH
#define	MMF_ERR_NODATA				MASMW_ERROR_NO_INFORMATION

#define	MMF_SEQ_ID_NULL				-1

#define	MMF_STATUS_IDLE				0
#define	MMF_STATUS_SAT_PROFILE		1
#define	MMF_STATUS_LOADED			2

#define	MMF_CRC_NULL				0xFFFF0000
#define	MMF_POSITION_OF_CCLASS		16
#define	MMF_POSITION_OF_CTYPE		17
#define	MMF_STSP_OFFSET_NULL		0xFFFFFFFF
#define	MMF_STSP_TIME_NULL			0xFFFFFFFF
#define	MMF_CHUNK_HEADER_SIZE		8
#define	MMF_FILE_CRC_SIZE			2
#define	MMF_ATR_TRACK_NO			MMF_MAX_TRACK_NUM - 1
#define	MMF_MINIMUM_TRACKSIZE2		6
#define	MMF_MINIMUM_TRACKSIZE3		20
#define	MMF_PLAY_TIME_MIN			20
#define	MMF_PLAY_TIME_MAX			0x00200000
#define	MMF_MA2_VOICE_NOTFOUND		0
#define	MMF_MA2_VOICE_FOUND			1
#define	MMF_FM_VOICE_MODE_4OP		0
#define	MMF_FM_VOICE_MODE_2OP		1

#define	MMF_STREAM_ID_INI			0xFF
#define	MMF_STREAM_ID_REGIST		0x00
#define	MMF_MA2_VOICE_NULL			0xFF
#define	MMF_MA3_WAVE_NULL			0xFF

#define	MMF_LED_SYNC_STATUS			0x10
#define	MMF_VIB_SYNC_STATUS			0x20
#define	MMF_KEY_CONTROL_STATUS		0xC0

#define	MMF_AL_VOICE_FLAG			0x02
#define	MMF_FMWT_VOICE_FLAG			0x01
#define	MMF_FM_VOICE_PARAMETER		0x00
#define	MMF_WT_VOICE_PARAMETER		0x01
#define	MMF_AL_VOICE_PARAM_SIZE		27
#define	MMF_2OPFM_VOICE_PARAM_SIZE	17
#define	MMF_4OPFM_VOICE_PARAM_SIZE	31
#define	MMF_WT_VOICE_PARAM_SIZE		16
#define	MMF_MAX_VOICE_PARAM_SIZE	MMF_AL_VOICE_PARAM_SIZE + MMF_4OPFM_VOICE_PARAM_SIZE + 2
#define	MMF_WT_VOICE_WAVE_SIZE		8192

#define	MMF_WAVE_BIN_2S_COMP_8BIT	0x01
#define	MMF_WAVE_BIN_OFFSET_8BIT	0x11
#define	MMF_WAVE_ADPCM_4BIT			0x20
#define	MMF_STREAM_TYPE_8BIT_2SCOMP	3
#define	MMF_STREAM_TYPE_8BIT_BINARY	2
#define	MMF_STREAM_TYPE_4BIT_ADPCM	1
#define	MMF_STREAM_ERROR			0xFF
#define	MMF_WAVE_SF_MINIMUM			4000
#define	MMF_WAVE_SF_4BIT_MAX		24000
#define	MMF_WAVE_SF_8BIT_MAX		12000

#define	MMF_API_MASTERVOL_DEFAULT	100
#define	MMF_MA1_SEQ_MASTERVOLUME	76
#define	MMF_MA2_SEQ_MASTERVOLUME	127
#define	MMF_MA3_SEQ_MASTERVOLUME	45
#define	MMF_MA5_SEQ_MASTERVOLUME	100

#define	MMF_HUFFMAN_TREE_FAILURE	0
#define	MMF_HUFFMAN_TREE_SUCCESS	1

#define	MMF_LOADINFO_SUCCESS		0
#define	MMF_LOADINFO_FAILURE		1
#define	MMF_LOADINFO_ERROR			MMF_FUNC_ERROR

#define	MMF_EXCLUSIVE_CHECK_FAILURE	0

#define	MMF_PHRAZE_SIZE_A			8
#define	MMF_PHRAZE_SIZE_B			12

#define	MMF_TAG_STARTPOINT			0x7374
#define	MMF_TAG_STOPPOINT			0x7370
#define	MMF_TAG_PHRASE_A			0x5041
#define	MMF_TAG_PHRASE_B			0x5042
#define	MMF_TAG_PHRASE_E			0x5045
#define	MMF_TAG_PHRASE_I			0x5049
#define	MMF_TAG_PHRASE_K			0x504B
#define	MMF_TAG_PHRASE_R			0x5052
#define	MMF_TAG_PHRASE_S			0x5053

#define	MMF_SMAF_TYPE_NULL			0
#define	MMF_SMAF_TYPE_MA1			1
#define	MMF_SMAF_TYPE_MA2			2
#define	MMF_SMAF_TYPE_MA3			3
#define	MMF_SMAF_TYPE_MA5			5

#define	MMF_FM_MODE_2OP32			0
#define	MMF_FM_MODE_4OP16			1
#define	MMF_P_SOUNDSET_GMX			0
#define	MMF_P_SOUNDSET_GML1			2
#define	MMF_WT_VOLUME_MA3			0
#define	MMF_WT_VOLUME_MA5			4

#define	MMF_RESOUCE_MODE_MA3		2
#define	MMF_RESOUCE_MODE_MA12		3
#define	MMF_RESOUCE_MODE_MA5		4
#define	MMF_RESOUCE_MODE_MA5_64		5

#define	MMF_SEQUENCETYPE_DERAYED	0
#define	MMF_AL_CHANNEL_NULL			0xFF
#define	MMF_HV_CHANNEL_NULL			16


#define	MMF_BANK_NUMBER_DEF			0
#define	MMF_PROGRAM_NUMBER_DEF		0
#define	MMF_RESONANCE_DEF			0x40
#define	MMF_BRIGHTNESS_DEF			0x40

#define	MMF_SETVOLUME_3RD_PARAM		0x07

#define	MMF_LED_SEQ_SYNC_OFF		0
#define	MMF_LED_SEQ_SYNC_ON			1
#define	MMF_VIB_SEQ_SYNC_OFF		0
#define	MMF_VIB_SEQ_SYNC_ON			1
#define	MMF_KEYCONTROL_ON			2
#define	MMF_KEYCONTROL_OFF			1
#define	MMF_KEYCONTROL_DEFAULT		0

#define	MMF_EVNET_EOS				0xFF

#define	MMF_CHANNEL_MODE_POLY		0
#define	MMF_CHANNEL_MODE_MONO		1

#define	MMF_BANK_NUMBER_DEF			0
#define	MMF_PROGRAM_NUMBER_DEF		0
#define	MMF_RPN_DEF					0x7F
#define	MMF_MODULATION_DEF			0
#define	MMF_CHANNEL_VOLUME_DEF		100
#define	MMF_CHANNEL_PAN_DEF			0x40
#define	MMF_EXPRESSION_DEF			0x7F
#define	MMF_HOLD_DEF				0
#define	MMF_MONO_POLY_MODE_DEF		MMF_CHANNEL_MODE_POLY
#define	MMF_PITCH_BEND_DEF			0x40
#define	MMF_BEND_RANGE_DEF			2
#define	MMF_OCTAVE_SHIFT_DEF		4
#define	MMF_VELOCITY_DEF_MA3		90
#define	MMF_VELOCITY_DEF_MA5		100
#define	MMF_BLOCK_FNUM_DEF			0
#define	MMF_STREAM_PAIR_DEF			0xFF
#define	MMF_STREAM_PAN_DEF			0xFF
#define	MMF_STREAM_PAN_OFF			0x80

#define	SNDDRV_DEF_STREAM_PAN		255
#define	SNDDRV_DEF_RESONANCE		64
#define	SNDDRV_DEF_BRIGHTNESS		64
#define	SNDDRV_DEF_CHANNEL_VOLUME	100
#define	SNDDRV_DEF_CHANNEL_PANPOT	64
#define	SNDDRV_DEF_EXPRESSION		127
#define	SNDDRV_DEF_BENDRANGE		2
#define	SNDDRV_DEF_PITCHBEND		0x2000

#define	MMF_CONVERT_PHASE_PLAY		0x00000000
#define	MMF_CONVERT_PHASE_SEEK_G	0x00010000
#define MMF_CONVERT_PHASE_SEEK_C	0x00020000
#define MMF_CONVERT_PHASE_SEEK_END	0x00030000
#define MMF_CONVERT_PHASE_PLAY_END	0x00FF0000

#define	MMF_SEEK_EVENT_END			0xFFFF

/* OPDA infomation structure	*/
typedef struct _tagOption_Info{
	UINT8 *			pbCnti;					/* pointer to CNTI Body				*/
	UINT32			dCntiSize;				/* size of CNTI Body				*/
	UINT8 *			pbOpda;					/* pointer to OPDA Body				*/
	UINT32			dOpdaSize;				/* size of OPDA Body				*/
} OPTIONINFO, *POPTIONINFO;

/* Track information structure	*/
typedef struct _tagTrack_Info{
	UINT8 *			pbMtr;					/* pointer to MTR(ATR) Body			*/
	UINT32			dMtrSize;				/* size of MTR(ATR) Body			*/
	UINT8 *			pbMspi;					/* pointer to MspI(AspI) Body		*/
	UINT32			dMspiSize;				/* size of MspI(AspI) Body			*/
	UINT8 *			pbMtsu;					/* pointer to Mtsu Body				*/
	UINT32			dMtsuSize;				/* size of Mtsu Body				*/
	UINT8 *			pbMtsq;					/* pointer to Mtsq(Atsq) Body		*/
	UINT32			dMtsqSize;				/* size of Mtsq(Atsq) Body			*/
	UINT8 *			pbMtsp;					/* pointer to Mtsp Body				*/
	UINT32			dMtspSize;				/* size of Mtsp Body				*/
	UINT8 *			pbMthv;					/* pointer to Mthv Body				*/
	UINT32			dMthvSize;				/* size of Mthv Body				*/
	UINT32			dPlayTime;				/* play time (tick)					*/
	UINT32			dTimeBase;				/* time base (msec/tick)			*/
	UINT32			dStartPoint;			/* start point(offset)				*/
	UINT32			dStopPoint;				/* stop point(offset)				*/
	UINT32			dStartTick;				/* start point(tick)				*/
	UINT32			dStopTick;				/* stop point(tick)					*/
} TRACKINFO, *PTRACKINFO;

/* Phrase information structure	*/
typedef struct _tagPhrase_Info{
	UINT32			dStartPoint;			/* start point of phrase(offset)	*/
	UINT32			dStopPoint;				/* stop point of phrase(offset)		*/
	UINT32			dStartTick;				/* start point of phrase(tick)		*/
	UINT32			dStopTick;				/* stop point of phrase(tick)		*/
} PHRASEINFO, *PPHRASEINFO;

/* Huffman information structure	*/
typedef struct _tagHuffman_Info{
	UINT32			dMtsqSize;				/* size of Mtsq(Atsq) Body			*/
	UINT32			dSeqSize;				/* size of sequence data			*/
	UINT32			dReadSize;				/* read data size 					*/
	SINT16			swLeft[512];			/* Huffman Tree (Left)				*/
	SINT16			swRight[512];			/* Huffman Tree (Right)				*/
	UINT8 *			psBuffer;				/* pointer to reference area		*/
	SINT8			sbBitC;					/* counter of reference bit			*/
	UINT8			bByte;					/* value of reference byte			*/
	UINT8 *			psFBuf;					/* pointer to sequence data top		*/
	SINT8			sbFBit;					/* counter of sequence data top bit	*/
	UINT8			bFByte	;				/* value of sequence data top byte	*/
} HUFFMANINFO, *PHUFFMANINFO;

/* HV information structure		*/
typedef struct _tagHv_Info{
	UINT8*			pbVoice;				/* pointer to HVP0 chunk header		*/
	UINT32			dVoiceSize;				/* size of HV voice parameter		*/
	UINT8*			pbScript;				/* pointer to Mhsc body				*/
	UINT32			dScriptSize;			/* size of Mhsc body				*/
	UINT8			bHvChannel;				/* HV channel #						*/
} HVINFO, *PHVINFO;


/* Load information structure	*/
typedef struct _tagLoad_Info{
	UINT8 *			pbMmmd;					/* pointer to MMMD top				*/
	UINT32			dMmmdSize;				/* size of MMMD (whole)				*/
	UINT32			dCrc;					/* file CRC							*/
	UINT32			dSmafType;				/* SMAF Type						*/
	UINT32			dPlayTime;				/* play time (tick)					*/
	UINT32			dStartTime;				/* start time (start point tick)	*/
	UINT32			dTimeBase;				/* time base (msec/tick)			*/
	UINT8			(*pfnGetByte)(PHUFFMANINFO psHuf);
	OPTIONINFO		sOption_Info;
	TRACKINFO		sTrack_Info[MMF_MAX_TRACK_NUM];
	PHRASEINFO		sPhrase_Info[MMF_MAX_PHRASE_INFO];
	HUFFMANINFO		sHuffman_Info;
	HVINFO			sHV_Info;
} LOADINFO, *PLOADINFO;

/* Stream information structure(for MA-2)	*/
typedef struct _tagStream_Info2{
	UINT8			bStrmID;				/* key number of stream				*/
	UINT8 *			pbWave;					/* pointer to Awa body				*/
	UINT32			dWaveSize;				/* size of Awa body					*/
	UINT32			dFs;					/* sampling frequency				*/
} STREAMINFO2, *PSTREAMINFO2;

/* Stream information structure(for MA-3/5)	*/
typedef struct _tagStream_Info3{
	UINT8			fbNote;					/* stream data flag					*/
	UINT8			bPairID;				/* stream pair ID					*/
	UINT8			bPan;					/* stream pan						*/
} STREAMINFO3, *PSTREAMINFO3;

/* Stream information structure	*/
typedef struct _tagStream_Info{
	STREAMINFO2		sStream_Info2[MMF_MAX_STREAM_DATA_NUM2];
	STREAMINFO3		sStream_Info3[MMF_MAX_STREAM_DATA_NUM3];
} STREAMINFO, *PSTREAMINFO;

/* Voice information structure(for MA-1/2)	*/
typedef struct _tagVoice_Info2{
	UINT8			bBank;					/* bank number						*/
	UINT8			bProg;					/* program number					*/
} VOICEINFO2, *PVOICEINFO2;

/* Wave information structure(for MA-3/5)	*/
typedef struct _tagWave_Info3{
	UINT32			dAdrs;					/* wave address						*/
	UINT32			dSize;					/* wave data size					*/
} WAVEINFO3, *PWAVEINFO3;

/* Voice information structure	*/
typedef struct _tagVoice_Info{
	VOICEINFO2		sVoice_Info2[MMF_MAX_VOICE_DATA_NUM2];
	WAVEINFO3		sWave_Info3[MMF_MAX_WAVE_DATA_NUM3];
} VOICEINFO, *PVOICEINFO;

/* Channel information structure	*/
typedef struct _tagChannel_Info{
	UINT8			bBankM;					/* bank select MSB					*/
	UINT8			bBankL;					/* bank select LSB					*/
	UINT8			bBank;					/* bank number (sound driver)		*/
	UINT8			bProg;					/* program change					*/
	UINT8			bRpnM;					/* RPN MSB							*/
	UINT8			bRpnL;					/* RPN LSB							*/
	UINT8			bMod;					/* modulation						*/
	UINT8			bChVol;					/* channel volume					*/
	UINT8			bPan;					/* channel pan						*/
	UINT8			bExp;					/* expression						*/
	UINT8			bHold;					/* hold								*/
	UINT8			bMono;					/* channel mode mono/poly			*/
	UINT8			bPitch;					/* pitch bend (MSB)					*/
	UINT8			bSens1;					/* pitch bend lenge 1				*/
	UINT8			bSens2;					/* pitch bend lenge 2				*/
	UINT8			bOct;					/* octerve shift					*/
	UINT8			bVel;					/* note on velocity					*/
	UINT8			bBlockFnum1;			/* ma-2 pitch bend (0xB0)			*/
	UINT8			bBlockFnum2;			/* ma-2 pitch bend (0xC0)			*/
	UINT8			fbLed;					/* LED synchronous flag				*/
	UINT8			fbVib;					/* Motor synchronous flag			*/
} CHANNELINFO, *PCHANNELINFO;

/* Event information structure	*/
typedef struct _tagEvent_Block{
	UINT32			dEventTime;				/* event activation time			*/
	UINT32			dSeqID;					/* sequencer ID (sound driver)		*/
	UINT32			dCmd;					/* command ID (sound driver)		*/
	UINT32			dParam1;				/* parameter 1						*/
	UINT32			dParam2;				/* parameter 2						*/
	UINT32			dParam3;				/* parameter 3						*/
	UINT8 *			pbSeq;					/* pointer to next event data		*/
	UINT32			dIndex;					/* index of next event				*/
	UINT32			dTrackNo;				/* track no.						*/
	void  *			pvNext;					/* pointer to next event block		*/
} EVENTBLOCK, *PEVENTBLOCK;

/* Note OFF information structure	*/
typedef struct _tagNoteOff_Block{
	UINT32			dOffTime;				/* note off activation time			*/
	UINT32			dSeqID;					/* sequencer ID (sound driver)		*/
	UINT32			dCmd;					/* command ID (sound driver)		*/
	UINT32			dCh;					/* channel no.						*/
	UINT32			dKey;					/* key no.							*/
	void  *			pvNext;					/* pointer to next note off block	*/
} OFFBLOCK, *POFFBLOCK;

/* Playback information structure	*/
typedef struct _tagPlay_Info{
	PEVENTBLOCK		psNextEvent;			/* pointer to next event block		*/
	PEVENTBLOCK		psEmptyEvent;			/* pointer to empty event block		*/
	POFFBLOCK		psNextOff;				/* pointer to next note off block	*/
	POFFBLOCK		psEmptyOff;				/* pointer to empty note off block	*/
	UINT32			dSmafType;				/* SMAF Type						*/
	UINT32			dHWTimeBase;			/* tick to H/W time base			*/
	UINT32			dPlayTime;				/* play time (tick)					*/
	UINT32			dStartTime;				/* start time (start point tick)	*/
	UINT32			dSeekTime;				/* seek time (msec)					*/
	UINT32			dSeekError;				/* seek time error (msec)			*/
	UINT32			dRamAdrs;				/* ram address						*/
	UINT32			dRamSize;				/* ram size							*/
	UINT32			dSeekParam;				/* seek event flag					*/
	UINT32			dPastTime;				/* past time (tick)					*/
	UINT8			bMasterVol;				/* master volume (sequence)			*/
	UINT8			bEos;					/* EOS flag							*/
	UINT16			fwMono;					/* channel mode change flag			*/
	UINT8			bResonance;				/* resonance						*/
	UINT8			bBrightness;			/* brightness						*/
	UINT8			bStreamReserve;			/* stream reserve					*/
	UINT8			bAlChReserve;			/* AL channel number				*/
	UINT8			bHVChannel;				/* HV channel number				*/
	UINT8			bFmVoice;				/* FM Voice Mode 0:4op, 1:2op		*/
	UINT8			(*pfnGetByte)(void);	/* pointer to byte get function		*/
	SINT32			(*pfnGetEvent)(void);	/* pointer to event get function	*/
	STREAMINFO		sStream_Info;
	VOICEINFO		sVoice_Info;
	CHANNELINFO		sChannel_Info[MMF_CHANNEL_NUM + 1];
	EVENTBLOCK		sEvent_Block[MMF_MAX_EVENT_NUM];
	OFFBLOCK		sNoteOff_Block[MMF_MAX_NOTE_OFF_NUM];
} PLAYINFO, *PPLAYINFO;

/* SMAF information structure	*/
typedef struct _tagSmaf_Info{
	SINT32			sdMmfSeqID;				/* sequence id (sound driver)		*/
	UINT32			dStatus;				/* converter status					*/
	LOADINFO		sLoad_Info[2];
	PLAYINFO		sPlay_Info;
} SMAFINFO, *PSMAFINFO;

static			SMAFINFO	gsSmaf_Info;

static	const	UINT8		abBitMaskTable1[8] = {
	0x01,	0x02,	0x04,	0x08,	0x10,	0x20,	0x40,	0x80	};

static	const	UINT16		awBitMaskTable2[8] = {
	0x00FF,	0x01FE, 0x03FC,	0x07F8,	0x0FF0,	0x1FE0,	0x3FC0,	0x7F80	};

static	const	UINT8		abTableA[16] = {
    0, 1, 1, 1, 1, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 15 };

static	const	UINT8		abTableD[16] = {
    0, 1, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14 };

static	const	UINT8		abExpression2[16] = {
0x80,0x00,0x1f,0x27,0x2f,0x37,0x3f,0x47,0x4f,0x57,0x5f,0x67,0x6f,0x77,0x7f,0x80 };

static	const	UINT8		abModulation2[16] = {
0x80,0x00,0x08,0x10,0x18,0x20,0x28,0x30,0x38,0x40,0x48,0x50,0x60,0x70,0x7f,0x80 };



/*********************************************************************************
 *	get_4byte
 *
 *	Description:
 *			SMAF data load (error check and regist)
 *	Argument:
 *			pbBuf			pointer to top data
 *	Return:
 *			nothing
 ********************************************************************************/
static UINT32			get_4byte(
	UINT8*				pbBuf
)
{
	return (UINT32)(	(((UINT32)pbBuf[0]) << 24) +
						(((UINT32)pbBuf[1]) << 16) +
						(((UINT32)pbBuf[2]) <<  8) +
						 ((UINT32)pbBuf[3]));
}

⌨️ 快捷键说明

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