播放midi音乐文件的方法
背景说明:
在游戏编程中,给程序增加音效几乎是必须的;在普通程序中增加音效也会给使用者带来更好的体验;而mid格式的音效文件体积最小(大约1k到数十k),效果却不亚于MP3或Wav(大约数M到数十M);后者体积是前者的100倍以上;除了语音,mid音效都能胜任;因此,掌握播放mid音乐文件的方法很重要;使用mid音效,能极大地减轻程序打包传输的负担,实属编程首选;
下载链接:
用本例程序编译的EXE文件
音乐播放_春节序曲midiMci_api_v1.exe
音乐播放_水车midiApp_v2.rar [C语言版本]
//主程序;
#if 1
//----------------------------------------------+------------------------------------------------*/
//WinAPI入门: 播放midi音乐文件的方法;
#include <windows.h> //WinAPI库;[Win32基础库;]
#include <iostream> //IO流库;[向下兼容stdio.h;]
#include <tchar.h> //文本串格式;[兼容宽字符;]
#pragma comment(lib,"winmm.lib") //[Win32多媒体库;]
//----------------------------------------------+------------------------------------------------*/
//声明本地函数;[非本例必须;]
int CDECL MsgBoxPrintf(TCHAR *szCaption,TCHAR *szFormat, ...); //格式输出;
//----------------------------------------------*/
//v1;主函数;--音乐播放测试版@midiMci_api.cpp;
//MIDI应用;--如何播放MIDI音乐文件;[MIDI文件与本程序在同一目录;兼容UNC网络路径;]
//特别提示;--按注释替换掉消息框语句即可轻松移植到普通C语言程序中;
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,PSTR szCmdLine,int iCmdShow)
{
#define boxTitle TEXT("音乐播放midiMci_v1") //定义消息框标题说明;
//初始化;--打开设备及MIDI文件;
MCI_OPEN_PARMS OpenParms; //定义用于打开设备的参数结构;
OpenParms.lpstrDeviceType = (LPCSTR) MCI_DEVTYPE_SEQUENCER; //设备类型为音序器;
OpenParms.lpstrElementName = (LPCSTR) "春节序曲.mid"; //春节序曲;八月桂花遍地开;
OpenParms.wDeviceID = 0; //打开时自动获取MIDI播放器的ID;
if(mciSendCommand(NULL, MCI_OPEN,
MCI_WAIT |MCI_OPEN_TYPE |MCI_OPEN_TYPE_ID |MCI_OPEN_ELEMENT,(DWORD)&OpenParms)
!=0)MessageBox(NULL,TEXT("MIDI设备无法打开!"),boxTitle,0); //printf("MIDI设备无法打开!");
//播放MIDI文件;--带播放控制;
MCI_PLAY_PARMS PlayParms; //定义控制播放的参数结构;
PlayParms.dwFrom = 0;
if(mciSendCommand(OpenParms.wDeviceID,MCI_PLAY,MCI_FROM,(DWORD)&PlayParms)
==0) //printf("正在播放:\n %s",OpenParms.lpstrElementName);
MsgBoxPrintf(boxTitle,TEXT("正在播放:\n %s"),OpenParms.lpstrElementName);
else MessageBox(NULL,TEXT("MIDI文件无法播放!"),boxTitle,0);
//printf("MIDI文件无法播放!");
return 0;
}
//----------------------------------------------+------------------------------------------------*/
//定义本地函数:
//----------------------------------------------*/
//WinAPI窗口格式输出子函数;[RbY*变参函数设计实例;非本例必须;]
//#include <tchar.h> //包含_vsntprintf();兼容宽字符Unicode;
//#include <stdio.h> //包含sprintf();
int CDECL MsgBoxPrintf(TCHAR *szCaption,TCHAR *szFormat, ...) //格式输出;
{
TCHAR szBuffer[256]; //RbY缓存长度256~1024;
va_list pArgList;
// The va_start macro (defined in STDARG.H) is usually equivalent to:
// pArgList = (char *) &szFormat + sizeof(szFormat);
va_start (pArgList,szFormat);
// The last argument to wvsprintf points to the arguments;
_vsntprintf(szBuffer,sizeof(szBuffer)/sizeof(TCHAR),szFormat,pArgList);
// The va_end macro just zeroes out pArgList for no good reason;
va_end (pArgList) ;
return MessageBox(NULL,szBuffer,szCaption,0);
}
//----------------------------------------------+------------------------------------------------*/
#endif
//v2;播放midi文件的C语言版本;
#if 0
//----------------------------------------------+------------------------------------------------*/
//v2;播放midi音乐文件;[C语言版本;]
//----------------------------------------------*/
//引用库;
#include <windows.h> //WinAPI库;[Win32基础库;包含system();]
#include <iostream> //IO流库;[iostream向下兼容stdio.h;]
#include <tchar.h> //文本串格式;[TCHAR兼容宽字符Unicode;]
#pragma comment(lib,"winmm.lib") //添加库;[Win32多媒体库;]
//----------------------------------------------*/
//主函数;
int main()
{
void midiplay(TCHAR *song); //播放MIDI音乐文件;
system("title 音乐播放midiApp_v2"); //设置cmd窗口标题;
system("mode con cols=43 lines=20"); //设置cmd窗口宽高=字符数;
midiplay("水车.mid");
system("pause");
return 0;
}
//----------------------------------------------*/
//v2;播放MIDI音乐文件;[MIDI文件与本程序在同一目录;]
void midiplay(TCHAR *song) //播放MIDI音乐文件;
{
//初始化;--打开设备及MIDI文件;
MCI_OPEN_PARMS OpenParms; //定义用于打开设备的参数结构;
OpenParms.lpstrDeviceType = (LPCSTR) MCI_DEVTYPE_SEQUENCER; //设备类型为音序器;
OpenParms.lpstrElementName= (LPCSTR) song; //如,春节序曲.mid;八月桂花遍地开.mid;
OpenParms.wDeviceID = 0; //打开时自动获取MIDI播放器的ID;
if(mciSendCommand(NULL, MCI_OPEN,
MCI_WAIT |MCI_OPEN_TYPE |MCI_OPEN_TYPE_ID |MCI_OPEN_ELEMENT,
(DWORD)&OpenParms) !=0)
printf("\nMIDI设备无法打开!");
//播放MIDI文件;--带播放控制;
MCI_PLAY_PARMS PlayParms; //定义控制播放的参数结构;
PlayParms.dwFrom = 0; //从头开始播放;
if(mciSendCommand(OpenParms.wDeviceID,MCI_PLAY,MCI_FROM,
(DWORD)&PlayParms) ==0)
printf("正在播放:\n\t%s\n",OpenParms.lpstrElementName);
else printf("\nMIDI文件无法播放!");
}
//----------------------------------------------+------------------------------------------------*/
#endif