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

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

?? midi.h

?? 在vc 6.0環境下的一個坦克小游戲
?? H
字號:
/////////////////////////////////////////////////////////////////////////////
// Copyright (C) 1998 by J鰎g K鰊ig
// All rights reserved
//
// This file is part of the completely free tetris clone "CGTetris".
//
// This is free software.
// You may redistribute it by any means providing it is not sold for profit
// without the authors written consent.
//
// No warrantee of any kind, expressed or implied, is included with this
// software; use at your own risk, responsibility for damages (if any) to
// anyone resulting from the use of this software rests entirely with the
// user.
//
// Send bug reports, bug fixes, enhancements, requests, flames, etc., and
// I'll try to keep a version up to date.  I can be reached as follows:
//    J.Koenig@adg.de                 (company site)
//    Joerg.Koenig@rhein-neckar.de    (private site)
/////////////////////////////////////////////////////////////////////////////


// Midi.h : main header file for the MIDI application
//

// This class is based on the DirectX sample "mstream".

#ifndef MIDI_h
#define MIDI_h

#if _MSC_VER >= 1000
#pragma once
#endif // _MSC_VER >= 1000

#include <mmsystem.h>
#pragma message("linking with multimedia library")
#pragma comment(lib, "winmm.lib")

#include <vector>
using namespace std;


// This message is sent to the controlling window, if the volume changes in
// another way than explicitly set by the owner of the CMIDI object.
// WPARAM	the pointer to the MIDI object
// LPARAM	lo-word: the number of the channel that changed volume
//			hi-word: the new volume in percent
#define	WM_MIDI_VOLUMECHANGED	WM_USER+23


#define MIDI_CTRLCHANGE			((BYTE)0xB0)		// + ctrlr + value
#define MIDI_PRGMCHANGE			((BYTE)0xC0)		// + new patch
#define MIDI_CHANPRESS			((BYTE)0xD0)		// + pressure (1 byte)

#define MIDICTRL_VOLUME			((BYTE)0x07)

#define MIDIEVENT_CHANNEL(dw)	(dw & 0x0000000F)
#define MIDIEVENT_TYPE(dw)		(dw & 0x000000F0)
#define MIDIEVENT_DATA1(dw)		((dw & 0x0000FF00) >> 8)
#define MIDIEVENT_VOLUME(dw)	((dw & 0x007F0000) >> 16)

#define MIDI_SYSEX				((BYTE)0xF0)		// SysEx begin
#define MIDI_SYSEXEND			((BYTE)0xF7)		// SysEx end
#define MIDI_META				((BYTE)0xFF)		// Meta event begin
#define MIDI_META_TEMPO			((BYTE)0x51)		// Tempo change
#define MIDI_META_EOT			((BYTE)0x2F)		// End-of-track


// flags for the ConvertToBuffer() method
#define CONVERTF_RESET				0x00000001
#define CONVERTF_STATUS_DONE		0x00000001
#define CONVERTF_STATUS_STUCK		0x00000002
#define CONVERTF_STATUS_GOTEVENT	0x00000004

// Return values from the ConvertToBuffer() method
#define CONVERTERR_NOERROR		0		// No error occured
#define CONVERTERR_CORRUPT		-101	// The input file is corrupt
// The converter has already encountered a corrupt file and cannot convert any
// more of this file -- must reset the converter
#define CONVERTERR_STUCK		-102
#define CONVERTERR_DONE			-103	// Converter is done
#define CONVERTERR_BUFFERFULL	-104	// The buffer is full
#define CONVERTERR_METASKIP		-105	// Skipping unknown meta event

#define STATUS_KILLCALLBACK		100		// Signals that the callback should die
#define STATUS_CALLBACKDEAD		200		// Signals callback is done processing
#define STATUS_WAITINGFOREND	300		// Callback's waiting for buffers to play

// Description of a track
//
//##ModelId=3EBA49A1033C
struct TRACK
{
	//##ModelId=3EBA49A10350
	DWORD	fdwTrack;		// Track's flags
	//##ModelId=3EBA49A1034F
	DWORD	dwTrackLength;	// Total bytes in track
	//##ModelId=3EBA49A1034E
	LPBYTE	pTrackStart;	// -> start of track data buffer
	//##ModelId=3EBA49A1034D
	LPBYTE	pTrackCurrent;	// -> next byte to read in buffer
	//##ModelId=3EBA49A1034C
	DWORD	tkNextEventDue;	// Absolute time of next event in track
	//##ModelId=3EBA49A1034B
	BYTE	byRunningStatus;// Running status from last channel msg

	//##ModelId=3EBA49A10351
	TRACK()
		: fdwTrack(0)
		, dwTrackLength(0)
		, pTrackStart(0)
		, pTrackCurrent(0)
		, tkNextEventDue(0)
		, byRunningStatus(0)
	{
	}
};

#define ITS_F_ENDOFTRK		0x00000001


// This structure is used to pass information to the ConvertToBuffer()
// system and then internally by that function to send information about the
// target stream buffer and current state of the conversion process to internal
// lower level conversion routines.
//##ModelId=3EBA499E00DA
struct CONVERTINFO
{
	//##ModelId=3EBA499E00EF
    MIDIHDR	mhBuffer;			// Standard Windows stream buffer header
	//##ModelId=3EBA499E00EC
    DWORD	dwStartOffset;		// Start offset from mhStreamBuffer.lpStart
	//##ModelId=3EBA499E00EB
    DWORD	dwMaxLength;		// Max length to convert on this pass
	//##ModelId=3EBA499E00EA
    DWORD	dwBytesRecorded;
	//##ModelId=3EBA499E00DC
    DWORD	tkStart;
	//##ModelId=3EBA499E00DB
    BOOL	bTimesUp;

	//##ModelId=3EBA499E00F2
	CONVERTINFO()
		: dwStartOffset(0)
		, dwMaxLength(0)
		, dwBytesRecorded(0)
		, tkStart(0)
		, bTimesUp(FALSE)
	{
		memset(&mhBuffer, 0, sizeof(MIDIHDR));
	}
};

// Temporary event structure which stores event data until we're ready to
// dump it into a stream buffer
//##ModelId=3EBA49A201C5
struct TEMPEVENT
{
	//##ModelId=3EBA49A201D7
	DWORD	tkEvent;		// Absolute time of event
	//##ModelId=3EBA49A201D6
	BYTE	byShortData[4];	// Event type and parameters if channel msg
	//##ModelId=3EBA49A201D5
	DWORD	dwEventLength;	// Length of data which follows if meta or sysex
	//##ModelId=3EBA49A201D4
	LPBYTE	pLongData;		// -> Event data if applicable
};

//##ModelId=3EBA499D032C
class CMIDI  
{
protected:
	typedef vector<TRACK>		TrackArray_t;
	typedef vector<DWORD>		VolumeArray_t;
	typedef vector<CONVERTINFO>	ConvertArray_t;

	enum {
		NUM_CHANNELS = 16,		// 16 volume channels
		VOLUME_INIT = 100,		// 100% volume by default
		NUM_STREAM_BUFFERS = 2,
		OUT_BUFFER_SIZE = 1024,	// Max stream buffer size in bytes
		DEBUG_CALLBACK_TIMEOUT = 2000,
		VOLUME_MIN = 0,
		VOLUME_MAX = 127		// == 100%
	};

public:
	//##ModelId=3EBA499E00AF
	CMIDI();
	//##ModelId=3EBA499E00AE
	virtual ~CMIDI();

	//##ModelId=3EBA499E0090
	BOOL	Create(LPVOID pSoundData, DWORD dwSize, CWnd * pParent = 0);
	//##ModelId=3EBA499E009E
	BOOL	Create(LPCTSTR pszResID, CWnd * pParent = 0);
	//##ModelId=3EBA499E00AB
	BOOL	Create(UINT uResID, CWnd * pParent = 0);

	//##ModelId=3EBA499E008E
	BOOL	Play(BOOL bInfinite = FALSE);
	//##ModelId=3EBA499E008C
	BOOL	Stop(BOOL bReOpen = TRUE);
	//##ModelId=3EBA499E0083
	BOOL	IsPlaying() const { return m_bPlaying; }

	//##ModelId=3EBA499E0082
	BOOL	Pause();
	//##ModelId=3EBA499E0081
	BOOL	Continue();
	//##ModelId=3EBA499E0080
	BOOL	IsPaused() const { return m_bPaused; }

		// Set playback position back to the start
	//##ModelId=3EBA499E007F
	BOOL	Rewind();

		// Get the number of volume channels
	//##ModelId=3EBA499E007E
	DWORD	GetChannelCount() const;

		// Set the volume of a channel in percent. Channels are from 0 to (GetChannelCount()-1)
	//##ModelId=3EBA499E0072
	void	SetChannelVolume(DWORD channel, DWORD percent);

		// Get the volume of a channel in percent
	//##ModelId=3EBA499E0070
	DWORD	GetChannelVolume(DWORD channel) const;
	
