![]() |
Bass.dll - Visualisierung
also ich habe schon die suche hier im Forum zu rate gezogen komme aber nicht weiter!
Ich möchte einfach eine anzeige haben wie man sie vom Nero Waveeditor her kennt! Dazu muss ich bass_channelgetdata nutzen oder? Nur wie soll ich den damit erzeugten Array auswerten? |
Re: Bass.dll - Visualisierung
Also beim Waveeditor die große Anzeige ist afaik die Lautstärke, das kleine unten ist das Spektrum. Ersteres sollte unkompliziert sein (Bass_GetVolume oder so ähnlich), bei zweiterem solltest du mit FFTs arbeiten, glaube ich.
|
Re: Bass.dll - Visualisierung
|
Re: Bass.dll - Visualisierung
Bei einer der Bass Demo passiert genau das ...
Edit Demo heist "custloop" |
Re: Bass.dll - Visualisierung
Die Demo custloop habe ich mir schon mal angeschaut!
Allerdings werde ich aus dem Code nicht schlau und kann die entsprechende Stelle nicht finden! Vielleicht könnt ihr mir da weiterhelfen? |
Re: Bass.dll - Visualisierung
Delphi-Quellcode:
Das sollte eigentlich der bedeut same abschnitt sein...
//draw peaks
ht := ClientHeight div 2; for i:=0 to length(wavebufL)-1 do begin // i = index (zeit index von anfang zum ende der wave datei) // ht = 1 Punkt eine vertikalen line // ht-trunc((wavebufL[i]/32768)*ht) = 2 Punkt eine vertikalen line Buffer.Canvas.MoveTo(i,ht); Buffer.Canvas.Pen.Color := clLime; Buffer.Canvas.LineTo(i,ht-trunc((wavebufL[i]/32768)*ht)); Buffer.Canvas.Pen.Color := clLime; Buffer.Canvas.MoveTo(i,ht+2); Buffer.Canvas.LineTo(i,ht+2+trunc((wavebufR[i]/32768)*ht)); end; |
Re: Bass.dll - Visualisierung
was muss ich denn wavebufl zuordnen?
|
Re: Bass.dll - Visualisierung
ich hab mir jetzt vereinzelt code schnipsel aus dem Beispiel kopiert vor allem aber die Play procedur und die drawspectrum und draw timeline proceduren!
Und siehe da es funktioniert! Ich weiß zwar nicht wie aber es funzt! |
Re: Bass.dll - Visualisierung
Hmm versuche gerade mit den Demo units von bass.dll zu arbeiten:
Es gibt da die Unit spectrum_vis.pas
Delphi-Quellcode:
In meinem Programm verfahre ich so damit:
unit spectrum_vis;
{ Spectrum Visualyzation by Alessandro Cappellozza version 0.8 05/2002 [url]http://digilander.iol.it/Kappe/audioobject[/url] } 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.
Delphi-Quellcode:
Und rufe sie so auf:
procedure Tvis.FormCreate(Sender: TObject);
begin BASS_Init(-1, 44100, 0, Application.Handle, nil); Spectrum := TSpectrum.Create(vis.Width, vis.Height); end; (so wirds auch in der Demo gemacht)
Delphi-Quellcode:
Aus einem mir völlig unerklärlichen Grund bekomme ich folgende Fehlermeldung:
procedure Tvis.TimerRenderTimer(Sender: TObject);
var FFTFata : TFFTData; WaveData : TWaveData; begin BASS_ChannelGetData(p, @FFTFata, BASS_DATA_FFT1024); Spectrum.Draw (pb.Canvas.Handle, FFTFata, 50 - 40, 50 - 60); end; Zitat:
Kann mir irgendwer Weiterhelfen? Spectrum.Draw (pb.Canvas.Handle, FFTFata, 50 - 40, 50 - 60); |
Re: Bass.dll - Visualisierung
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:31 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz