unit spectrum_vis; { Spectrum Visualyzation by Alessandro Cappellozza version 0.8 05/2002 http://digilander.iol.it/Kappe/audioobject } interface uses Windows, Dialogs, Graphics, SysUtils, CommonTypes, Classes; type TSpectrum = Class(TObject) private VisBuff : TBitmap; BackBmp : TBitmap; BkgColor : TColor; SpecHeight : Integer; PenColor : TColor; PeakColor: TColor; DrawType : Integer; DrawRes : Integer; FrmClear : Boolean; UseBkg : Boolean; PeakFall : Integer; LineFall : Integer; ColWidth : Integer; ShowPeak : Boolean; FFTPeacks : array [0..128] of Integer; FFTFallOff : array [0..128] of Integer; public Constructor Create (Width, Height : Integer); procedure Draw(HWND : THandle; FFTData : TFFTData; X, Y : Integer); procedure SetBackGround (Active : Boolean; BkgCanvas : TGraphic); property BackColor : TColor read BkgColor write BkgColor; property Height : Integer read SpecHeight write SpecHeight; property Width : Integer read ColWidth write ColWidth; property Pen : TColor read PenColor write PenColor; property Peak : TColor read PeakColor write PeakColor; property Mode : Integer read DrawType write DrawType; property Res : Integer read DrawRes write DrawRes; property FrameClear : Boolean read FrmClear write FrmClear; property PeakFallOff: Integer read PeakFall write PeakFall; property LineFallOff: Integer read LineFall write LineFall; property DrawPeak : Boolean read ShowPeak write ShowPeak; end; var Spectrum : TSpectrum; implementation Constructor TSpectrum.Create(Width, Height : Integer); begin VisBuff := TBitmap.Create; BackBmp := TBitmap.Create; VisBuff.Width := Width; VisBuff.Height := Height; BackBmp.Width := Width; BackBmp.Height := Height; BkgColor := clBlack; SpecHeight := 100; PenColor := clWhite; PeakColor := clYellow; DrawType := 0; DrawRes := 1; FrmClear := True; UseBkg := False; PeakFall := 1; LineFall := 3; ColWidth := 5; ShowPeak := True; end; procedure TSpectrum.SetBackGround (Active : Boolean; BkgCanvas : TGraphic); begin UseBkg := Active; BackBmp.Canvas.Draw(0, 0, BkgCanvas); end; procedure TSpectrum.Draw(HWND : THandle; FFTData : TFFTData; X, Y : Integer); var i, YPos : LongInt; YVal : Single; begin if FrmClear then begin VisBuff.Canvas.Pen.Color := BkgColor; VisBuff.Canvas.Brush.Color := BkgColor; VisBuff.Canvas.Rectangle(0, 0, VisBuff.Width, VisBuff.Height); if UseBkg then VisBuff.Canvas.CopyRect(Rect(0, 0, BackBmp.Width, BackBmp.Height), BackBmp.Canvas, Rect(0, 0, BackBmp.Width, BackBmp.Height)); end; VisBuff.Canvas.Pen.Color := PenColor; for i := 0 to 128 do begin YVal := Abs(FFTData[(i * DrawRes) + 5]); YPos := Trunc((YVal) * 500); if YPos > Height then YPos := SpecHeight; if YPos >= FFTPeacks[i] then FFTPeacks[i] := YPos else FFTPeacks[i] := FFTPeacks[i] - PeakFall; if YPos >= FFTFallOff[i] then FFTFallOff[i] := YPos else FFTFallOff[i] := FFTFallOff[i] - LineFall; if (VisBuff.Height - FFTPeacks[i]) > VisBuff.Height then FFTPeacks[i] := 0; if (VisBuff.Height - FFTFallOff[i]) > VisBuff.Height then FFTFallOff[i] := 0; case DrawType of 0 : begin VisBuff.Canvas.MoveTo(X + i, Y + VisBuff.Height); VisBuff.Canvas.LineTo(X + i, Y + VisBuff.Height - FFTFallOff[i]); if ShowPeak then VisBuff.Canvas.Pixels[X + i, Y + VisBuff.Height - FFTPeacks[i]] := Pen; end; 1 : begin if ShowPeak then VisBuff.Canvas.Pen.Color := PeakColor; if ShowPeak then VisBuff.Canvas.MoveTo(X + i * (ColWidth + 1), Y + VisBuff.Height - FFTPeacks[i]); if ShowPeak then VisBuff.Canvas.LineTo(X + i * (ColWidth + 1) + ColWidth, Y + VisBuff.Height - FFTPeacks[i]); VisBuff.Canvas.Pen.Color := PenColor; VisBuff.Canvas.Brush.Color := PenColor; VisBuff.Canvas.Rectangle(X + i * (ColWidth + 1), Y + VisBuff.Height - FFTFallOff[i], X + i * (ColWidth + 1) + ColWidth, Y + VisBuff.Height); end; end; end; BitBlt(HWND, 0, 0, VisBuff.Width, VisBuff.Height, VisBuff.Canvas.Handle, 0, 0, srccopy) end; end.