Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Bass.dll - Visualisierung (https://www.delphipraxis.net/74689-bass-dll-visualisierung.html)

smepal 7. Aug 2006 16:06


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?

DGL-luke 7. Aug 2006 16:18

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.

igel457 7. Aug 2006 16:31

Re: Bass.dll - Visualisierung
 
Forensuche benutzt?

http://www.delphipraxis.net/internal...highlight=bass

arbu man 7. Aug 2006 16:34

Re: Bass.dll - Visualisierung
 
Bei einer der Bass Demo passiert genau das ...


Edit Demo heist "custloop"

smepal 8. Aug 2006 09:42

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?

arbu man 8. Aug 2006 09:49

Re: Bass.dll - Visualisierung
 
Delphi-Quellcode:
//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;
Das sollte eigentlich der bedeut same abschnitt sein...

smepal 8. Aug 2006 09:56

Re: Bass.dll - Visualisierung
 
was muss ich denn wavebufl zuordnen?

smepal 8. Aug 2006 14:34

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!

smepal 10. Aug 2006 15:00

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:
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.
In meinem Programm verfahre ich so damit:

Delphi-Quellcode:
procedure Tvis.FormCreate(Sender: TObject);
begin
BASS_Init(-1, 44100, 0, Application.Handle, nil);

Spectrum   := TSpectrum.Create(vis.Width, vis.Height);
end;
Und rufe sie so auf:

(so wirds auch in der Demo gemacht)
Delphi-Quellcode:
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;
Aus einem mir völlig unerklärlichen Grund bekomme ich folgende Fehlermeldung:
Zitat:

[Fehler] visu.pas(224): E2010 Inkompatible Typen: 'spectrum_vis.TFFTData' und 'visu.TFFTData'

Kann mir irgendwer Weiterhelfen?
Spectrum.Draw (pb.Canvas.Handle, FFTFata, 50 - 40, 50 - 60);

omata 10. Aug 2006 15:06

Re: Bass.dll - Visualisierung
 
Hast du mal mein Beispiel und dort die Plugins angesehen?

Gruss
Thorsten

smepal 10. Aug 2006 15:45

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?

omata 10. Aug 2006 16:35

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

smepal 11. Aug 2006 13:16

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?

smepal 12. Aug 2006 21:17

Re: Bass.dll - Visualisierung
 
Mir erscheint das sehr komisch!

Wie kann es einen Unterschied zwischen

TFFTData und TFFTData geben?

Gausi 13. Aug 2006 09:02

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.

Hawkeye219 13. Aug 2006 09:45

Re: Bass.dll - Visualisierung
 
Zitat:

Zitat von Gausi
Selbst wenn beide identisch sind, meckert der Compiler da ab und zu.

Nicht ab und zu, sondern immer, sogar in diesem Fall:

Delphi-Quellcode:
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;
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.

Zitat:

Zitat von Gausi
Schmeiß einfach eine der Deklaration weg.

Leider zeigt smepal die Unit visu nicht, aber mit deiner Vermutung dürftest du Recht haben. In dieser Unit wird es eine weitere Typvereinbarung der Form "TFFTData = array [0..512] of Single;" geben. Wird sie allerdings ersatzlos entfernt, beschwert sich wahrscheinlich der Compiler. Besser ist es, die Unit CommonTypes in die USES-Anweisung der Unit 'visu' aufzunehmen:

Delphi-Quellcode:
uses
  ..., CommonTypes;
Dies sollte die Fehlermeldung beseitigen.

Gruß Hawkeye

smepal 13. Aug 2006 16:06

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