如何用VC编写MIDI文件播放程序

本文介绍了如何使用VC和Win32 API的MCI接口来播放MIDI文件。MIDI是一种乐器数字接口协议,适用于电子键盘和其他音乐设备。通过ShellExecute虽然可以打开MIDI文件,但无法自动播放,而MCI类则提供了自动播放和更多控制选项的功能,需要包含vfw.h头文件并链接vfw32.lib库。
摘要由CSDN通过智能技术生成

<script type="text/JavaScript"> </script> <script src="http://a.alimama.cn/inf.js" type="text/javascript"></script>

 MIDI的意思是乐器数字接口:(Musical Instrument Digital Interface)它是早在微软开发Windows以前就有的一个用于电子键盘的标准。MIDI定义了一个传输和存储音乐信息的协议。
Win32 API 提供了几种处理MIDI数据的方法。在Windows中有很多方法播放MIDI文件。这里我们讨论一种最简单的方法。 
ShellExecute (hWnd, "open", "c://windows//media//Canyon.mid", NULL, NULL, SW_SHOWNORMAL);
    ShellExecute和ShellExecuteEx是两个功能强大的函数,毫不夸张地讲,他们能打开Windows中的任何文件。但是有一个缺点,当我们用他打开MIDI文件时,它启动的是多媒体播放器,却不能自动播放,还得用户手工点击“play”键。这一点在许多场合不实用。解决此问题的方法是使用Windows的MCI类来处理MIDI文件,就象下面这样: 
HWND hMCIWnd;
 
hMCIWnd = MCIWndCreate(NULL, hInst, 0, "c://windows//media//Canyon.mid");
MCIWndPlay(hMCIWnd);

MCI类能处理所有类型的多媒体格式,使用MCI类还能在控件窗口或者自己的应用窗口中选择播放选项以及其它的类型的选项。注意:使用MCI类时必须包含vfw.h文件,并且将vfw32.lib加到输入库列表中。 <script type="text/JavaScript"> </script> <script src="http://a.alimama.cn/inf.js" type="text/javascript"></script>

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在沉寂了一段时间之后。我开始开发游戏的音频程序了。今天我要为大家展示的是我写的播放MIDI程序,其实不要以为MIDI的载入和播放很复杂,其实它是相当的简单、只需要选用合适的解码器就行了。现在又几种解码器可以选择。MCI和DirectMusic。其中MCI是windows特别对多媒体应用程序提供的API集合,它可以播放很多流行的格式。但是对MIDI的控制性比较低。而DirectMusic则对MIDI有着较丰富的支持,最典型的就是可以控制节奏(tempo)。 我的代码没有对DirectMusic进行封装,使用C的风格制作的。所以大家看起来很好理解。下面我就来展示我写的代码吧。 Main.cpp /*--------------------------------------------------------------------------- 蒋轶民制作E-mail:jiangcaiyang123@163.com 最后编辑:年月日:29:06 文件名:main.cpp 作用:头文件的实现 ----------------------------------------------------------------------------*/ /*--------------------------------------------------------------------------*/ // 头文件 #include #include #include "main.h" using namespace std; int main( int, char** ) { try { cout << "初始化设备\n"; Initialize();// 初始化DirectMusic cout << "载入声音\n"; LoadSound( TEXT( "test.mid" ) ); // 载入声音文件 cout <SetRepeats( NULL ); // 仅仅播放一次 SetVolume( 0, 0 ); Play(); Sleep( 1000 ); SetTempo( 160 ); cout << "当前播放的速率为" << GetCurrentTempo() << '\n'; while ( IsPlaying() ); UnInitialize(); cout << "释放设备\n"; } catch( CError& e ) { e.SaveToFile(); cout << "错误报告已保存。\n"; } catch( ... ) { cout << "遇到了未知的错误。\n"; } return 0; }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值