亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? mamidcnv.c

?? 是一個手機功能的模擬程序
?? C
?? 第 1 頁 / 共 5 頁
字號:
/****************************************************************************
 *
 *		Copyright (C) 2002-2003	YAMAHA CORPORATION. All rights reserved.
 *
 *		Module		: mamidcnv.c
 *
 *		Description	: SMF/GML Stream Converter Module.
 *
 *		Version		: 1.1.2 	2003.07.09
 *
 ****************************************************************************/

#include "mamidcnv.h"

/*--------------------------------------------------------------------------*/
/*   Defines                                                                */
/*--------------------------------------------------------------------------*/
#define	SMF_TIMEBASE_SHIFT			2							/*                         */
#define	SMF_TIMEBASE				(1L<<SMF_TIMEBASE_SHIFT)	/* [ms]                    */

#define	MAX_SMF_MESSAGES			256							/*                          */
#define	MAX_SMF_TRACKS				32							/* Should be <= 32          */
#define SMF_MAX_GAIN				76							/* - 6[dB] : 90             */
																/* -18[dB] : 45             */
#define	MINIMUM_LENGTH				(20)

#define MELODY_MAP					(0)
#define DRUM_MAP					(1)
#define NUM_OF_MAPS					(2)

/*--------------------------------------------------------------------------*/
/*   Types                                                                  */
/*--------------------------------------------------------------------------*/
typedef struct _tagMidChInfo
{
	UINT32					dBank;						/* BankH&L (0x00:00..0x7F7F)       */
	UINT32					dCurrBank;					/* BankH&L (0x00:00..0x7F7F)       */
	UINT32					dProg;						/* ProgramChange (0..127)          */
	UINT32					dVolume;					/* ChannelVolume (0..127)          */
	UINT32					dExpression;				/* Expression (0..127)             */
	UINT32					dModulation;				/* Modulation (0..127)             */
	UINT32					dPitchBend;					/* PitchBendH (0..127)             */
	UINT32					dBendRange;					/* CurrentBendRange (0..24)        */
	UINT32					dPreBendRange;				/* LatestBendRange (0..24)         */
	UINT32					dPanpot;					/* Panpot (0..127)                 */
	UINT32					dHold1;						/* Hold1 (0..127)                  */
	UINT32					dMode;						/* 0:MONO, 1:POLY                  */
	UINT32					dRPN;						/* RPN (0x00:00..0xFF7F)           */
	UINT32					dMipMute;					/* Mute switch (1:mute)            */
	UINT32					dKeyCon;					/* 0:Melady, 1:OFF, 2:ON           */
	UINT32					dLedSync;					/* 0:OFF, 1:ON                     */
	UINT32					dVibSync;					/* 0:OFF, 1:ON                     */
	UINT32					dFineTune;					/* 0..0x3FFF                       */
	UINT32					dCoaseTune;					/* 0..0x7F                         */
} MIDCHINFO, *PMIDCHINFO;

typedef struct _tagMIDPACKET
{
	SINT32					sdDeltaTime;
	UINT32					dMsgID;						
	UINT32					dP1;						
	UINT32					dP2;						
	UINT32					dP3;						
} MIDPACKET, *PMIDPACKET;

typedef struct _tagTrack
{
	UINT32					dSmfCmd;					/* CMD @ now                      */
	UINT32					dSize;						/* [byte] 0 measns nothing in it. */
	UINT8*					pbBase;						/* NULL measns nothing in it.     */
	UINT32					dOffset;					/* offset byte                    */
	SINT32					sdTicks;					/*                                */
} TRACKINFO, *PTRACKINFO;

typedef struct _tagOrderList
{
	struct _tagOrderList*	pPrev;
	struct _tagOrderList*	pNext;
	UINT32					dTrack;
	UINT32					dTicks;
} ORDERLIST, *PORDERLIST;

