專業音頻播放器通常提供即時電平表(VU Meter),監測左右聲道音量動態。本文示範如何在 Delphi 中使用 Bass.dll 的 BASS_ChannelGetLevel 函數,配合垂直進度條實時顯示左右聲道峰值。
BASS_ChannelGetLevel 返回一個 32 位無符號整數:
LoWord):左聲道峰值,範圍 0~32767(對應 -∞~0 dB)。HiWord):右聲道峰值,範圍同左聲道。在計時器中週期性調用該函數,並將結果賦給兩個垂直 TProgressBar 即可構成簡易電平表。
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;
procedure TForm1.Timer1Timer(Sender: TObject);
var
Level: Cardinal;
begin
Level := BASS_ChannelGetLevel(hs);
{低 16 位左聲道,高 16 位右聲道}
ProgressBar1.Position := LoWord(Level);
ProgressBar2.Position := HiWord(Level);
end;
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;
播放音樂時,左右兩側垂直進度條隨音樂節奏上下跳動,直觀反映雙聲道能量分佈。

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.
20 * Log10(Level / 32768))後再映射到進度條,視覺更自然。BASS_ChannelGetLevelEx 獲取浮點數峰值(需 Bass 2.4+),精度更高。僅需幾行核心代碼,即可在 Delphi 中實現基於 Bass.dll 的實時雙聲道電平表,為播放器增添專業質感。