![]() |
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
|
Re: Bass.dll - Visualisierung
Damit kann ich leider nichts anfangen, da ich Delphi 2005 PE nutze und somit den BassPlayerEx nicht installieren kann.
Hat vielleicht jemand eine Antwort auf meine Frage? |
Re: Bass.dll - Visualisierung
Hallo smepal,
ich wusste gar nicht das der BassPlayerEx nicht unter Delphi 2005 PE geht. Installieren müsstest du da allerdings nichts für, die Komponente wird nicht installiert. Naja, war ein Versuch dir zu helfen, sorry... Edit: Hab das gerade mal getestet und es geht wunderbar. Nur in der Unit FrameChannelU sind noch Überreste von GR32 in der Uses-Klausel, die können einfach entfernt werden. Für die Plugin-Dlls wird allerdings GR32 benötigt. Das habe ich auch installiert bekommen und konnte dann auch die VisDlls erstellen. Sollte also eigentlich gehen. Gruss Thorsten |
Re: Bass.dll - Visualisierung
Hmm dannn werde ich das auch noch mal probieren!
Wollte allerdings bei diesem Projekt nur mit der bass.dll arbeiten! Hat jemand eine Idee wo der Fehler ist? |
Re: Bass.dll - Visualisierung
Mir erscheint das sehr komisch!
Wie kann es einen Unterschied zwischen TFFTData und TFFTData geben? |
Re: Bass.dll - Visualisierung
Wahrscheinlich hast du TfftData in zwei Units deklariert. Nach der Fehlermeldung zu urteilen einmal in "spectrum_vis" und einmal in "visu". Selbst wenn beide identisch sind, meckert der Compiler da ab und zu. Schmeiß einfach eine der Deklaration weg.
|
Re: Bass.dll - Visualisierung
Zitat:
Delphi-Quellcode:
Obwohl die beiden Typen TArr1 und TArr2 einen identischen Aufbau besitzen, betrachtet der Compiler sie als unterschiedliche Typen. Die Zuweisung wird nur dann übersetzt, wenn die Variablen mit dem selben Typenbezeichner vereinbart werden.
type
TArr1 = array [0..512] of Single; TArr2 = array [0..512] of Single; var A, A1 : TArr1; B, B1 : TArr2; begin A := B; // Fehlermeldung: "Inkompatible Typen" A := A1; // ok B := B1; // ok end; Zitat:
Delphi-Quellcode:
Dies sollte die Fehlermeldung beseitigen.
uses
..., CommonTypes; Gruß Hawkeye |
Re: Bass.dll - Visualisierung
Hawkeye219 hatte recht !!!
omg auf die Idee hätte ich auch kommen können! DANKE!!! //EDIT: Ich hatte die Unit Commontypes schon eingebunden aber zusätzlich nochmal Tfftdata deklariert^^ |
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:44 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-2025 by Thomas Breitkreuz