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

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

?? midi.h

?? 經典的一款俄羅斯方塊-源程序.java.~
?? H
字號:
/////////////////////////////////////////////////////////////////////////////
// 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.
/////////////////////////////////////////////////////////////////////////////


// 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
//
struct TRACK
{
	DWORD	fdwTrack;		// Track's flags
	DWORD	dwTrackLength;	// Total bytes in track
	LPBYTE	pTrackStart;	// -> start of track data buffer
	LPBYTE	pTrackCurrent;	// -> next byte to read in buffer
	DWORD	tkNextEventDue;	// Absolute time of next event in track
	BYTE	byRunningStatus;// Running status from last channel msg

	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.
struct CONVERTINFO
{
    MIDIHDR	mhBuffer;			// Standard Windows stream buffer header
    DWORD	dwStartOffset;		// Start offset from mhStreamBuffer.lpStart
    DWORD	dwMaxLength;		// Max length to convert on this pass
    DWORD	dwBytesRecorded;
    DWORD	tkStart;
    BOOL	bTimesUp;

	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
struct TEMPEVENT
{
	DWORD	tkEvent;		// Absolute time of event
	BYTE	byShortData[4];	// Event type and parameters if channel msg
	DWORD	dwEventLength;	// Length of data which follows if meta or sysex
	LPBYTE	pLongData;		// -> Event data if applicable
};

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
	};

public:
	CMIDI();
	virtual ~CMIDI();

	BOOL	Create(LPVOID pSoundData, DWORD dwSize, CWnd * pParent = 0);
	BOOL	Create(LPCTSTR pszResID, CWnd * pParent = 0);
	BOOL	Create(UINT uResID, CWnd * pParent = 0);

	BOOL	Play(BOOL bInfinite = FALSE);
	BOOL	Stop(BOOL bReOpen = TRUE);
	BOOL	IsPlaying() const { return m_bPlaying; }

	BOOL	Pause();
	BOOL	Continue();
	BOOL	IsPaused() const { return m_bPaused; }

		// Set playback position back to the start
	BOOL	Rewind();

		// Get the number of volume channels
	DWORD	GetChannelCount() const;

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

		// Get the volume of a channel in percent
	DWORD	GetChannelVolume(DWORD channel) const;
	
		// Set the volume for all channels in percent
	void	SetVolume(DWORD percent);

		// Get the average volume for all channels
	DWORD	GetVolume() const;

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

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

		// Retrieve the next byte from the track buffer, refilling the buffer from
		// disk if necessary.
	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.
	BOOL	GetTrackVDWord(TRACK * ptsTrack, LPDWORD lpdw);

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

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

	void	FreeBuffers();


protected:	// error handling
		// The default implementation writes the error message in the
		// debuggers output window. Override if you want a different
		// behavior.
	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. 
	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
	virtual void	OnMidiOutOpen();
	
		// called when the MIDI output device is closed
	virtual void	OnMidiOutClose();

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

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


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


protected:	// data members
	DWORD			m_dwSoundSize;
	LPVOID			m_pSoundData;
	DWORD			m_dwFormat;
	DWORD			m_dwTrackCount;
	DWORD			m_dwTimeDivision;
	BOOL			m_bPlaying;
	HMIDISTRM		m_hStream;
	DWORD			m_dwProgressBytes;
	BOOL			m_bLooped;
	DWORD			m_tkCurrentTime;
	DWORD			m_dwBufferTickLength;
	DWORD			m_dwCurrentTempo;
	DWORD			m_dwTempoMultiplier;
	BOOL			m_bInsertTempo;
	BOOL			m_bBuffersPrepared;
	int				m_nCurrentBuffer;
	UINT			m_uMIDIDeviceID;
	int				m_nEmptyBuffers;
	BOOL			m_bPaused;
	UINT			m_uCallbackStatus;
	HANDLE			m_hBufferReturnEvent;
	CWnd *			m_pWndParent;
	TrackArray_t	m_Tracks;
	VolumeArray_t	m_Volumes;
	ConvertArray_t	m_StreamBuffers;