		// Set the volume for all channels in percent
	//##ModelId=3EBA499E006E
	void	SetVolume(DWORD percent);

		// Get the average volume for all channels
	//##ModelId=3EBA499E006D
	DWORD	GetVolume() const;

		// Set the tempo of the playback. Default: 100%
	//##ModelId=3EBA499E0060
	void	SetTempo(DWORD percent);

		// Get the current tempo in percent (usually 100)
	//##ModelId=3EBA499E005F
	DWORD	GetTempo() const;

		// You can (un)set an infinite loop during playback.
		// Note that "Play()" resets this setting!
	//##ModelId=3EBA499E005D
	void	SetInfinitePlay(BOOL bSet = TRUE);

protected:	// implementation
		// This function converts MIDI data from the track buffers.
	//##ModelId=3EBA499E0050
	int		ConvertToBuffer(DWORD dwFlags, CONVERTINFO * lpciInfo);

		// Fills in the event struct with the next event from the track
	//##ModelId=3EBA499E0042
	BOOL	GetTrackEvent(TRACK * ptsTrack, TEMPEVENT * pteTemp);

		// Retrieve the next byte from the track buffer, refilling the buffer from
		// disk if necessary.
	//##ModelId=3EBA499E003F
	BOOL	GetTrackByte(TRACK * ptsTrack, LPBYTE lpbyByte) {
				if( DWORD(ptsTrack->pTrackCurrent - ptsTrack->pTrackStart) == ptsTrack->dwTrackLength )
					return FALSE;
				*lpbyByte = *ptsTrack->pTrackCurrent++;
				return TRUE;
			}

		// Attempts to parse a variable length DWORD from the given track.
	//##ModelId=3EBA499E0032
	BOOL	GetTrackVDWord(TRACK * ptsTrack, LPDWORD lpdw);

		// Put the given event into the given stream buffer at the given location.
	//##ModelId=3EBA499E002F
	int		AddEventToStreamBuffer( TEMPEVENT * pteTemp, CONVERTINFO * lpciInfo );

		// Opens a MIDI stream. Then it goes about converting the data into a midiStream buffer for playback.
	//##ModelId=3EBA499E002E
	BOOL	StreamBufferSetup();

	//##ModelId=3EBA499E0023
	void	FreeBuffers();


protected:	// error handling
		// The default implementation writes the error message in the
		// debuggers output window. Override if you want a different
		// behavior.
	//##ModelId=3EBA499E0021
	virtual void	MidiError(MMRESULT Result);

		// Failure in converting track into stream.
		// The default implementation displays the offset and the total
		// number of bytes of the failed track and the error message in
		// the debuggers output window. 
	//##ModelId=3EBA499E0013
	virtual void	TrackError(TRACK *, LPSTR ErrMsg);


protected:	// overridables
		// NOTE THAT, IF YOU OVERRIDE ONE OF THESE METHODS, YOU MUST CALL
		// THE BASE CLASS IMPLEMENTATION TOO!

		// called when a MIDI output device is opened
	//##ModelId=3EBA499E0012
	virtual void	OnMidiOutOpen();
	
		// called when the MIDI output device is closed
	//##ModelId=3EBA499E0011
	virtual void	OnMidiOutClose();

		// called when the specified system-exclusive or stream buffer
		// has been played and is being returned to the application
	//##ModelId=3EBA499E000F
	virtual void	OnMidiOutDone(MIDIHDR &);

