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

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

?? midifile.cpp

?? Nokia手機語音管理程序
?? CPP
?? 第 1 頁 / 共 2 頁
字號:
// MidiFile.cpp
#include "midifile.h"

// --- construct a MIDIFile object to read and parse an SMF file
// +-------------------------------------------------------------
// |
// | Function        : MIDIFile::MIDIFile
// | Description     : 
// |
// | rFile           : 
// | bBypassSysEx    : 
// | 
// +-------------------------------------------------------------
MIDIFile::MIDIFile(std::ifstream& rFile,bool bBypassSysEx) : 
						m_pIfile(&rFile),
						m_bBypassSysEx(bBypassSysEx)
{
	InitializeMembers();
	m_pOfile = 0;
}

// --- construct a MIDIFile object to write an SMF file
// +-------------------------------------------------------------
// |
// | Function        : MIDIFile::MIDIFile
// | Description     : 
// |
// | rFile           : 
// | format          : 
// | tracks          : 
// | division        : 
// | 
// +-------------------------------------------------------------
MIDIFile::MIDIFile(std::ofstream& rFile, Short format,Short tracks,Short division) : 
						m_pOfile(&rFile)
{
	assert(tracks == 1 || format != 0);
	assert(format >= 0 && format <= 2);
	InitializeMembers();
	m_nFormat = format;
	m_nTracks = tracks;
	m_nDivision = division;
	m_pIfile = 0;
}

// ---- called by constructors to initialize the data members
// +-------------------------------------------------------------
// |
// | Function        : MIDIFile::InitializeMembers
// | Description     : 
// | 
// +-------------------------------------------------------------
void MIDIFile::InitializeMembers()
{
	// --- ensure that typedefs are properly set
	assert(sizeof(Short) == 2 && sizeof(Long) == 4);
	m_nFormat = 0;
	m_nTracks = 0;
	m_nDivision = 0;
	m_nDeltaTime = 0;
	m_bEot = false;
	m_bOverride = false;
	m_bBypassSysEx = false;
	m_bWritingTrack = false;
	m_nTrackNo = 0;
	m_nTrackLength = 0;
}

// ------ get a byte from the SMF file
// +-------------------------------------------------------------
// |
// | Function        : MIDIFile::GetMIDIChar
// | Description     : 
// | 
// +-------------------------------------------------------------
Short MIDIFile::GetMIDIChar() throw (MFBadEof)
{
	if (m_pIfile->eof())			// eof should not occur because length values 
		throw MFBadEof();			// in file control when to call for characters
	if (m_pIfile->fail())			// if file does not exist or other input problem
		throw MFIFileFail();
	char ch;
	m_pIfile->get(ch);
	return static_cast<Short>(ch) & 0x00ff;
}

// ------- get a byte from the SMF file's track chunk
// +-------------------------------------------------------------
// |
// | Function        : MIDIFile::GetMIDITrackChar
// | Description     : 
// | 
// +-------------------------------------------------------------
Short MIDIFile::GetMIDITrackChar() throw (MFBadTrkData)
{
	if (--m_nTrackLength < 0)		// if the track length is exhausted, we
		throw MFBadTrkData();		// should not be asking for more bytes
	return GetMIDIChar();
}

// ---- convert byte stream to integer (Endian conversion from MIDI to X86)
// +-------------------------------------------------------------
// |
// | Function        : MIDIFile::AtoInt
// | Description     : 
// |
// | str             : 
// | nLen            : 
// | 
// +-------------------------------------------------------------
Long MIDIFile::AtoInt(const char* str,int nLen)
{
	Long rtn = 0;
	for (int i = 0; i < nLen; i++)	{
		rtn <<= 8;
		rtn |= (static_cast<Long>(str[i] & 0x000000ff));
	}
	return rtn;
}

