Delphi-PRAXiS
Seite 1 von 2  1 2      

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 17: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 17: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 17:31

Re: Bass.dll - Visualisierung
 
Forensuche benutzt?

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

arbu man 7. Aug 2006 17:34

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


Edit Demo heist "custloop"

smepal 8. Aug 2006 10: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 10: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 10:56

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

smepal 8. Aug 2006 15: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 16: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 16:06

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

Gruss
Thorsten


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:31 Uhr.
Seite 1 von 2  1 2      

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