typedef struct _tagMidInfo
{
	UINT32					dTimeResolution;			/* 0..0x7fff                       */
	UINT8*					pbTitle;					/*                                 */
	UINT32					dSizeTitle;					/*                                 */
	UINT8*					pbCopyright;				/*                                 */
	UINT32					dSizeCopyright;				/*                                 */
	UINT32					dNumOfTracks;				/* 1..32                           */
	UINT32					dSmfFormat;					/* 0..1                            */
	UINT32					dSetupBar;					/* 0:No, 1:Yes                     */
	UINT32					dStart;						/* Index after SetupBar            */
	UINT32					dVibNoteVoice;				/* 0:No, 1:Yes                     */

	SINT32					sdTotalTicks;				/* Total ticks                     */
	SINT32					sdDataEndTime;				/* (22.10)[ms]                     */
	SINT32					sdDelta;					/* (22.10)[ms]                     */

	UINT32					dEndFlag;					/*                                 */
	TRACKINFO				TrackInfo[MAX_SMF_TRACKS];	
	
	struct _tagOrderList*	pTopOrderList;				
	struct _tagOrderList*	pDoneOrderList;				
	struct _tagOrderList*	pBottomOrderList;			
	ORDERLIST				OrderList[MAX_SMF_TRACKS + 3];

	MIDCHINFO				ChInfo[16];					/*                                 */
	UINT32					dValid;						/* 0:none, 1:Valid                 */

	UINT8					bVoiceMap[NUM_OF_MAPS][128];/* 0:Empty, 1:Valid                */
} MIDINFO, *PMIDINFO;

typedef	struct _tagMidGlobals
{
	SINT32		sdSeqID;						/* Sequence ID             */
	SINT32		sdFileID;						/* File ID                 */
	UINT32		dEnable;						/* 0:disable               */
	UINT32		dSetup;							/* 1: Just after seek      */

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

	MIDINFO		DataInfo[2];					/*                         */

	SINT32		sdSeekTime;						/* [ms]                    */
	SINT32		sdLastMsgTime;					/* (22.10)[ms]             */
	SINT32		sdSmfCurrentTicks;				/* Ticks @ now             */
	SINT32		sdSmfCurrentTime;				/* (22.10)[ms]             */
	SINT32		sdSmfDataEndTime;				/* (22.10)[ms]             */
	SINT32		sdSmfEndTime;					/* (22.10)[ms]             */
	SINT32		sdSmfDelta;						/* (22.10)[ms]             */

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

	UINT32		dHoldMsgs;						/* Number of messages in Q */
	UINT32		dHoldPtrR;						/* Pointer for Read        */
	MIDPACKET	MsgBuffer[MAX_SMF_MESSAGES];	/* Message Q               */

	UINT32		dMuteFlag;						/* 0:Normal, 1:MUTE        */

	UINT32		dSyncNoteCh;					/* 0..15                   */
	UINT32		dSyncNoteKey;					/* 0..127, 255:OFF         */
	UINT32					dVibNote;			/* 0:No VibiNote, 1:Yes,VibNote    */

} MIDGLOBAL, *PMIDGLOBAL;


/*--------------------------------------------------------------------------*/
/*   Consts                                                                 */
/*--------------------------------------------------------------------------*/
#include "mamid4opvoice.h"


/*---------------------------------------------------------------------------*/
/*   Globals                                                                 */
/*---------------------------------------------------------------------------*/
static MIDGLOBAL	gMidInfo;
static PMIDGLOBAL	gpMidInfo;


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

/****************************************************************************
 *	InitializeOrderList(PMIDINFO pI)
 *
 *	Description:
 *			Initialize OrderList.
 *	Param:
 *		pI			... pointer to the data info
 *	Return:
 *			none
 ****************************************************************************/
static void InitializeOrderList(PMIDINFO pI)
{
	UINT32 i;

	for (i = 1; i <= MAX_SMF_TRACKS + 1; i++)
	{
		pI->OrderList[i].pPrev = &pI->OrderList[i - 1];
		pI->OrderList[i].pNext = &pI->OrderList[i + 1];
		pI->OrderList[i].dTrack = 0xFF;
		pI->OrderList[i].dTicks = 0xFFFFFFFFL;
	}
	pI->OrderList[0].pPrev = NULL;
	pI->OrderList[0].pNext = &pI->OrderList[1];
	pI->OrderList[MAX_SMF_TRACKS + 2].pPrev = &pI->OrderList[MAX_SMF_TRACKS + 1];
	pI->OrderList[MAX_SMF_TRACKS + 2].pNext = NULL;
	pI->pTopOrderList = &pI->OrderList[0];
	pI->pDoneOrderList = &pI->OrderList[1];
	pI->pBottomOrderList = &pI->OrderList[MAX_SMF_TRACKS + 2];
}


