博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Delphi多媒体设计之TMediaPlayer组件(五)
阅读量:6987 次
发布时间:2019-06-27

本文共 2276 字,大约阅读时间需要 7 分钟。

MIDI音频(MIDI Audio)

对于MIDI音频没有太多可说的,所要做的只是设置MediaPlayer的FileName属性为MIDI文件,在调用Play方法即可。MIDI文件的扩展名有.mid和.rmi两种。

简单的播放MIDI音频的例子如下:

procedure TForm1.btn9Click(Sender: TObject);begin  if Pos('播放''蜡笔小新''MIDI音乐', btn9.Caption) > 0 then  begin    mpPlayer.Wait := False;    mpPlayer.FileName := 'lbxx.mid';    mpPlayer.Open;    mpPlayer.Play;    btn9.Caption := '停止播放';  end else  if Pos('停止播放', btn9.Caption) >0 then  begin    mpPlayer.Stop;    mpPlayer.Close;    btn9.Caption := '播放''蜡笔小新''MIDI音乐';  end;end;

运行效果如下:

Note

如果不想紧紧停留在简单的MIDI文件播放,那么必须学习一些底层的midiInXXX和midiOutXXX函数。这些函数在MMEDIA.HLP文件中有说明,该文件在C:\Program Files (x86)\Common Files\Borland Shared\MSHelp目录下(Win7 64位下的路径,其他系统类似)。

许多早期的声卡不允许同时播放两个波形文件,同样的,也不允许同时播放一个以上的MIDI文件。然而,大多能同时播放波形文件和MIDI文件。大家可能已经在游戏中注意到这种效果,在这些游戏中,同时播放着音乐(music track)和音效(sound effects)。要同时播放波形文件和MIDI文件可使用两个MediaPlayer组件。或者也可以为MIDI文件使用MediaPlayer组件,而需要播放的波形文件使用PlaySound函数。

一个简单的例子同时播放MIDI和WAVE音乐如下代码:

procedure TForm1.btn10Click(Sender: TObject);begin  if Pos('同时播放MIDI和WAVE音频', btn10.Caption) > 0 then  begin    mpPlayer.Wait := False;    mpPlayer.FileName := 'lbxx.mid';    mpPlayer.Open;    mpPlayer.Play;    PlaySound('test.wav', 0, SND_FILENAME or SND_ASYNC);    btn10.Caption := '停止播放';  end else  if Pos('停止播放', btn10.Caption) >0 then  begin    mpPlayer.Stop;    mpPlayer.Close;    PlaySound(0, 0, SND_FILENAME);    btn10.Caption := '同时播放MIDI和WAVE音频';  end;end;

示例代码界面如下:


MIDI文件常被用作游戏的背景音乐,如果以这种方式使用MIDI文件,当结束时将要重新启动音乐。TMediaPlayer没有自动方式连续播放声音。然而,利用MediaPlayer的OnNotify事件获得循环效果。首先必须告诉MediaPlayer当发生某事时要发出通知。这部分很容易:

mpPlayer.Notify := True; { 当发生某事时触发OnNotify事件}

之后,需要提供OnNotify事件处理代码,在事件处理代码中,需要在MIDI播放成功后重新开始播放,代码如下:

procedure TForm1.mpPlayerNotify(Sender: TObject);begin  with mpPlayer do  begin    if (NotifyValue = nvSuccessful) and (btn11.Caption = '停止播放') then    { 同时判断了Btn11按钮的播放状态,确认只对该按钮有效}    begin      Position := 0;      Play;    end;  end;end;

示例界面如下:

首先检查NotifyValue属性是否包含nvSuccessful值。如果是的话,重新设置文件位置为0,并调用Play方法重新开始播放文件。非常简单,但是有一些要点应该认识。

首先注意这里Position属性设置为0,这有效地使文件恢复到起点上。如果AutoRewind属性设置为True,则不必设置Position属性了。

其次应该注意到一些动作使得MediaPlayer的OnNotify事件被调用,并且将NotifyValue的值改变为nvSuccessful。

例如:一个简单的Stop命令,如果该命令执行完没有发生任何意外的话,Stop命令将会产生nvSuccessful值。用户可能需要建立一个状态机制使得当文件播放完毕后能OnNotify事件被调用,其他一些媒体的播放结束不受此干扰。

以上代码均在Delphi  7下测试通过,示例代码下载:

转载地址:http://vmwvl.baihongyu.com/

你可能感兴趣的文章
利用CSS、JavaScript及Ajax实现图片预加载
查看>>
学习 webpack 前,你需要了解的那些概念
查看>>
基于PhantomJs的Java后台网页截图技术
查看>>
Android自定义标签列表控件LabelsView解析
查看>>
关于二进制的一点小思考
查看>>
多账号配置SSH
查看>>
adb通信协议分析以及实现(二):adb服务进程发现设备
查看>>
用Vue实现省市区三级联动
查看>>
五、FFmpeg零基础(2)-FFmpeg的编译
查看>>
喜大普奔,Ant Design of Vue 1.0版本发布
查看>>
存储系统设计——NVMe SSD性能影响因素一探究竟
查看>>
高性能的视差动画【译】
查看>>
Scrapy爬虫以及Scrapyd爬虫部署
查看>>
有何建议给即将步入职场的计算机应届毕业生?
查看>>
Android NDK开发之旅2 C语言基础 指针
查看>>
选择了软件测试,你后悔吗?
查看>>
个人Feed流方案演进
查看>>
iOS GCD入门和GCD对CPU多核的使用
查看>>
Java集合——LinkedHashMap
查看>>
从另一个思路来学习安卓事件分发机制
查看>>