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

Delphi Bass.dll 播放 MP3 系列(14):頻率均衡器實現(BASS_FX_DX8_PARAMEQ)

     編輯:Delphi

本文演示如何使用 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.

關鍵結構與 API

項目說明
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創建流時必須指定,啟用效果處理

頻段設計說明

  • 6 條頻段覆蓋 100 Hz ~ 12 kHz,涵蓋低音、中音、高音關鍵區域。
  • fBandwidth=20 為中等寬度,避免頻段重疊過度或過窄。
  • TrackBar.Min=-15, Max=15 對應 fGain 範圍,UI 向上推增益為正,代碼取反適配。

進階擴展

  1. 預設曲線:提供「流行、搖滾、古典、爵士」等預設 fGain 陣列,一鍵套用。
  2. 保存/載入:將 6 段 fGain 序列化至 INI/JSON,下次啟動恢復。
  3. 可視化頻譜:結合第 12 節 FFT 數據,背景顯示實時頻譜,滑桿疊加其上。
  4. 更多頻段:擴展至 10/31 段(1/3 倍頻程),fCenter 按標準中心頻率計算。

常見問題

現象原因解決
均衡器無效果創建流未指定 BASS_SAMPLE_FXBASS_StreamCreateFile(..., BASS_SAMPLE_FX)
調整某頻段影響其他共用同一 HFX 句柄每頻段獨立 BASS_ChannelSetFX 創建句柄
增益方向反了TrackBar 向上為正,fGain 正值增益代碼 fGain := -Position 或翻轉 TrackBar
音頻爆音多頻段疊加增益過大限制總增益、加入限制器效果 BASS_FX_DX8_COMPRESSOR

參數均衡器是音頻處理核心工具,掌握 BASS_FX_DX8_PARAMEQ 即可構建專業級均衡器介面,滿足音樂播放器、聲音編輯器等應用需求。

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