本文演示如何使用 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.
| 項目 | 說明 |
|---|---|
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 | 創建流時必須指定 |
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;
fReverbMix 控制原始信號與混響信號比例,0=全乾,1=全濕,建議 0.2~0.5。fHighFreqRTRatio 越小高頻衰減越快,聲音越「溫暖/悶」。fReflectionsDelay/Gain 模擬聲音到達聽眾前的首次反射,決定空間大小感知。| 現象 | 原因 | 解決 |
|---|---|---|
| 混響無效果 | 創建流缺少 BASS_SAMPLE_FX | BASS_StreamCreateFile(..., BASS_SAMPLE_FX) |
| 參數修改不生效 | Reverb 定義為局部變量 | 移至單元級變量(如示例),保證地址穩定 |
| 音頻失真/爆音 | fReverbMix 過大或增益疊加 | 限制 fReverbMix ≤ 0.7,添加壓縮器 |
| CPU 佔用高 | 混響算法計算量大 | 降低採樣率、減少聲道、關閉無用效果 |
混響是賦予音頻空間感的關鍵效果,掌握 BASS_FX_DX8_REVERB 核心參數即可實現從簡單房間模擬到專業級空間音頻處理。