// ---- read a fixed-length integer
// +-------------------------------------------------------------
// |
// | Function        : MIDIFile::ReadInt
// | Description     : 
// |
// | nCount          : 
// | 
// +-------------------------------------------------------------
Long MIDIFile::ReadInt(int nCount)
{
	char* str = new char[nCount];
	// --- read the bytes into a buffer
	for (int i = 0; i < nCount; i++)
		str[i] = GetMIDIChar();
	// --- convert the buffer to an integer
	Long rtn = AtoInt(str,nCount);
	delete [] str;
	return rtn;
}

// +-------------------------------------------------------------
// |
// | Function        : MIDIFile::WriteInt
// | Description     : 
// |
// | nCount          : 
// | value           : 
// | 
// +-------------------------------------------------------------
void MIDIFile::WriteInt(int nCount,Long value)
{
	char str[4];
	int i;
	for (i = 3; i >= 0; --i)	{
		str[i] = static_cast<unsigned char>(value & 0xff);
		value >>= 8;
	}
	for (i = 4 - nCount; i < 4; i++)
		m_pOfile->put(str[i]);
}

// ---- read the SMF header chunk
// +-------------------------------------------------------------
// |
// | Function        : MIDIFile::ReadHeader
// | Description     : 
// | 
// +-------------------------------------------------------------
void MIDIFile::ReadHeader() throw (std::runtime_error)
{
	char buff[5];	// Buffer for signature "MThd"
	// ----- read the signature
	for (int i = 0; i < 4; i++)
		buff[i] = GetMIDIChar();
	buff[i] = '\0';
	// ----- validate the signature
	if (std::string(buff) != "MThd")
		throw MFBadSig();
	// Read and validate the header length (must be 6)
	if (Read32() != 6)
		throw MFBadHdrLen();
	// Read the file format (0, 1, 2)
	if ((m_nFormat = Read16()) > 2)
		throw MFBadFmt();
	// Read the number of tracks
	if ((m_nTracks = Read16()) < 0)
		throw MFBadTrks();
	// Read the quarter-note division
	if ((m_nDivision = Read16()) < 0)
		throw MFBadDiv();
	// --- notify the user of the header and its contents
	Header(m_nFormat,m_nTracks,m_nDivision);
}

// ---- read an SMF variable length integer value (event lengths and delta times)
//      encoded as a byte stream
//      the last byte has the msb == 0
//      all others have msb == 1
//      bits 0-7 contain the parts of the integer
// +-------------------------------------------------------------
// |
// | Function        : MIDIFile::ReadVarLength
// | Description     : 
// |
// | exc             : 
// | 
// +-------------------------------------------------------------
Long MIDIFile::ReadVarLength(std::runtime_error& exc) throw (std::runtime_error)
{
	Long value = 0;
	int c;
	do	{
		c = GetMIDITrackChar();
		value = (value << 7) + (c & 0x7f);
	} while (c & 0x80);
	if (value < 0)
		throw exc;
	return value;
}

// ---- write an SMF variable length integer value
//      return the number of bytes written
// +-------------------------------------------------------------
// |
// | Function        : MIDIFile::WriteVarLength
// | Description     : 
// |
// | value           : 
// | 
// +-------------------------------------------------------------
int MIDIFile::WriteVarLength(Long value)
{
	unsigned char cBytes[4];
	int nCt = 1;
	for (int i = 3; i >= 0; --i)	{
		*(cBytes + i) = (unsigned char)(value & 0x7f);
		value >>= 7;
	}
	for (i = 0; i < 3; i++)	{
		if (*(cBytes + i) != 0)	{
			while (i < 3)	{
				*(cBytes + i) |= 0x80;
				m_pOfile->put(cBytes[i++]);
				nCt++;
			}
		}
	}
	m_pOfile->put(cBytes[3]);
	return nCt;
}

// --- return number of parameters based on channel status code
// +-------------------------------------------------------------
// |
// | Function        : MIDIFile::ParamCount
// | Description     : 
// |
// | status          : 
// | 
// +-------------------------------------------------------------
int MIDIFile::ParamCount(Short status)
{
	if (status == 0xf2)	// not sure whether f2 & f3 would ever
		return 2;
	if (status == 0xf3)	// be in an SMF file, but better be safe
		return 1;
	if (status >= 0xf0)
		return 0;
	if (status >= 0xe0)
		return 2;
	if (status < 0xc0)
		return 2;
	return 1;
}

// ---- Read a system exclusive message
// +-------------------------------------------------------------
// |
// | Function        : MIDIFile::ReadSysex
// | Description     : 
// | 
// +-------------------------------------------------------------
void MIDIFile::ReadSysex()
{
	// Read length of system exclusive event
	Long length = ReadVarLength(MFBadMetaEvLen());
	if (m_bBypassSysEx)	{
		// ---- bypass the system exclusive event
		for (int i = 0; i < length; i++)
			GetMIDITrackChar();
		SystemExclusive(m_nDeltaTime,length,0);
	}
	else	{
		m_data.EventBuffer(length);
		// Read in the system exclusive event
		for (int i = 0; i < length; i++)
			m_data.bf[i] = GetMIDITrackChar();
		SystemExclusive(m_nDeltaTime,length,m_data.bf);
	}
}

// ---- Read a system exclusive message packet
// +-------------------------------------------------------------
// |
// | Function        : MIDIFile::ReadSysexPacket
// | Description     : 
// | 
// +-------------------------------------------------------------
void MIDIFile::ReadSysexPacket()
{
	// Read length of system exclusive event packet
	Long length = ReadVarLength(MFBadMetaEvLen());
	if (m_bBypassSysEx)	{
		// ---- bypass the system exclusive event packet
		for (int i = 0; i < length; i++)
			GetMIDITrackChar();
		SystemExclusivePacket(m_nDeltaTime,length,0);
	}
	else	{
		m_data.EventBuffer(length);
		// Read in the system exclusive event packet
		for (int i = 0; i < length; i++)
			m_data.bf[i] = GetMIDITrackChar();
		SystemExclusivePacket(m_nDeltaTime,length,m_data.bf);
	}
}

// ---- read a meta event
// +-------------------------------------------------------------
// |
// | Function        : MIDIFile::ReadMeta
// | Description     : 
// | 
// +-------------------------------------------------------------
void MIDIFile::ReadMeta() throw (std::runtime_error)
{
	// --------- Meta message
	int msg_type = GetMIDITrackChar();	// Type of meta-event
	// Read length of meta event
	Long length = ReadVarLength(MFBadMetaEvLen());
	m_data.EventBuffer(length);
	// Read in the meta event
	for (int i = 0; i < length; i++)
		m_data.bf[i] = GetMIDITrackChar();
	switch(msg_type) {
		case META_SEQNUM:	// Sequence number
			if (length < 2)
				throw MFBadMetaEvLen();
			SequenceNum(m_nDeltaTime,static_cast<Short>(AtoInt(m_data.bf,2)));
			break;
		case META_TEXT:			// Text event
		case META_COPYRIGHT:	// Copyright notice
		case META_SEQTRKNAME:	// Sequence name
		case META_INSTNAME:		// Instrument name
		case META_LYRIC:		// Lyric
		case META_MARKER:		// Marker
		case META_CUEPT:		// Cue point
			TextEvent(m_nDeltaTime,msg_type,length,m_data.bf);
			break;
		case META_TEMPO:	// Set tempo
			if (length < 3)
				throw MFBadMetaEvLen();
			Tempo(m_nDeltaTime,AtoInt(m_data.bf,3));
			break;
		case META_SMPTE:	// SMPTE offset
		{
			if (length < 5)
				throw MFBadMetaEvLen();
			int hour  = static_cast<int>(m_data.bf[0]);
			int min   = static_cast<int>(m_data.bf[1]);
			int sec   = static_cast<int>(m_data.bf[2]);
			int frame = static_cast<int>(m_data.bf[3]);
			int fract = static_cast<int>(m_data.bf[4]);
			SMPTE(m_nDeltaTime,hour,min,sec,frame,fract);
			break;
		}
		case META_TIMESIG:	// Time signature
		{
			if (length < 4)
				throw MFBadMetaEvLen();
			int numer  = static_cast<int>(m_data.bf[0]);
			int denom  = static_cast<int>(m_data.bf[1]);
			int clocks = static_cast<int>(m_data.bf[2]);
			int qnotes = static_cast<int>(m_data.bf[3]);
			TimeSignature(m_nDeltaTime,numer,denom,clocks,qnotes);
			break;
		}
		case META_KEYSIG:	// Key signature
		{
			if (length < 2)
				throw MFBadMetaEvLen();
			int sharpflat = static_cast<int>(m_data.bf[0]);
			int minor    = (static_cast<int>(m_data.bf[1]) == 1);
			if (sharpflat > 7 || sharpflat < -7 || 
					(minor != 0 && minor != 1))
				throw MFBadMetaEvVal();
			KeySignature(m_nDeltaTime,sharpflat,minor == 1);
			break;
		}
		case META_SEQSPEC:	// Sequencer-specific
			SequencerSpecific(m_nDeltaTime,length,m_data.bf);
			break;
		case META_CHANPFX:	// Channel prefix
			if (length < 1)
				throw MFBadMetaEvLen();
			ChannelPrefix(m_nDeltaTime,m_data.bf[0]);
			break;
		case META_EOT:		// End of track
			if (length != 0)
				throw MFBadMetaEvLen();
			EndOfTrack(m_nDeltaTime);
			m_bEot = true;
			break;
		default:
			UnknownMetaType(m_nDeltaTime,msg_type);
			break;
	}
}

// ----- read an event chunk
// +-------------------------------------------------------------
// |
// | Function        : MIDIFile::ReadEvent
// | Description     : 
// | 
// +-------------------------------------------------------------
void MIDIFile::ReadEvent() throw (std::runtime_error)
{
	static unsigned char running_status = 0x00;	// Running status
	static unsigned char params[2];				// Event parameters
	int cur_param;			// Parameter being currently read
	m_bOverride = true;		// false if user does not override event function
	// -------- Read delta-time
	Long delta_time = ReadVarLength(MFBadDeltaTime());
	m_nDeltaTime += delta_time;
	// -------- Read event type
	unsigned char stat = GetMIDITrackChar();
	if (stat & 0x80)	{	// Is it a new event type?
		running_status = stat;	// Set new running status
		cur_param = 0;		// Start reading at 0th param
	} else {
		// --- continuation of running status
		params[0] = stat;	// Record 1st parameter
		cur_param = 1;		// Start reading at 1st param
	}
	// -------- Read the parameters corresponding to the status byte
	for (int i = ParamCount(running_status)-cur_param; i > 0; i--,cur_param++)
		params[cur_param] = GetMIDITrackChar();
	// ---- break status into its two parts
	int channel = running_status & 0x0f;
	int event = running_status & 0xf0;
	switch (event) {
		case MIDI_NOTEOFF:	// Note off
			NoteOff(m_nDeltaTime,channel,params[0],params[1]);
			break;
		case MIDI_NOTEON:	// Note on
			NoteOn(m_nDeltaTime,channel,params[0],params[1]);
			break;
		case MIDI_PRESSURE:	// Polyphonic key pressure
			Pressure(m_nDeltaTime,channel,params[0],params[1]);
			break;
		case MIDI_CONTROL:	// Control change
			Controller(m_nDeltaTime,channel,params[0],params[1]);
			break;
		case MIDI_PROGRAM:	// Program change
			ProgramChange(m_nDeltaTime,channel,params[0]);
			break;
		case MIDI_CHANPRES:	// Channel pressure
			ChannelPressure(m_nDeltaTime,channel,params[0]);
			break;
		case MIDI_PITCHBEND:// Pitch wheel change
		{
			Short pitch = (static_cast<Short>(AtoInt(reinterpret_cast<const char*>(params),2)));
			PitchBend(m_nDeltaTime,channel,pitch);
			break;
		}
		case SYSEX_META:	// System-exclusive or meta event
			switch (running_status)	{
				case 0xf0:
					ReadSysex();
					break;
				case 0xf7:
					ReadSysexPacket();
					break;
				case 0xff:
					ReadMeta();
					break;
				// ------- ( there are several realtime events, but they
				//      would not be found in an SMF file -------------
				default:
					UnknownStatus(m_nDeltaTime,channel,event);
					break;
			}
			break;
		default:
			UnknownStatus(m_nDeltaTime,channel,event);
			break;
	}
	// --- If the user overrides the event, set delta time to 0.
	//     Otherwise allow it to accumulate so that the variable always
	//     represents elapsed time since the last user-intercepted event.
	//	   How do we know? The overridable functions set m_bOverride to
	//     false. Overriding functions do not.
	if (m_bOverride)
		m_nDeltaTime = 0;
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
成人小视频免费在线观看| 美女在线观看视频一区二区| 久久综合九色综合欧美就去吻| 一本到高清视频免费精品| 高清成人在线观看| 国产69精品久久久久777| 精品一区二区免费视频| 久久99这里只有精品| 久久精品国产一区二区| 久久99精品久久久| 国产麻豆视频精品| 国产白丝精品91爽爽久久| 国产精品一区二区在线观看不卡| 精品影视av免费| 国产精品99久| 成人毛片在线观看| 9人人澡人人爽人人精品| 色8久久精品久久久久久蜜| 在线观看视频一区| 欧美电影在线免费观看| 日韩精品资源二区在线| 久久精品视频一区二区三区| 欧美国产乱子伦 | 久久久国产精华| 欧美高清在线一区| 亚洲精品视频观看| 婷婷六月综合亚洲| 国产又黄又大久久| 99久久精品国产导航| 欧美日韩亚洲综合一区二区三区| 日韩一本二本av| 国产精品天天看| 亚洲综合激情另类小说区| 日本亚洲电影天堂| 国产成a人无v码亚洲福利| 欧美色视频在线观看| 欧美精品久久一区| 中文字幕电影一区| 午夜成人免费电影| 国产69精品久久久久777| 欧美日韩亚洲另类| 国产午夜久久久久| 亚洲成a人v欧美综合天堂下载| 美女视频黄久久| 色婷婷激情综合| 欧美一二三区在线观看| 国产精品福利影院| 久久国产尿小便嘘嘘尿| 94-欧美-setu| www国产成人| 一区二区日韩电影| 国产不卡免费视频| 欧美一区二区精品久久911| 中文字幕一区二区三区乱码在线| 日韩电影在线免费看| 91丨九色丨蝌蚪富婆spa| 久久网站热最新地址| 天天亚洲美女在线视频| 91麻豆国产自产在线观看| 久久久久一区二区三区四区| 午夜精品久久久| 色94色欧美sute亚洲线路二| 久久精品亚洲麻豆av一区二区| 日韩成人午夜电影| 欧美性色欧美a在线播放| 中文字幕亚洲精品在线观看| 国产一区二区三区综合| 日韩欧美国产精品| 视频一区中文字幕| 欧美日韩国产中文| 亚洲电影一级片| 在线中文字幕一区| 亚洲精品免费在线观看| av男人天堂一区| 国产精品久久夜| 成人激情综合网站| 中文字幕 久热精品 视频在线| 激情五月播播久久久精品| 制服.丝袜.亚洲.中文.综合| 一区二区三区四区在线免费观看| 99精品一区二区| 亚洲欧美综合另类在线卡通| 成人蜜臀av电影| 国产精品乱码久久久久久| 成人午夜激情在线| 久久精品欧美日韩精品| 粉嫩蜜臀av国产精品网站| 欧美国产日本韩| 成人av在线网| 亚洲日穴在线视频| 91久久精品一区二区二区| 艳妇臀荡乳欲伦亚洲一区| 欧美伊人精品成人久久综合97| 亚洲一区中文日韩| 欧美日韩国产片| 日韩成人伦理电影在线观看| 日韩一区二区免费在线电影| 激情五月婷婷综合网| 中文字幕av一区二区三区高| 成人开心网精品视频| 亚洲欧美日韩中文字幕一区二区三区 | 久久久亚洲精品一区二区三区| 久久精品国产精品亚洲红杏| 久久新电视剧免费观看| 成人午夜电影小说| 亚洲视频一区在线观看| 欧美日高清视频| 国产一区二区三区电影在线观看| 久久众筹精品私拍模特| 91丨porny丨国产入口| 亚洲大片在线观看| 欧美成人a∨高清免费观看| 国产成人精品1024| 亚洲一区二区在线观看视频| 日韩三级中文字幕| av电影在线观看一区| 一区二区在线观看不卡| 亚洲精品一区二区三区香蕉| 国产精品中文字幕欧美| 一区二区三区四区av| 日韩一级在线观看| 波多野结衣在线一区| 日日欢夜夜爽一区| 国产精品青草久久| 51精品视频一区二区三区| 国产福利一区二区三区| 亚洲永久精品大片| 国产肉丝袜一区二区| 欧美唯美清纯偷拍| 成人精品小蝌蚪| 青青草成人在线观看| 日韩一区有码在线| 精品福利视频一区二区三区| 色94色欧美sute亚洲线路一ni | 欧美mv日韩mv| 色综合视频一区二区三区高清| 日本亚洲三级在线| 亚洲男人的天堂一区二区| 精品噜噜噜噜久久久久久久久试看 | 国产精品乱人伦一区二区| 91麻豆精品国产自产在线观看一区| 懂色一区二区三区免费观看| 久久精品国产第一区二区三区| 一区二区三区久久久| 国产精品色一区二区三区| 亚洲精品一区二区精华| 欧美剧在线免费观看网站| 99国产精品99久久久久久| 国产成人亚洲综合a∨婷婷图片| 日韩国产精品大片| 亚洲国产精品一区二区久久 | 国产欧美一区二区精品性色超碰| 在线不卡欧美精品一区二区三区| 91欧美一区二区| 成人毛片在线观看| 成人性视频免费网站| 国产一区二区美女诱惑| 精品一区二区三区在线播放| 美国精品在线观看| 日本不卡免费在线视频| 婷婷久久综合九色综合绿巨人| 一区二区三区精品| 亚洲美女区一区| 国产精品人妖ts系列视频| 欧美激情综合网| 国产女主播一区| 国产偷国产偷亚洲高清人白洁| 久久综合久久久久88| 久久婷婷国产综合精品青草 | 国产三级久久久| 久久久精品综合| 中文字幕欧美区| 成人欧美一区二区三区1314| 亚洲欧美怡红院| 亚洲视频在线观看三级| 亚洲精选视频在线| 亚洲一区av在线| 亚洲大片一区二区三区| 天天综合天天做天天综合| 日韩国产欧美在线观看| 免费欧美在线视频| 国产一区二区免费看| 大尺度一区二区| 91蝌蚪国产九色| 欧美日韩第一区日日骚| 欧美本精品男人aⅴ天堂| 久久嫩草精品久久久精品| 国产精品美女www爽爽爽| 中文字幕永久在线不卡| 亚洲成va人在线观看| 麻豆精品一区二区| 成人综合婷婷国产精品久久免费| 91在线小视频| 91.麻豆视频| 久久综合av免费| 亚洲乱码精品一二三四区日韩在线| 午夜视频久久久久久| 国产一区欧美日韩| 91麻豆精东视频| 欧美v日韩v国产v|