		// called when a MEVT_F_CALLBACK event is reached in the MIDI output stream
	//##ModelId=3EBA499E0002
	virtual void	OnMidiOutPositionCB(MIDIHDR &, MIDIEVENT &);


private:	// callback procedure
		// This procedure calls the overridables above.
	//##ModelId=3EBA499D03D8
	static void	CALLBACK	MidiProc(HMIDIOUT, UINT, DWORD, DWORD, DWORD);


protected:	// data members
	//##ModelId=3EBA499D03C9
	DWORD			m_dwSoundSize;
	//##ModelId=3EBA499D03C8
	LPVOID			m_pSoundData;
	//##ModelId=3EBA499D03BB
	DWORD			m_dwFormat;
	//##ModelId=3EBA499D03BA
	DWORD			m_dwTrackCount;
	//##ModelId=3EBA499D03B9
	DWORD			m_dwTimeDivision;
	//##ModelId=3EBA499D03AF
	BOOL			m_bPlaying;
	//##ModelId=3EBA499D03AC
	HMIDISTRM		m_hStream;
	//##ModelId=3EBA499D03A9
	DWORD			m_dwProgressBytes;
	//##ModelId=3EBA499D039A
	BOOL			m_bLooped;
	//##ModelId=3EBA499D0399
	DWORD			m_tkCurrentTime;
	//##ModelId=3EBA499D038C
	DWORD			m_dwBufferTickLength;
	//##ModelId=3EBA499D038B
	DWORD			m_dwCurrentTempo;
	//##ModelId=3EBA499D038A
	DWORD			m_dwTempoMultiplier;
	//##ModelId=3EBA499D037C
	BOOL			m_bInsertTempo;
	//##ModelId=3EBA499D037B
	BOOL			m_bBuffersPrepared;
	//##ModelId=3EBA499D037A
	int				m_nCurrentBuffer;
	//##ModelId=3EBA499D036C
	UINT			m_uMIDIDeviceID;
	//##ModelId=3EBA499D036B
	int				m_nEmptyBuffers;
	//##ModelId=3EBA499D0360
	BOOL			m_bPaused;
	//##ModelId=3EBA499D035F
	UINT			m_uCallbackStatus;
	//##ModelId=3EBA499D035E
	HANDLE			m_hBufferReturnEvent;
	//##ModelId=3EBA499D035B
	CWnd *			m_pWndParent;
	//##ModelId=3EBA499D0355
	TrackArray_t	m_Tracks;
	//##ModelId=3EBA499D0350
	VolumeArray_t	m_Volumes;
	//##ModelId=3EBA499D034B
	ConvertArray_t	m_StreamBuffers;

	// data members especially for ConvertToBuffer()
	//##ModelId=3EBA499D0345
    TRACK *			m_ptsTrack;
	//##ModelId=3EBA499D0340
	TRACK *			m_ptsFound;
	//##ModelId=3EBA499D033D
    DWORD			m_dwStatus;
	//##ModelId=3EBA499D033C
    DWORD			m_tkNext;
	//##ModelId=3EBA499D0332
	DWORD			m_dwMallocBlocks;
	//##ModelId=3EBA499D032F
    TEMPEVENT		m_teTemp;
};

//{{AFX_INSERT_LOCATION}}
// Microsoft Developer Studio will insert additional declarations immediately before the previous line.