	// data members especially for ConvertToBuffer()
    TRACK *			m_ptsTrack;
	TRACK *			m_ptsFound;
    DWORD			m_dwStatus;
    DWORD			m_tkNext;
	DWORD			m_dwMallocBlocks;
    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一区二区三区免费野_久草精品视频
成人午夜电影久久影院| 欧美日本韩国一区二区三区视频| 欧美网站一区二区| ww久久中文字幕| 香蕉av福利精品导航| 成人国产精品免费网站| 日韩欧美亚洲一区二区| 亚洲一级二级在线| 成人av在线资源网站| 精品国产乱码久久久久久影片| 亚洲另类在线制服丝袜| 99久久精品久久久久久清纯| 精品88久久久久88久久久| 亚洲444eee在线观看| 在线观看亚洲成人| 亚洲美女一区二区三区| 成人激情综合网站| 国产网红主播福利一区二区| 精品一区二区三区免费| 日韩欧美一区二区视频| 蜜臂av日日欢夜夜爽一区| 欧美精品免费视频| 午夜亚洲福利老司机| 欧洲亚洲国产日韩| 亚洲一区在线视频观看| 色婷婷av久久久久久久| 亚洲日本成人在线观看| 在线观看av一区| 亚洲国产日产av| 欧美精品 日韩| 亚洲成人av一区二区| 欧美日韩精品电影| 日本不卡视频在线观看| 欧美成人r级一区二区三区| 老鸭窝一区二区久久精品| 午夜精品福利一区二区三区蜜桃| 久久精品一级爱片| 国产自产高清不卡| 国产色产综合色产在线视频| 国产成人av资源| 中文字幕一区二区三区在线观看| av成人免费在线| 亚洲综合一区二区三区| 欧美视频中文一区二区三区在线观看| 亚洲mv在线观看| 日韩精品在线看片z| 国产成人av资源| 亚洲欧美日韩中文播放| 欧美乱妇20p| 精品一区二区在线观看| 国产女主播在线一区二区| 99re66热这里只有精品3直播| 亚洲综合成人在线视频| 欧美电影精品一区二区| 99在线精品视频| 日韩成人精品在线观看| 久久久久久久电影| 亚洲在线中文字幕| 国产在线一区二区| 国产精品初高中害羞小美女文| 91啦中文在线观看| 免费人成在线不卡| 中文乱码免费一区二区| 欧美日韩在线播放一区| 国产一区二区按摩在线观看| 亚洲欧美另类在线| 精品久久久久99| 色国产综合视频| 国产又粗又猛又爽又黄91精品| 亚洲精品自拍动漫在线| 精品嫩草影院久久| 欧美性受xxxx| 国产成人精品三级麻豆| 午夜精品福利一区二区蜜股av | 日本伊人精品一区二区三区观看方式 | 在线播放国产精品二区一二区四区| 欧美麻豆精品久久久久久| 狠狠久久亚洲欧美| 亚洲线精品一区二区三区 | 1024成人网| 日韩一级黄色片| 色婷婷综合久久久中文一区二区| 精品亚洲成a人在线观看| 亚洲综合一区二区| 欧美国产一区视频在线观看| 51精品视频一区二区三区| 97久久精品人人澡人人爽| 精品一区二区三区欧美| 日本女人一区二区三区| 亚洲一本大道在线| 亚洲欧洲日韩av| 国产欧美日韩三级| 欧美精品一区二区三区蜜桃视频| 69av一区二区三区| 欧美影片第一页| 91一区一区三区| jlzzjlzz欧美大全| 国产福利91精品| 国产精品福利电影一区二区三区四区| 99久精品国产| 粉嫩蜜臀av国产精品网站| 黄色精品一二区| 美女爽到高潮91| 老司机午夜精品99久久| 奇米一区二区三区av| 午夜电影久久久| 日韩精品91亚洲二区在线观看| 亚洲综合丁香婷婷六月香| 亚洲精品免费在线观看| 亚洲欧美日韩国产成人精品影院| 国产精品久久久久久久久免费相片| 久久先锋影音av| 国产日韩欧美a| 国产精品美女久久久久av爽李琼| 久久久久久99久久久精品网站| 91精品国产91久久综合桃花| 欧美日韩精品综合在线| 欧美精品在线视频| 7878成人国产在线观看| 欧美一区二区人人喊爽| 日韩精品自拍偷拍| 国产视频一区在线观看| 中文字幕的久久| 中文字幕综合网| 亚洲国产日产av| 另类调教123区| 国产精品911| 欧美日韩精品欧美日韩精品一综合| 国产精品剧情在线亚洲| 国产精品久久久久久久久免费桃花| 国产精品久久久一区麻豆最新章节| 中文字幕一区在线观看| 亚洲欧洲制服丝袜| 日韩国产在线一| 国产在线视频一区二区| 97精品电影院| 欧美浪妇xxxx高跟鞋交| 久久嫩草精品久久久精品| 亚洲天堂成人在线观看| 肉肉av福利一精品导航| 激情av综合网| 在线免费一区三区| 欧美www视频| 亚洲卡通动漫在线| 久国产精品韩国三级视频| 成人精品gif动图一区| 欧美精品在线一区二区| 国产亚洲欧洲997久久综合| 亚洲激情欧美激情| 国内外成人在线| 欧美伊人久久久久久久久影院| 久久综合丝袜日本网| 一区二区在线观看不卡| 精品影视av免费| 精品久久一区二区| 韩国精品主播一区二区在线观看| 国产综合色产在线精品| 色综合久久久久综合体| 日韩一区二区中文字幕| 亚洲欧美欧美一区二区三区| 美女视频免费一区| 色综合久久综合网欧美综合网| 欧美一级午夜免费电影| 亚洲激情图片小说视频| 国产成人夜色高潮福利影视| 欧美日韩三级在线| 中文字幕日韩av资源站| 极品少妇xxxx精品少妇偷拍| 欧美日本高清视频在线观看| av不卡免费在线观看| 夜夜精品视频一区二区| 激情综合网激情| 欧美日韩国产另类一区| 亚洲国产电影在线观看| 另类成人小视频在线| 欧美三级乱人伦电影| 亚洲欧洲日韩在线| 国产成人在线观看免费网站| 欧美一区二区三区免费在线看| 亚洲欧洲制服丝袜| 99久久综合99久久综合网站| 国产调教视频一区| 国产一区二区三区四| 欧美精品九九99久久| 亚洲午夜精品久久久久久久久| 99久久亚洲一区二区三区青草| 国产日韩欧美a| 国产v综合v亚洲欧| 久久久久久日产精品| 国产综合久久久久久久久久久久| 91精品国产麻豆国产自产在线 | 欧美日韩精品一区二区三区蜜桃| 中文字幕一区在线| 粉嫩在线一区二区三区视频| 久久看人人爽人人| 国产成人av电影在线| 久久精品男人的天堂| 午夜精品久久久久久久久| 午夜久久久影院| 欧美色大人视频|