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

📄 eventdata.cpp

📁 游戏编程精粹2第六章源码
💻 CPP
字号:
/* Copyright (C) Scott Patterson, 2001. 
 * All rights reserved worldwide.
 *
 * This software is provided "as is" without express or implied
 * warranties. You may freely copy and compile this source into
 * applications you distribute provided that the copyright text
 * below is included in the resulting source code, for example:
 * "Portions Copyright (C) Scott Patterson, 2001"
 */

// EventData.cpp

#include "StdAfx.h"
#include "EventData.h"
#include "MIDIDef.h"
#include "EventCommand.h"

EventData_t::EventData_t()
{
}

EventData_t::~EventData_t()
{
	delete [] m_pnEventData;
}

void EventData_t::PrintEventDataAsText()
{
	printf( "\"" );
	for( int i=0; i<m_nEventLength; i++ )
	{
		printf( "%c", m_pnEventData[i] );
	}
	printf( "\"" );
}

void EventData_t::PrintEventDataAsBinary()
{
	printf( "Data: " );
	for( int i=0; i<m_nEventLength; i++ )
	{
		printf( "%02x ", m_pnEventData[i] );
	}
}

void EventData_t::SetRuntimeCommand()
{
	m_nRuntimeCommand = EVENT_TYPE_COUNT; // init to out of range value
	int nType;
	switch (m_nEventType)
	{
	case MIDIDEF_MIDIEVENT:
		//printf( "      Details: Midi Event: " );
		if( m_nEventStatus >= 0x80 )
		{
			nType = m_nEventStatus >> 4;
			switch( nType )
			{
			case 0x8:
				m_nRuntimeCommand = EVENT_TYPE_NOTEOFF;
				//printf( " ( NoteOff Key: %d Vel: %d )", m_pnEventData[0], m_pnEventData[1] );
				break;
			case 0x9:
				m_nRuntimeCommand = EVENT_TYPE_NOTEON;
				//printf( " ( NoteOn  Key: %d Vel: %d )", m_pnEventData[0], m_pnEventData[1] );
				break;
			case 0xa:
				//printf( " ( PolyKeyPressure Key: %d Press: %d )", m_pnEventData[0], m_pnEventData[1] );
				break;
			case 0xb:
				if( m_pnEventData[0] == 10 )
				{
					m_nRuntimeCommand = EVENT_TYPE_PAN;
				}
				//printf( " ( Controller: %d Val: %d )", m_pnEventData[0], m_pnEventData[1] );
				break;
			case 0xc:
				m_nRuntimeCommand = EVENT_TYPE_SETINSTRUMENT;
				//printf( " ( Program Change: %d )", m_pnEventData[0] );
				break;
			case 0xd:
				//printf( " ( ChannelPressure: %d )", m_pnEventData[0] );
				break;
			case 0xe:
				//printf( " ( PitchWheel: %d )", ((int)m_pnEventData[0] << 8) | ((int)m_pnEventData[1] & 0xff) );
				break;
			}
		}
		break;
	case MIDIDEF_SYSEXEVENT:
		//printf( "      Details: Sysex Event: " );
		break;
	case MIDIDEF_METAEVENT:
		//printf( "      Details: Meta Event: " );
		switch(m_nEventStatus)
		{
		case MIDIDEF_METASEQN:
			//printf( "METASEQN " );
			break;
		case MIDIDEF_METATEXT:
			//printf( "METATEXT " );
			break;
		case MIDIDEF_METACOPYR:
			//printf( "METACOPYR " );
			break;
		case MIDIDEF_METATNAME:
			//printf( "METATNAME " );
			break;
		case MIDIDEF_METAINAME:
			//printf( "METAINAME " );
			break;
		case MIDIDEF_METALYRIC:
			//printf( "METALYRIC " );
			break;
		case MIDIDEF_METAMARKER:
			//printf( "METAMARKER " );
			break;
		case MIDIDEF_METACUEPT:
			//printf( "METACUEPT " );
			break;
		case MIDIDEF_METACHANPFX:
			//printf( "METACHANPFX " );
			break;
		case MIDIDEF_METAEOT:
			m_nRuntimeCommand = EVENT_TYPE_TRACKEND;
			//printf( "METAEOT " );
			break;
		case MIDIDEF_METATEMPO:
			//nNum = (m_pnEventData[0] << 16) | (m_pnEventData[1] << 8) | (m_pnEventData[2]);
			//nTempo = 60000000L / nNum;
			//printf( "METATEMPO = %d ", nTempo );
			break;
		case MIDIDEF_METASMPTEOFF:
			//printf( "METASMPTEOFF " );
			break;
		case MIDIDEF_METATIMESIG:
			//printf( "METATIMESIG " );
			break;
		case MIDIDEF_METAKEYSIG:
			//printf( "METAKEYSIG " );
			break;
		case MIDIDEF_METASEQEVENT:
			//printf( "METASEQEVENT" );
			break;
		}
		break;
	}
}

u32 EventData_t::GetRuntimeCommand()
{
	return m_nRuntimeCommand;
}