#endif // MIDI_h

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美三级韩国三级日本一级| 日韩精品一区二区三区四区视频| 国产一区二区三区四区五区美女| 国产精品久久久久精k8| 日韩一区二区精品在线观看| 欧美日韩国产123区| 91传媒视频在线播放| 国产成人精品亚洲日本在线桃色| 奇米色一区二区三区四区| 五月婷婷久久丁香| 日韩电影在线观看电影| 日本女人一区二区三区| 日本大胆欧美人术艺术动态| 日本中文字幕一区| 免费高清成人在线| 国内精品伊人久久久久av一坑| 精油按摩中文字幕久久| 国产一区二区三区观看| 久久99日本精品| 国内精品国产成人国产三级粉色 | 制服丝袜中文字幕一区| 欧美性猛交xxxx黑人交| 91精品国产综合久久福利软件| 欧美二区三区的天堂| 精品三级在线看| 国产精品久久久久婷婷| 一区二区三区电影在线播| 午夜av电影一区| 黄色日韩三级电影| 99re热视频精品| 欧美三级电影网| 精品毛片乱码1区2区3区| 中文字幕不卡的av| 亚洲丝袜另类动漫二区| 亚洲制服丝袜在线| 天天操天天综合网| 国产精品18久久久久久久久| 99re免费视频精品全部| 精品久久久久久无| 国产欧美日产一区| 日韩avvvv在线播放| 成人国产电影网| 666欧美在线视频| 国产精品剧情在线亚洲| 免费看欧美女人艹b| 99国产精品国产精品毛片| 日韩欧美中文一区| 亚洲精品视频一区二区| 国产呦萝稀缺另类资源| 欧洲一区在线电影| 亚洲国产成人午夜在线一区| 亚洲韩国一区二区三区| 国产伦精一区二区三区| 欧美日韩高清不卡| 国产精品白丝在线| 国产一区日韩二区欧美三区| 欧美片网站yy| 一区二区三区美女| 成人开心网精品视频| 欧美夫妻性生活| 亚洲欧美另类综合偷拍| 国产高清在线精品| 精品国产不卡一区二区三区| 丝袜亚洲另类丝袜在线| 欧美性色黄大片| 中文字幕精品在线不卡| 麻豆成人av在线| 色94色欧美sute亚洲线路二| 日韩一卡二卡三卡四卡| 天天色综合成人网| 欧美久久一区二区| 午夜国产精品一区| 91.com在线观看| 亚洲综合视频在线观看| 91性感美女视频| 4438x成人网最大色成网站| 久久久高清一区二区三区| 国产精品视频看| 婷婷激情综合网| 91丝袜美女网| 久久久久久久电影| 亚洲国产日产av| 色综合天天天天做夜夜夜夜做| 欧美男同性恋视频网站| 国产婷婷色一区二区三区四区| 亚洲美女视频在线观看| 精品一区二区三区久久| 在线精品国精品国产尤物884a| 国产色综合久久| 久久女同精品一区二区| 欧美电影免费观看高清完整版在线观看| 亚洲成人av在线电影| 在线看国产一区| 国产精品久久久一本精品| 久久精品在线观看| 蜜臀av一区二区在线观看| 欧美影视一区在线| 亚洲码国产岛国毛片在线| 粉嫩蜜臀av国产精品网站| 精品成人佐山爱一区二区| 亚洲成人激情社区| 欧美性色黄大片| 亚洲国产精品一区二区www在线| 国产盗摄一区二区三区| 日韩视频永久免费| 久久久精品蜜桃| 亚洲另类色综合网站| 国产精品99久久久久久久女警| 日韩免费高清av| 青青草原综合久久大伊人精品| 欧美手机在线视频| 亚洲国产精品久久艾草纯爱| gogo大胆日本视频一区| 国产精品久久久久久久久快鸭| 国产一区二区福利| 中文字幕高清一区| 亚洲国产综合在线| 一本久道久久综合中文字幕| 日韩亚洲电影在线| 国产一二三精品| 久久久精品影视| 国产成人在线视频播放| 国产欧美一区二区精品性色 | 一区二区三区中文在线| 在线免费不卡视频| 五月天激情综合| 欧美午夜免费电影| 国产日韩欧美精品电影三级在线| 国产成人精品免费看| 综合自拍亚洲综合图不卡区| 色综合天天综合色综合av | 香蕉成人啪国产精品视频综合网| 欧美精品色一区二区三区| 日韩在线一区二区| 久久久久久久综合狠狠综合| 成人久久久精品乱码一区二区三区 | 日韩毛片高清在线播放| 色偷偷88欧美精品久久久| 日韩电影在线观看电影| 国产精品久久久久久久久久免费看| 色悠悠亚洲一区二区| 午夜a成v人精品| 国产精品天干天干在观线| 色综合久久88色综合天天免费| 舔着乳尖日韩一区| 日本一区免费视频| 日本韩国精品一区二区在线观看| 午夜电影一区二区三区| 欧美剧情电影在线观看完整版免费励志电影 | 国产精品亚洲一区二区三区妖精| 日韩一区欧美小说| 日韩精品中文字幕一区二区三区 | 成人av网在线| 日韩影院在线观看| 中文字幕不卡在线观看| 欧洲人成人精品| 国产成都精品91一区二区三| 亚洲免费av高清| 亚洲国产精品v| 欧美一区二区三区的| 国产成人精品在线看| 日韩高清中文字幕一区| 亚洲欧美一区二区三区久本道91| 欧美一区二区三区视频免费| 91丨九色丨蝌蚪丨老版| 蜜臀国产一区二区三区在线播放| 亚洲免费色视频| 久久久久国产成人精品亚洲午夜| 在线观看区一区二| 国产一区在线精品| 午夜欧美视频在线观看| 国产精品久久久久一区二区三区 | 欧美日韩aaa| 午夜精品久久久久久久 | 国产一区二区在线观看视频| 亚洲一区免费视频| 成人免费在线视频观看| 欧美在线一区二区三区| 香蕉成人啪国产精品视频综合网| 亚洲色图欧美在线| 国产精品三级久久久久三级| 久久久久99精品一区| 精品国产伦一区二区三区观看体验| 欧美三级蜜桃2在线观看| 一本一道久久a久久精品| 亚洲v日本v欧美v久久精品| 日韩美女一区二区三区四区| 日韩一区二区视频在线观看| 精品国产百合女同互慰| 欧美日韩国产片| 91精品国产日韩91久久久久久| 欧美三级乱人伦电影| 51精品久久久久久久蜜臀| 欧美一区二区三区免费在线看| 欧美日本一区二区三区| 日韩视频国产视频| 精品免费一区二区三区| 26uuu亚洲综合色| 欧美极品美女视频| 中文字幕一区二区三区四区|