开发游戏音频程序——播放MIDI文件
在沉寂了一段时间之后。我开始开发游戏的音频程序了。今天我要为大家展示的是我写的播放MIDI的程序,其实不要以为MIDI的载入和播放很复杂,其实它是相当的简单、只需要选用合适的解码器就行了。现在又几种解码器可以选择。MCI和DirectMusic。其中MCI是windows特别对多媒体应用程序提供的API集合,它可以播放很多流行的格式。但是对MIDI的控制性比较低。而DirectMusic则对MIDI有着较丰富的支持,最典型的就是可以控制节奏(tempo)。
我的代码没有对DirectMusic进行封装,使用C的风格制作的。所以大家看起来很好理解。下面我就来展示我写的代码吧。
Main.h
/*---------------------------------------------------------------------------
蒋轶民制作E-mail:jiangcaiyang123@163.com
最后编辑:年月日:42:29
文件名:main.h
作用:头文件的定义
----------------------------------------------------------------------------*/
/*-----------------------------头文件---------------------------------------*/
#include <dmusici.h>
#include <dmusicf.h>
#include "CWaveFile.h"
// 库文件
#pragma comment( lib, "dxguid.lib" )
/*-----------------------------全局变量-------------------------------------*/
IDirectMusicLoader8* g_pLoader = NULL;
IDirectMusicSegment8* g_pSegment = NULL;
IDirectMusicPerformance8* g_pPerformance = NULL;
IDirectMusicSegmentState* g_pSegmentState = NULL;
IDirectMusicAudioPath8* g_pAudioPath = NULL;
/*------------------------获取控制台窗口句柄----------------------------*/
HWND GetConsoleWindowHandle( void )
{
TCHAR title[512];
HWND hWnd;
GetConsoleTitle( title, sizeof( title ) );
hWnd = FindWindow( NULL, title );
return( hWnd );
}
/*------------------------初始化----------------------------------------*/
void Initialize( void )
{
HWND hConsoleWnd = GetConsoleWindowHandle();
HRESULT hr;// 结果的句柄
// 1、初始化COM组件
hr = CoInitialize( NULL );
ThrowIfFailed( hr, "1、初始化COM组件错误。" );
// 2、创建装载器
hr = CoCreateInstance( CLSID_DirectMusicLoader, NULL,
CLSCTX_INPROC, IID_IDirectMusicLoader8, (void**)&g_pLoader );
ThrowIfFailed( hr, "2、创建装载器错误" );
// 3、创建演艺对象
hr = CoCreateInstance( CLSID_DirectMusicPerformance, NULL, CLSCTX_INPROC,
IID_IDirectMusicPerformance8, (void**)&g_pPerformance );
ThrowIfFailed( hr, "3、创建演艺对象错误" );
// 4、初始化音频</