u8 EventData_t::GetEventDataByte( int nByteIndex )
{
	return m_pnEventData[nByteIndex];
}

void EventData_t::Print()
{
	printf( "    Event: " );

	printf( "Time: %8d Type: 0x%02x Length: %4d Status: 0x%02x\n",
		    m_nEventTime, m_nEventType, m_nEventLength, m_nEventStatus );

	unsigned long nNum, nTempo;
	int nType;
	unsigned int i;

	switch (m_nEventType)
	{
	case MIDIDEF_MIDIEVENT:
		printf( "      Details: Midi Event: " );
		if( m_nEventStatus >= 0x80 )
		{
			nType = m_nEventStatus >> 4;
			switch( nType )
			{
			case 0x8:
				printf( " ( NoteOff Key: %d Vel: %d )", m_pnEventData[0], m_pnEventData[1] );
				break;
			case 0x9:
				printf( " ( NoteOn  Key: %d Vel: %d )", m_pnEventData[0], m_pnEventData[1] );
				break;
			case 0xa:
				printf( " ( PolyKeyPressure Key: %d Press: %d )", m_pnEventData[0], m_pnEventData[1] );
				break;
			case 0xb:
				printf( " ( Controller: %d Val: %d )", m_pnEventData[0], m_pnEventData[1] );
				break;
			case 0xc:
				printf( " ( Program Change: %d )", m_pnEventData[0] );
				break;
			case 0xd:
				printf( " ( ChannelPressure: %d )", m_pnEventData[0] );
				break;
			case 0xe:
				printf( " ( PitchWheel: %d )", ((int)m_pnEventData[0] << 8) | ((int)m_pnEventData[1] & 0xff) );
				break;
			}
		} else {
			printf( " ( Data: " );
			for( i=0; i<m_nEventLength; i++ )
			{
				printf( "%02x ", m_pnEventData[i] );
			}
			printf( ")" );
		}

		break;
	case MIDIDEF_SYSEXEVENT:
		printf( "      Details: Sysex Event: " );
		PrintEventDataAsBinary();
		break;
	case MIDIDEF_METAEVENT:
		printf( "      Details: Meta Event: " );
		switch(m_nEventStatus)
		{
		case MIDIDEF_METASEQN:
			printf( "METASEQN " );
			PrintEventDataAsText();
			break;
		case MIDIDEF_METATEXT:
			printf( "METATEXT " );
			PrintEventDataAsText();
			break;
		case MIDIDEF_METACOPYR:
			printf( "METACOPYR " );
			PrintEventDataAsText();
			break;
		case MIDIDEF_METATNAME:
			printf( "METATNAME " );
			PrintEventDataAsText();
			break;
		case MIDIDEF_METAINAME:
			printf( "METAINAME " );
			PrintEventDataAsText();
			break;
		case MIDIDEF_METALYRIC:
			printf( "METALYRIC " );
			PrintEventDataAsText();
			break;
		case MIDIDEF_METAMARKER:
			printf( "METAMARKER " );
			PrintEventDataAsBinary();
			break;
		case MIDIDEF_METACUEPT:
			printf( "METACUEPT " );
			PrintEventDataAsBinary();
			break;
		case MIDIDEF_METACHANPFX:
			printf( "METACHANPFX " );
			PrintEventDataAsBinary();
			break;
		case MIDIDEF_METAEOT:
			printf( "METAEOT " );
			break;
		case MIDIDEF_METATEMPO:
			nNum = (m_pnEventData[0] << 16) | (m_pnEventData[1] << 8) | (m_pnEventData[2]);
			nTempo = 60000000L / nNum;
			printf( "METATEMPO = %d ", nTempo );
			PrintEventDataAsBinary();
			break;
		case MIDIDEF_METASMPTEOFF:
			printf( "METASMPTEOFF " );
			PrintEventDataAsBinary();
			break;
		case MIDIDEF_METATIMESIG:
			printf( "METATIMESIG " );
			PrintEventDataAsBinary();
			break;
		case MIDIDEF_METAKEYSIG:
			printf( "METAKEYSIG " );
			PrintEventDataAsBinary();
			break;
		case MIDIDEF_METASEQEVENT:
			printf( "METASEQEVENT" );
			PrintEventDataAsBinary();
			break;
		default:
			printf( "      Details: Unknown MetaEvent" );
		}
		break;
	default:
		printf( "      Details: Unkown Event Type" );
	}
	printf( "\n" );

}

void EventData_t::SetEventType( u8 nEventType )
{
	m_nEventType = nEventType;
}

void EventData_t::SetEventTime( s32 nEventTime )
{
	m_nEventTime = nEventTime;
}

void EventData_t::SetEventStatus( u8 nEventStatus )
{
	m_nEventStatus = nEventStatus;
}

void EventData_t::SetEventData( u8 *pnEventData, u32 nEventLength )
{
	m_nEventLength = nEventLength;
	m_pnEventData = new u8[nEventLength];
	memcpy( m_pnEventData, pnEventData, nEventLength );
}


⌨️ 快捷键说明

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