/****************************************************************************
 *	SortOrderList(PMIDINFO pI)
 *
 *	Description:
 *			Sort OrderList. (Ascending order)
 *	Param:
 *		pI			... pointer to the data info
 *	Return:
 *			none
 ****************************************************************************/
static void SortOrderList(PMIDINFO pI)
{
	PORDERLIST pSlot;
	PORDERLIST pTerget;

	pSlot = (pI->pTopOrderList)->pNext;
	(pSlot->pPrev)->pNext = pSlot->pNext;
	(pSlot->pNext)->pPrev = pSlot->pPrev;
	pSlot->dTicks = ((UINT32)pI->TrackInfo[pSlot->dTrack].sdTicks << 5) + pSlot->dTrack;

	pTerget = pSlot->pNext;
	while (pTerget != pI->pDoneOrderList)
	{
		if (pSlot->dTicks <= pTerget->dTicks) break;
		pTerget = pTerget->pNext;
	}

	(pTerget->pPrev)->pNext = pSlot;
	pSlot->pPrev = pTerget->pPrev;
	pTerget->pPrev = pSlot;
	pSlot->pNext = pTerget;
}


/****************************************************************************
 *	InsertOrderList(PMIDINFO pI, UINT32 dTrack, SINT32 sdTicks)
 *
 *	Description:
 *			Add item to the top of the list.
 *	Param:
 *		pI			... pointer to the data info
 *	Return:
 *			none
 ****************************************************************************/
static void InsertOrderList(PMIDINFO pI, UINT32 dTrack, SINT32 sdTicks)
{
	PORDERLIST pTerget;

	if (pI->dNumOfTracks == 1) return;
	if (((pI->dEndFlag >> dTrack) & 0x01) == 0) return;

	pTerget = pI->pDoneOrderList->pNext;
	if (pTerget == pI->pBottomOrderList) return;
	
	pI->pDoneOrderList->pNext = pTerget->pNext;
	(pTerget->pNext)->pPrev = pI->pDoneOrderList;

	pTerget->dTrack = dTrack;
	pTerget->dTicks = ((UINT32)sdTicks << 5) + dTrack;
	pTerget->pPrev = pI->pTopOrderList;
	pTerget->pNext = (pI->pTopOrderList)->pNext;
	((pI->pTopOrderList)->pNext)->pPrev = pTerget;
	(pI->pTopOrderList)->pNext = pTerget;
	
	SortOrderList(pI);
}


/****************************************************************************
 *	RemoveFromOrderList(PMIDINFO pI)
 *
 *	Description:
 *			delete Item from the top of the list.
 *	Param:
 *		pI			... pointer to the data info
 *	Return:
 *			none
 ****************************************************************************/
static void RemoveFromOrderList(PMIDINFO pI)
{
	PORDERLIST pSlot;
	PORDERLIST pTerget;

	pSlot = (pI->pTopOrderList)->pNext;
	(pSlot->pPrev)->pNext = pSlot->pNext;
	(pSlot->pNext)->pPrev = pSlot->pPrev;
	
	pTerget = pI->pBottomOrderList;
	(pTerget->pPrev)->pNext = pSlot;
	pSlot->pPrev = pTerget->pPrev;
	pTerget->pPrev = pSlot;
	pSlot->pNext = pTerget;
}


/****************************************************************************
 *	GetTrackTime(PMIDINFO pI, UINT32 dTrack)
 *
 *	Description:
 *		Get the 1st DT from the list.
 *	Param:
 *		pI			... pointer to the data info
 *		bTrack		... #Track
 *	Return:
 *		0 : NoError, < 0 : Error code
 ****************************************************************************/
