• Delphi多媒体设计之TMediaPlayer组件(五)


    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;

    运行效果如下:

    image

    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;

    示例代码界面如下:

    image


    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;

    示例界面如下:

    image

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

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

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

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

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

  • 相关阅读:
    团队作业(9)
    团队作业(8)
    团队作业(7)
    团队作业(6)
    团队作业(5)
    团队作业(4)
    团队作业(3)
    05数据爬去
    02周总结
    04结对开发
  • 原文地址:https://www.cnblogs.com/pchmonster/p/2597172.html
Copyright © 2020-2023  润新知