本文演示如何使用 Bass.dll 的 DirectX 8 參數均衡器效果(BASS_FX_DX8_PARAMEQ),動態創建多個 TrackBar 控制不同中心頻率的增益,構建圖形均衡器介面。

unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ComCtrls, ExtCtrls;
type
TForm1 = class(TForm)
OpenDialog1: TOpenDialog;
Button1: TButton; { 打開 }
Button2: TButton; { 播放 }
Button3: TButton; { 暫停 }
Panel1: TPanel; { 容納動態 TrackBar }
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
procedure TrackChange(Sender: TObject); { 動態 TrackBar 事件 }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
uses Bass;
var
HS: HSTREAM; { 流句柄 }
ParamEq: BASS_DX8_PARAMEQ; { 均衡器參數結構 }
FX: array[0..5] of HFX; { 6 個效果句柄 }
Track: array[0..5] of TTrackBar; { 6 條頻段滑桿 }
procedure TForm1.FormCreate(Sender: TObject);
var I: Integer;
begin
Panel1.Align := alRight;
Panel1.BevelOuter := bvLowered;
Panel1.BevelWidth := 2;
Panel1.Caption := '';
Panel1.Width := 6 * 24 + 2; { 容納 6 條滑桿 }
for I := 0 to 5 do
begin
Track[I] := TTrackBar.Create(Self);
Track[I].Parent := Panel1;
Track[I].Orientation := trVertical;
Track[I].Width := 23;
Track[I].Height := Panel1.Height;
Track[I].ShowSelRange := False;
Track[I].Left := I * 24 + 1;
Track[I].Max := 15; { +15 dB }
Track[I].Min := -15; { -15 dB }
Track[I].Position := 0;
Track[I].Tag := I; { 識別頻段索引 }
Track[I].OnChange := TrackChange;
end;
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;
I: Integer;
begin
BASS_StreamFree(HS);
OpenDialog1.Filter := 'Mp3 文件(*.mp3)|*.mp3|Wav 文件(*.wav)|*.wav';
if OpenDialog1.Execute then
Mp3Path := AnsiString(OpenDialog1.FileName);
{ 必須指定 BASS_SAMPLE_FX 才能添加 DX8 效果 }
HS := BASS_StreamCreateFile(False, PAnsiChar(Mp3Path), 0, 0, BASS_SAMPLE_FX);
if HS = 0 then
Caption := '打開失敗'
else
begin
Caption := String(Mp3Path);
{ 為每個頻段創建獨立效果句柄 }
for I := 0 to 5 do
FX[I] := BASS_ChannelSetFX(HS, BASS_FX_DX8_PARAMEQ, 1);
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;
{ 動態 TrackBar 事件處理 }
procedure TForm1.TrackChange(Sender: TObject);
var I: Integer;
begin
I := TTrackBar(Sender).Tag;
ParamEq.fBandwidth := 20; { 帶寬 1~36,固定 20 }
case I of
0: ParamEq.fCenter := 100; { 100 Hz }
1: ParamEq.fCenter := 2000; { 2 kHz }
2: ParamEq.fCenter := 4000; { 4 kHz }
3: ParamEq.fCenter := 8000; { 8 kHz }
4: ParamEq.fCenter := 10000; { 10 kHz }
5: ParamEq.fCenter := 12000; { 12 kHz }
end;
ParamEq.fGain := -TTrackBar(Sender).Position; { TrackBar 向上為正,增益取反 }
BASS_FXSetParameters(FX[I], @ParamEq);
end;
end.
| 項目 | 說明 |
|---|---|
BASS_DX8_PARAMEQ | 參數均衡器結構:fCenter(中心頻率 Hz)、fBandwidth(帶寬 1~36)、fGain(增益 -15~+15 dB) |
BASS_ChannelSetFX(Handle, BASS_FX_DX8_PARAMEQ, Priority) | 為通道添加均衡器效果,返回 HFX 效果句柄 |
BASS_FXSetParameters(FX, @ParamEq) | 即時更新效果參數 |
BASS_SAMPLE_FX | 創建流時必須指定,啟用效果處理 |
fBandwidth=20 為中等寬度,避免頻段重疊過度或過窄。TrackBar.Min=-15, Max=15 對應 fGain 範圍,UI 向上推增益為正,代碼取反適配。fGain 陣列,一鍵套用。fGain 序列化至 INI/JSON,下次啟動恢復。fCenter 按標準中心頻率計算。| 現象 | 原因 | 解決 |
|---|---|---|
| 均衡器無效果 | 創建流未指定 BASS_SAMPLE_FX | BASS_StreamCreateFile(..., BASS_SAMPLE_FX) |
| 調整某頻段影響其他 | 共用同一 HFX 句柄 | 每頻段獨立 BASS_ChannelSetFX 創建句柄 |
| 增益方向反了 | TrackBar 向上為正,fGain 正值增益 | 代碼 fGain := -Position 或翻轉 TrackBar |
| 音頻爆音 | 多頻段疊加增益過大 | 限制總增益、加入限制器效果 BASS_FX_DX8_COMPRESSOR |
參數均衡器是音頻處理核心工具,掌握 BASS_FX_DX8_PARAMEQ 即可構建專業級均衡器介面,滿足音樂播放器、聲音編輯器等應用需求。