static SINT32	GetTrackTime(PMIDINFO pI, UINT32 dTrack)
{
	UINT32		dTemp;
	SINT32		dTime;
	PTRACKINFO	pMt;

	if (((pI->dEndFlag >> dTrack) & 0x01) == 0) return (-1);

	pMt = &(pI->TrackInfo[dTrack]);

	dTime = 0;
	do
	{
		if (pMt->dOffset >= pMt->dSize)
		{
			pI->dEndFlag &= ~(1L << dTrack);
			return (-1);
		}
		dTemp = (UINT32)pMt->pbBase[pMt->dOffset++];
		dTime = (dTime << 7) + (dTemp & 0x7f);
	} while (dTemp >= 0x80);

	pMt->sdTicks += dTime;

	return (0);
}


/****************************************************************************
 *	UpdateTrackTime(PMIDINFO pI, UINT32 dTrack)
 *
 *	Description:
 *		Update the 1st DT on the Track and OrderList
 *	Param:
 *		pI			... pointer to the data info
 *		bTrack		... #Track
 *	Return:
 *		0 : NoError, < 0 : Error code
 ****************************************************************************/
static SINT32	UpdateTrackTime(PMIDINFO pI, UINT32 dTrack)
{
	UINT32		dTemp;
	SINT32		dTime;
	PTRACKINFO	pMt;

	if (pI->dNumOfTracks == 1)
	{
		/* Single track */
		if (((pI->dEndFlag >> dTrack) & 0x01) == 0)
		{
			return (-1);
		}

		pMt = &(pI->TrackInfo[dTrack]);

		dTime = 0;
		do
		{
			if (pMt->dOffset >= pMt->dSize)
			{
				pI->dEndFlag &= ~(1L << dTrack);
				return (-1);
			}
			dTemp = (UINT32)pMt->pbBase[pMt->dOffset++];
			dTime = (dTime << 7) + (dTemp & 0x7f);
		} while (dTemp >= 0x80);

		pMt->sdTicks += dTime;
	}
	else
	{
		/* Multi track */
		if (((pI->dEndFlag >> dTrack) & 0x01) == 0)
		{
			RemoveFromOrderList(pI);
			return (-1);
		}

		pMt = &(pI->TrackInfo[dTrack]);

		dTime = 0;
		do
		{
			if (pMt->dOffset >= pMt->dSize)
			{
				pI->dEndFlag &= ~(1L << dTrack);
				RemoveFromOrderList(pI);
				return (-1);
			}
			dTemp = (UINT32)pMt->pbBase[pMt->dOffset++];
			dTime = (dTime << 7) + (dTemp & 0x7f);
		} while (dTemp >= 0x80);

		pMt->sdTicks += dTime;
		SortOrderList(pI);
	}

	return (0);
}


/****************************************************************************
 *	ResetTimeInfo(PMIDINFO pI)
 *
 *	Description:
 *		Reset time info
 *	Param:
 *		pI			... pointer to the data info
 *	Return:
 *		none
 ****************************************************************************/
static void	ResetTimeInfo(PMIDINFO pI)
{
	SINT32		sdTrack;
	PTRACKINFO	pMt;

	pI->dEndFlag = 0;

	for (sdTrack = 0; sdTrack < (SINT32)pI->dNumOfTracks; sdTrack++)
	{
		pMt = &(pI->TrackInfo[sdTrack]);

		pMt->dSmfCmd = 0;
		pMt->dOffset = 0;
		pMt->sdTicks = 0;
		if (pMt->dSize > 0) pI->dEndFlag |= (1L << sdTrack);
	}
	
	InitializeOrderList(pI);

	for (sdTrack = 0; sdTrack < (SINT32)pI->dNumOfTracks; sdTrack++)
	{
		GetTrackTime(pI, (UINT32)sdTrack);
		pMt = &(pI->TrackInfo[sdTrack]);
		InsertOrderList(pI,  (UINT32)sdTrack, pMt->sdTicks);
	}
}


