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

Delphi 結合 Bass.dll 實時顯示左右聲道峰值:VU Meter 實作教學

     編輯:Delphi

前言

專業音頻播放器通常提供即時電平表(VU Meter),監測左右聲道音量動態。本文示範如何在 Delphi 中使用 Bass.dll 的 BASS_ChannelGetLevel 函數,配合垂直進度條實時顯示左右聲道峰值。

核心原理

BASS_ChannelGetLevel 返回一個 32 位無符號整數:

  • 低 16 位(LoWord):左聲道峰值,範圍 0~32767(對應 -∞~0 dB)。
  • 高 16 位(HiWord):右聲道峰值,範圍同左聲道。

在計時器中週期性調用該函數,並將結果賦給兩個垂直 TProgressBar 即可構成簡易電平表。

關鍵代碼實現

1. 表單初始化:配置進度條

procedure TForm1.FormCreate(Sender: TObject);
begin
  Timer1.Interval := 100; {100ms 更新一次}
  Timer1.Enabled := False;

  {設定兩個垂直進度條}
  ProgressBar1.Align := alLeft;
  ProgressBar2.Align := alRight;
  ProgressBar1.Orientation := pbVertical;
  ProgressBar2.Orientation := pbVertical;
  ProgressBar1.Width := 20;
  ProgressBar2.Width := 20;
  {最大值設為 32767 (MAXWORD div 2),對應峰值滿刻度}
  ProgressBar1.Max := MAXWORD div 2;
  ProgressBar2.Max := MAXWORD div 2;

  {Bass 初始化}
  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;

2. 計時器事件:讀取並顯示峰值

procedure TForm1.Timer1Timer(Sender: TObject);
var
  Level: Cardinal;
begin
  Level := BASS_ChannelGetLevel(hs);
  {低 16 位左聲道,高 16 位右聲道}
  ProgressBar1.Position := LoWord(Level);
  ProgressBar2.Position := HiWord(Level);
end;

3. 播放控制

procedure TForm1.Button2Click(Sender: TObject); {播放}
begin
  BASS_ChannelPlay(hs, False);
  Timer1.Enabled := True;
end;

procedure TForm1.Button3Click(Sender: TObject); {暫停}
begin
  BASS_ChannelPause(hs);
  Timer1.Enabled := False;
end;

運行效果

播放音樂時,左右兩側垂直進度條隨音樂節奏上下跳動,直觀反映雙聲道能量分佈。

VU Meter 效果圖

完整單元代碼

unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    OpenDialog1: TOpenDialog;
    Timer1: TTimer;
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    ProgressBar1: TProgressBar;
    ProgressBar2: TProgressBar;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

uses Bass;

var
  hs: HSTREAM;

{ ... 完整實現代碼 ... }

end.

進階優化建議

  • 對數刻度:人耳對音量感知為對數,可將線性峰值轉換為 dB 刻度(20 * Log10(Level / 32768))後再映射到進度條,視覺更自然。
  • 平滑衰減:引入峰值保持與緩慢回落算法,模擬專業 VU Meter 的彈道特性。
  • 高解析度:使用 BASS_ChannelGetLevelEx 獲取浮點數峰值(需 Bass 2.4+),精度更高。
  • 多聲道支援:對於 5.1/7.1 環繞聲,可建立多組進度條並指定聲道索引。

總結

僅需幾行核心代碼,即可在 Delphi 中實現基於 Bass.dll 的實時雙聲道電平表,為播放器增添專業質感。

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