首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> Delphi

Delphi Bass.dll 播放 MP3 系列(13):混響效果實現(BASS_FX_DX8_REVERB)

     編輯:Delphi

本文演示如何使用 Bass.dll 的 DirectX 8 混響效果(BASS_FX_DX8_REVERB),通過 TrackBar 動態調整混響時間(fReverbTime),實現從乾聲到大廳混響的實時控制。

效果圖

混響效果介面

完整代碼

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ComCtrls;

type
  TForm1 = class(TForm)
    OpenDialog1: TOpenDialog;
    Button1: TButton;   { 打開 }
    Button2: TButton;   { 播放 }
    Button3: TButton;   { 暫停 }
    TrackBar1: TTrackBar; { 混響時間滑桿 }
    Label1: TLabel;     { 顯示當前時間 }
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure TrackBar1Change(Sender: TObject);
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

uses Bass;

var
  HS: HSTREAM;              { 流句柄 }
  Reverb: BASS_DX8_REVERB;  { 混響參數結構,不能是局部變量 }
  FX: HFX;                  { 效果句柄 }

procedure TForm1.FormCreate(Sender: TObject);
begin
  { fReverbTime 範圍:0.001 ~ 3000.0 秒,默認 1000 }
  TrackBar1.Min := 1;
  TrackBar1.Max := 3000;
  TrackBar1.Position := 1000;

  if HiWord(BASS_GetVersion) <> BASSVERSION then
    MessageBox(0, '"Bass.dll" 文件版本不合適!', nil, MB_ICONERROR);
  if not BASS_Init(-1, 44100, 0, 0, nil) then
    ShowMessage('初始化錯誤');
end;

{ 打開檔案 }
procedure TForm1.Button1Click(Sender: TObject);
var
  Mp3Path: AnsiString;
begin
  BASS_StreamFree(HS);
  OpenDialog1.Filter := 'Mp3 文件(*.mp3)|*.mp3|Wav 文件(*.wav)|*.wav';
  if OpenDialog1.Execute then
    Mp3Path := AnsiString(OpenDialog1.FileName);

  { 必須指定 BASS_SAMPLE_FX 啟用效果 }
  HS := BASS_StreamCreateFile(False, PAnsiChar(Mp3Path), 0, 0, BASS_SAMPLE_FX);
  if HS = 0 then
    Caption := '打開失敗'
  else
  begin
    Caption := String(Mp3Path);
    { 添加混響效果,優先級 0 }
    FX := BASS_ChannelSetFX(HS, BASS_FX_DX8_REVERB, 0);
  end;
end;

{ 播放/暫停 }
procedure TForm1.Button2Click(Sender: TObject);
begin
  BASS_ChannelPlay(HS, False);
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
  BASS_ChannelPause(HS);
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  BASS_Free;
end;

{ 調整混響時間 }
procedure TForm1.TrackBar1Change(Sender: TObject);
begin
  Reverb.fReverbTime := TrackBar1.Position;  { 單位:毫秒 }
  BASS_FXSetParameters(FX, @Reverb);
  Label1.Caption := Format('混響時間: %d ms', [TrackBar1.Position]);
end;

end.

關鍵結構與 API

項目說明
BASS_DX8_REVERB混響參數結構,核心字段 fReverbTime (0.001~3000.0 ms),其他字段如 fReverbMix、fHighFreqRTRatio 等可進一步調音
BASS_ChannelSetFX(Handle, BASS_FX_DX8_REVERB, Priority)添加混響效果,返回 HFX
BASS_FXSetParameters(FX, @Reverb)即時更新混響參數
BASS_SAMPLE_FX創建流時必須指定

混響參數詳解(BASS_DX8_REVERB)

type
  BASS_DX8_REVERB = record
    fReverbTime: Single;        { 混響持續時間 ms,0.001~3000 }
    fReverbMix: Single;         { 濕/乾混合比 0~1,默認 0.5 }
    fHighFreqRTRatio: Single;   { 高頻衰減比率 0.001~0.999 }
    fReflectionsDelay: Single;  { 早期反射延遲 ms }
    fReflectionsGain: Single;   { 早期反射增益 dB }
    fLateReverbDelay: Single;   { 晚期混響延遲 ms }
    fLateReverbGain: Single;    { 晚期混響增益 dB }
    fEnvironmentSize: Single;   { 環境大小 0~100 }
    fEnvironmentDiffusion: Single; { 環境擴散 0~1 }
    fRoomFilterFreq: Single;    { 房間濾波頻率 Hz }
    fRoomFilterMain: Single;    { 房間濾波主增益 dB }
    fRoomFilterHF: Single;      { 房間濾波高頻增益 dB }
    lRoom: LongInt;             { 房間模式標識 }
  end;

進階調音建議

  1. 預設場景:預置「房間、大廳、教堂、峽谷、管道」等參數組合,一鍵切換。
  2. 濕乾平衡:fReverbMix 控制原始信號與混響信號比例,0=全乾,1=全濕,建議 0.2~0.5。
  3. 高頻衰減:fHighFreqRTRatio 越小高頻衰減越快,聲音越「溫暖/悶」。
  4. 早期反射:fReflectionsDelay/Gain 模擬聲音到達聽眾前的首次反射,決定空間大小感知。

常見問題

現象原因解決
混響無效果創建流缺少 BASS_SAMPLE_FXBASS_StreamCreateFile(..., BASS_SAMPLE_FX)
參數修改不生效Reverb 定義為局部變量移至單元級變量(如示例),保證地址穩定
音頻失真/爆音fReverbMix 過大或增益疊加限制 fReverbMix ≤ 0.7,添加壓縮器
CPU 佔用高混響算法計算量大降低採樣率、減少聲道、關閉無用效果

混響是賦予音頻空間感的關鍵效果,掌握 BASS_FX_DX8_REVERB 核心參數即可實現從簡單房間模擬到專業級空間音頻處理。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved