MIDI应用: 播放midi音乐文件的方法 [Win32版本+ C语言版本]

播放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
  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值