如何在游戏制作中使用MIDI 文件演奏音乐
下面用 DirectX 8 来演奏音乐(MIDI 文件)。
DirectX 的标准声音文件好象是 *.sgt ,不过 MIDI 格式的文件也可以直接播放。 程序概要: 1. 从 WinMain() 中调用开始演奏的函数(InitDirectMusic),在这个函数中进行演奏音乐的全部处理,返回后只是打开 DialogBox(对话框) 让人欣赏音乐。 2. 关闭 DialogBox 时调用停止演奏的函数(FreeDirectMusic),释放所有 object(对象) 并退出程序。 3. 讲得好象还不是太清楚,这里再附加几条说明。(-.-;) (^_^; hr=CoInitialize(NULL); 初始化 DirectMusic 的 COM(Component Object Model|组件对象模型)。 InitializeSynth() 初始化 Software Synthesizer(软件合成) 的函数。 LoadSegment() 载入演奏文件的函数。 注意该函数中如下一段代码: wcscpy( ObjDesc.wszFileName, L"Midi.mid" ); 在这里设定要演奏的 MIDI 文件名。 自己准备个喜欢的 MIDI 文件,改名为 Midi.mid ,放进工程文件夹。 下面说明建立工程的步骤: 1. 新建一个 Win32 Application 空白工程,命名为 "Midi"。 2. 向工程中新建一个 C++ Source File ,命名为 "midi" ,向其中键入篇末附带的源程序。 3. 选择菜单 [Insert|插入]-[Resource...|资源...] 打开 [Insert Resource|插入资源] 面板,在左栏内选中 [Dialog|对话框] ,然后点击 [New|新建] :
(参见 §06. 显示 Dialog Box (对话框)) 这回的 DialogBox 只需要一个 ID = IDC_CLOSE , Caption = CLOSE 的按扭: 保存资源文件,文件名 "dialog.rc" ,然后选择菜单 [Project|工程]-[Add To Project|添加到工程]-[Files...|文件...] ,向工程中添加下面两个文件: dialog.rc resource.h (参见 §06. 显示 Dialog Box (对话框)) 4. 选择菜单 [Project|工程]-[Settings...|设定...] 打开[Project Settings|工程设定] 面板,点击 [Link|链接] 标签,向 [Object/library modules|对象、库模块] 栏内添加下面一个库文件: dxguid.lib
5. 编译并执行! 源程序: /****************************************************/ /*★ 演奏音乐(MIDI 文件) 2001-01-23 前田 稔 ★*/ /****************************************************/ #include #include #include "resource.h" #define ERRMSG(x) MessageBox(NULL, x, "PlayPri", MB_OK); // Global variables for the DirectMusic sample IDirectMusicLoader8* g_pLoader = NULL; IDirectMusicPerformance8* g_pPerformance = NULL; IDirectMusicSegment8* g_pSegment = NULL; // 函数类型说明 HRESULT InitDirectMusic(LPSTR lpCmdLine ); HRESULT InitializeSynth(); HRESULT LoadSegment(); HRESULT FreeDirectMusic(); //★ DlgProc() LRESULT CALLBACK DlgProc(HWND hDlg,UINT message,WPARAM wParam,LPARAM lParam) { switch (message) { case WM_COMMAND: switch (LOWORD(wParam)) { case IDC_CLOSE: PostQuitMessage(0 ); break; } break; case WM_CLOSE: EndDialog(hDlg, TRUE ); return (TRUE); } return FALSE; } //★ Windows 主函数 int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { HRESULT hr; hr = InitDirectMusic(lpCmdLine ); if (FAILED(hr)) { FreeDirectMusic(); return FALSE; }
特别说明:由于各方面情况的不断调整与变化,教育人生网所提供的所有考试信息仅供参考,敬请考生以权威部门公布的正式信息为准。 |