/****************************************************************************
 *	GetLeastTimeTrack(PMIDINFO pI)
 *
 *	Description:
 *		Get the track@LeasetTime
 *	Param:
 *		pI			... pointer to the setup storage
 *	Return:
 *		0 : NoError, < 0 : Error
 ****************************************************************************/
static SINT32	GetLeastTimeTrack(PMIDINFO pI)
{
	PORDERLIST	pTerget;

	pTerget = (pI->pTopOrderList)->pNext;
	if (pTerget == pI->pBottomOrderList) return (-1);

	return ((SINT32)pTerget->dTrack);
}


/****************************************************************************
 *	GetSMFInfo(PMIDINFO pI)
 *
 *	Description:
 *		Get SMF info from the file
 *	Param:
 *		pI					... pointer to the setup storage
 *	Return:
 *		0 : NoError, < 0 : Error
 ****************************************************************************/
static SINT32	GetSMFInfo(PMIDINFO pI)
{
	UINT32		dCmd;
	UINT32		dCmd2;
	UINT32		dSize;
	
	UINT32		dTemp;
	UINT32		dTime;
	SINT32		sdTotalTicks;
	SINT32		sdCurrentTime;
	SINT32		sdDelta;
	PMIDCHINFO 	pCh;
	UINT32		dCh;

	UINT32		dSetup;			/* bit0:beat@0, bit1:tempo@0, bit2:GmOn@0, bit3:tempo@1 */
	PTRACKINFO	pMt;
	SINT32		sdTr;

	static UINT32	dBank[16];
	static UINT32	dCurrBank[16];

	MASMFCNV_DBGMSG(("MaMidCnv : GetSMFInfo\n"));

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
一区二区三区高清在线| 欧美成人女星排行榜| 国产成人自拍在线| 国精品**一区二区三区在线蜜桃| 午夜在线电影亚洲一区| 亚洲人成伊人成综合网小说| 中文一区在线播放| 国产精品污网站| 日韩毛片一二三区| 亚洲国产欧美一区二区三区丁香婷| 亚洲精品一二三| 丝袜美腿亚洲色图| 麻豆精品在线播放| 国产成都精品91一区二区三| eeuss影院一区二区三区| 色悠悠久久综合| 欧美精三区欧美精三区| 日韩免费一区二区| 国产三级精品视频| 一区二区三区在线免费视频| 日韩 欧美一区二区三区| 精品一区二区影视| www.欧美日韩| 51精品国自产在线| 26uuu亚洲综合色| 亚洲欧美日韩久久| 视频一区视频二区中文| 国产一区二区女| 91丨九色丨蝌蚪富婆spa| 在线精品视频免费观看| 欧美本精品男人aⅴ天堂| 国产精品污www在线观看| 亚洲一区在线观看免费观看电影高清 | 国产一区二区三区最好精华液| 国产精品99久久久久久久女警| 99re视频精品| 欧美不卡激情三级在线观看| 亚洲日本韩国一区| 久久国产麻豆精品| 色婷婷亚洲婷婷| 久久亚洲捆绑美女| 午夜影院在线观看欧美| 丁香天五香天堂综合| 欧美丰满高潮xxxx喷水动漫| 中文一区二区在线观看| 五月婷婷欧美视频| 91在线你懂得| 国产日韩欧美精品一区| 亚洲电影第三页| 99精品在线观看视频| 欧美一区二区三级| 一区二区三区色| eeuss鲁片一区二区三区在线看| 欧美裸体一区二区三区| 国产亚洲人成网站| 美女在线观看视频一区二区| 91精品福利在线| 国产精品无码永久免费888| 韩国一区二区在线观看| 欧美男女性生活在线直播观看| 国产精品久久99| 高清在线成人网| 久久丝袜美腿综合| 久久电影网电视剧免费观看| 欧美精品1区2区3区| 一区二区三区精品| 91猫先生在线| 中文字幕欧美一区| 成人av在线播放网址| 26uuu国产电影一区二区| 蜜桃传媒麻豆第一区在线观看| 欧美性色综合网| 亚洲国产精品一区二区久久恐怖片| 不卡一区二区中文字幕| 国产精品麻豆99久久久久久| 成人精品在线视频观看| 国产性天天综合网| 成人性生交大合| 最近中文字幕一区二区三区| 97超碰欧美中文字幕| 亚洲少妇最新在线视频| 色综合天天综合色综合av| 18成人在线视频| 在线日韩av片| 亚洲国产成人porn| 欧美一卡二卡三卡| 精品一区二区三区av| 久久女同精品一区二区| 高清免费成人av| 一区二区三区久久久| 欧美日韩国产中文| 老色鬼精品视频在线观看播放| 精品久久久久久久久久久久包黑料| 国产一区二区三区在线观看免费视频| 久久一留热品黄| 97aⅴ精品视频一二三区| 亚洲一区二区精品久久av| 欧美高清www午色夜在线视频| 精品一区免费av| 国产精品成人在线观看| 欧美视频日韩视频在线观看| 另类小说色综合网站| 国产拍欧美日韩视频二区| 91免费看`日韩一区二区| 天天综合色天天| 国产欧美日韩不卡免费| 在线看日本不卡| 精品亚洲国内自在自线福利| 亚洲欧洲日韩在线| 91精品啪在线观看国产60岁| 北条麻妃国产九九精品视频| 天涯成人国产亚洲精品一区av| 精品国产一区二区亚洲人成毛片| 99视频在线精品| 久久99精品久久久| 亚洲欧美一区二区久久 | 久久久久久久久久久电影| 99综合电影在线视频| 日韩1区2区3区| 亚洲精品国久久99热| 欧美精品三级日韩久久| 国产精品亚洲视频| 午夜精品一区二区三区免费视频| 久久久久久久性| 91精品国产综合久久精品麻豆| 国产成a人无v码亚洲福利| 午夜精品久久久久影视| 国产精品久久毛片| 久久综合色鬼综合色| 欧美在线综合视频| 白白色亚洲国产精品| 韩国女主播成人在线观看| 亚洲第一av色| 亚洲激情校园春色| 国产精品免费久久久久| 亚洲精品一区在线观看| 91精品国产一区二区三区蜜臀| 色婷婷综合五月| 99久久免费视频.com| 国产一区91精品张津瑜| 老司机精品视频线观看86| 视频一区二区欧美| 亚洲国产一二三| 亚洲一卡二卡三卡四卡无卡久久 | 欧美中文字幕一区二区三区亚洲| 国产91精品一区二区麻豆网站| 久久国产三级精品| 麻豆中文一区二区| 老司机午夜精品| 久草热8精品视频在线观看| 天堂一区二区在线| 日韩制服丝袜先锋影音| 午夜精品久久久久久不卡8050 | 日韩精品中文字幕一区二区三区 | 国产精品一区2区| 国产精品一二三| 成人午夜精品在线| 成人网在线免费视频| 不卡的av中国片| 色诱视频网站一区| 在线免费观看日本欧美| 7777女厕盗摄久久久| 91视频国产资源| 欧美激情一区二区三区在线| 久久只精品国产| 色综合久久99| 国产一区三区三区| 日本va欧美va精品| 亚瑟在线精品视频| 亚洲成人av电影在线| 一区二区免费看| 亚洲欧美日韩在线不卡| 亚洲成人一区二区在线观看| 欧美日韩一区中文字幕| 色香色香欲天天天影视综合网| 99久久免费精品| 欧美日韩一级片在线观看| 欧美在线播放高清精品| 欧美少妇bbb| 欧美成人一区二区三区片免费 | 亚洲欧洲www| 欧美韩日一区二区三区四区| 国产精品美女久久久久av爽李琼 | 3d成人h动漫网站入口| 日韩欧美一区在线观看| 欧美激情在线看| 亚洲成人精品一区| 久久99精品国产麻豆婷婷洗澡| 成人免费视频免费观看| 欧美人与性动xxxx| 久久久美女毛片| 亚洲一区二区三区美女| 国产真实精品久久二三区| 93久久精品日日躁夜夜躁欧美| 欧美一区二视频| 亚洲视频 欧洲视频| 久久国产生活片100| 91国偷自产一区二区三区成为亚洲经典 | 国产精品一区三区| 在线精品视频免费播放|