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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM