Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Software-Projekte der Mitglieder (https://www.delphipraxis.net/26-software-projekte-der-mitglieder/)
-   -   WaveFade (https://www.delphipraxis.net/133110-wavefade.html)

EWeiss 25. Apr 2009 20:38


WaveFade
 
Ein Visualisierungs projekt in dem die WaveDaten gefadet werden.
Ist ein Abfall Produkt für mein aimp_vis Plugin was noch nicht fertig ist.

Danke an himitsu für die optimierung des fading.
Erstellt in D2009

Bekannter fehler EOverflow in XFFT..
Wäre etwas für Mathematiker das zu fixen. :)

gruss Emil

igel457 25. Apr 2009 21:46

Re: WaveFade
 
Hallo,

das Programm ansich ist ganz nett. Besonders die Tatsache, das aktuelle Abspielposition und Stücklänge korrekt angezeigt werden gefällt mir gut. Bei vielen komprimierten Audioformaten ist das ja nicht so einfach.

Was mir nicht so gut gefällt ist die Visualisierung: Das Ganze ist meiner Meinung nach zu hektisch (ich kann mir das nicht länger anschauen, besonders schlimm wäre es, wenn das Ganze im Vollbildmodus wäre) und die eigentliche Information (welche Frequenzanteile wie stark vertreten sind) geht verloren. Du solltest die FFT-Daten vielleicht feiner granuliert auslesen (auf einer Basis von 128 Samples oder so ähnlich) und den Fadeeffekt (bzw. die Überlagerung der einzelnen Visualisierungen) entfernen. Außerdem sollte vielleicht der Kontrast/die Sättigung der weiter hinterliegenden Visualisierungsebenen verringert werden.

Die GUI gefällt mir auch recht gut, die ist schön übersichtlich. Einzig sollte man vielleicht mehrere Einträge gleichzeitig auswählen und löschen können und neue Einträge durch doppelklicken auf die Listbox einfügen. Der Pauseknopf funktioniert auch nicht korrekt.

Ich hoffe mein Feedback nützt dir (ich weiß ja nicht, was dein Programm eigentlich machen soll - dein erster Beitrag ist nicht sonderlich Informativ. Geht es dir ausschließlich um die Visualisierung oder um den Player an sich?)

EWeiss 25. Apr 2009 21:54

Re: WaveFade
 
Der Player ist eigentlich uninteressant, ein notwendiges übel damit überhaupt was visualisiert werden kann.
Bei der aussage erübrigt sich eigentlich die nachfolgende Antwort um was es mir geht ;)

Nur um die Visualisierung. :)
Ich find sie gut gelungen aber jeder hat einen anderen geschmack.

gruss Emil

lbccaleb 25. Apr 2009 22:24

Re: WaveFade
 
Hallo Emil,

hab nicht ganz verstanden was genau der Fehler ist!
Bei meinem test konte ich nichts feststellen, was falsch läuft...

mfg

EWeiss 25. Apr 2009 22:31

Re: WaveFade
 
Zitat:

Zitat von lbccaleb
Hallo Emil,

hab nicht ganz verstanden was genau der Fehler ist!
Bei meinem test konte ich nichts feststellen, was falsch läuft...

mfg

EOverflow .. hab es deaktiviert im Projekt.
Wenn du 2009 hast schau mal in den option unter Tools/Option/CodeGear-Debuger/Sprach Exception

Hoffe dir gefällt die Vis besser ;)

EDIT:
Bedenke es geht hier nicht um Spectrum Daten .. das sind reine WaveDaten :)
Deshalb bekommt man den Eindruck das es etwas unruhig ist.
Aber das ist so gewollt.

gruss Emil

igel457 25. Apr 2009 22:39

Re: WaveFade
 
Ah, ok... Ich dachte wirklich, dass sollte das Spektrum sein. So ist es natürlich ein interessanter Ansatz das Ganze darzustellen...

lbccaleb 25. Apr 2009 22:50

Re: WaveFade
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von EWeiss
Wenn du 2009 hast schau mal in den option unter Tools/Option/CodeGear-Debuger/Sprach Exception

Nee hab kein 2009...


Zitat:

Zitat von EWeiss

Hoffe dir gefällt die Vis besser ;)


Also die Visualisation gefällt mir ganz gut, allerdings hab ich auch nen kleines Problem damit (irgendwas ist ja immer :lol: )

Also, währe hübscher wenn die schwarzen Ränder verschwinden würden, es also an der stelle vllt ein wenig mehr transparet ist ...

Hab mal nen Screenshot angehängt, wo man sieht was ich meine ..

Edit:

Änder mal den Satz:

Zitat:

// 0..0 erstellt ein Array ohne Beraichsprüfung, drum geht auch mehr,
// aber theoretisch könnte man z.B. auch 0..20000 machen, da hier eh
// nur der Pointer verwendet und somit nie spricher resserviert wird,
Da bekommt man ja Augenkrebs :twisted:

mfg

EWeiss 25. Apr 2009 22:59

Re: WaveFade
 
Zitat:

Also, währe hübscher wenn die schwarzen Ränder verschwinden würden, es also an der stelle vllt ein wenig mehr transparet ist ...
Also das geht nicht so einfach weil hier das fading schon zu ende ist und der hintergrund neuzeichnet
da kann man nichts mehr verändern. :)

Jo werd den Satz mal ändern ... war auf die schnelle von himitsu geschrieben denke der kann Deutsch :)

gruss Emil

himitsu 25. Apr 2009 23:05

Re: WaveFade
 
dachte ja nicht das du des drinläßt :angel2:
und hab das, schnell und unter leichten Kopfschmerzen Hingetippte, nicht nochmal Korrektur gelesen :oops:

EWeiss 25. Apr 2009 23:12

Re: WaveFade
 
Zitat:

Zitat von himitsu
dachte ja nicht das du des drinläßt :angel2:
und hab das, schnell und unter leichten Kopfschmerzen Hingetippte, nicht nochmal Korrektur gelesen :oops:

Kein problem passiert mir auch öfters das ich mich verschreibe.
Aber gut wenn man mehr Infos im Quelltext hat.

Gruss Emil

EWeiss 26. Apr 2009 19:59

Re: WaveFade
 
Habe noch ein kleines problem

Delphi-Quellcode:
procedure TfrmMain.FadeBackBuffer2;
type TPixelArray = packed array[0..0, 0..255] of packed record
    b, g, r: Byte;
  end;
  PPixelArray = ^TPixelArray;

var
  dx: integer;
  dy: integer;
  i: integer;
begin
  try
    BitBlt(hTempDc, 0, 0, 256, nHeight, DC, 256, 0, SRCCOPY);

    //' Fade The Data.
    for dy := 0 to nHeight - 1 do
    begin
      for dx := 0 to 255 do
      begin
        i := PPixelArray(pAddr)[dy, dx].b - 15;
        if i < 0 then i := 0;
        PPixelArray(pAddr)[dy, dx].b := i;

        i := PPixelArray(pAddr)[dy, dx].g - 15;
        if i < 0 then i := 0;
        PPixelArray(pAddr)[dy, dx].g := i;

        i := PPixelArray(pAddr)[dy, dx].r - 15;
        if i < 0 then i := 0;
        PPixelArray(pAddr)[dy, dx].r := i;
      end;
    end;

    //' Blit The Faded Image To The Back Buffer.
    BitBlt(DC, 0, 0, 256, nHeight, hTempDc, 256, 0, SRCCOPY);
  except

  end;
end;
Ich möchte jetzt die RGB werte von der position dx:=256 auslesen
Das problem ist aber das dx innerhalb des Array an die RGB werte gekoppelt sind also max 255
Jemand eine Idee wie ich das problem beheben kann ?

gruss Emil

himitsu 26. Apr 2009 20:07

Re: WaveFade
 
da es eh nur 256 Pixel pro Zeile gibt, existiert natürlich keine Spalte für dx=256

aber da gab's ja noch die Möglichkeit ein Eindimensionales Array über das ganze Bild zu legen.
Delphi-Quellcode:
TPixelArray = packed array[0..0] of packed record
    b, g, r: Byte;
  end;

PPixelArray(pAddr)[dy * 256 + dx]

[add]
dein Wunsch würde ja diesem entsprechen
Delphi-Quellcode:
type TPixelArray = packed array[0..0, 0..255] of packed record

PPixelArray(pAddr)[dy + dx div 256, dx mod 256]

dx=256   =>  PPixelArray(pAddr)[dy + 1, 0]
dx=300   =>  PPixelArray(pAddr)[dy + 1, 44]

EWeiss 26. Apr 2009 20:11

Re: WaveFade
 
Zitat:

Zitat von himitsu
da es eh nur 256 Pixel pro Zeile gibt, existiert natürlich keine Spalte für dx=256

aber da gab's ja noch die Möglichkeit ein Eindimensionales Array über das ganze Bild zu legen.
Delphi-Quellcode:
TPixelArray = packed array[0..0] of packed record
    b, g, r: Byte;
  end;

PPixelArray(pAddr)[dy * 256 + dx]

Nein es gibt 512
Delphi-Quellcode:
  BASS_ChannelGetData(stream, @SampleData, 1024);
  For intI := 0 To 511 do
    WaveData[intI] := SampleData[intI];
Delphi-Quellcode:
  TRA: array[1..512] of single;
  TIA: array[1..512] of single;
512 Sample Maximal für Wave mehr stellt die SDK nicht zur verfügung.
Könnte Theoretisch auch 1024 nehmen nur dann wären es 512 für den rechten und 512 für den linken Kanal.

gruss Emil

himitsu 26. Apr 2009 20:16

Re: WaveFade
 
du hattest aber vorher ein Array mit 768 Bytes pro Zeile
und bei 3 Farben macht das dann 256 Pixel


bei 512 wären es natürlich dann 0..511
Delphi-Quellcode:
type TPixelArray = packed array[0..0, 0..511] of packed record
  ...

oder wenn variabel dann:
Delphi-Quellcode:
TPixelArray = packed array[0..0] of packed record
    b, g, r: Byte;
  end;

PPixelArray(pAddr)[dy * Spalten + dx]

EWeiss 26. Apr 2009 20:22

Re: WaveFade
 
Wenn ich dich richtig verstanden habe dann so!

Delphi-Quellcode:
    //' Fade The Data.
    for dy := 0 to nHeight - 1 do
    begin
      for dx := 0 to 255 do
      begin
        i := PPixelArray(pAddr)[dy + dx div 256, dx mod 256].b - 15;
        if i < 0 then i := 0;
        PPixelArray(pAddr)[dy + dx div 256, dx mod 256].b := i ;

        i := PPixelArray(pAddr)[dy + dx div 256, dx mod 256].g - 15;
        if i < 0 then i := 0;
        PPixelArray(pAddr)[dy + dx div 256, dx mod 256].g := i ;

        i := PPixelArray(pAddr)[dy + dx div 256, dx mod 256].r - 15;
        if i < 0 then i := 0;
        PPixelArray(pAddr)[dy + dx div 256, dx mod 256].r := i ;
      end;
    end;
Leider kracht es gewaltig ;)

gruss Emil

EWeiss 27. Apr 2009 10:38

Re: WaveFade
 
Hmm will irgendwie nicht..
Sehe schon muss noch einiges lernen. :mrgreen:

Hat sich erledigt..

gruss EMil

EWeiss 28. Apr 2009 08:09

Re: WaveFade
 
Kleines Update
Die Flames wurden jetzt der richtigen Bildhöhe angepaßt und die weite auf 512 gesetzt.
Hab dann ein Menü addiert und die RadioGroup entfernt.

Meine das sieht jetzt besser aus.

gruss Emil

EWeiss 19. Jun 2019 18:57

AW: WaveFade
 
Hat vielleicht jemand von euch den Quelltext noch irgendwo auf seiner Platte oder Archiviert?
Hab meinen verloren.

gruss

EWeiss 20. Jun 2019 06:03

AW: WaveFade
 
Hat sich erledigt habe es neu geschrieben..
Es gibt noch 6 andere Farben.. :)

PS:
Es wäre nett wenn mal jemand meinen FFT gegenprüfen würde, habe ab und an einen Gleitkomma überlauf. @Michael II ?? :)
Delphi-Quellcode:
procedure TBassPlayer.XFFT(FR, FI: array of single; Sign, Sample, SampleCount: Integer);
// Wave Daten glätten
var
  Q, J, M, L, le, le1, ip: integer;
  tr, ti, s, ur, ur1, ui, wr, wi: single;

begin

    J := 1;
    for Q := Sample to SampleCount do
    begin
      if Q < J then
      begin
        s    := FR[Q];
        FR[Q] := FR[J];
        FR[J] := s;
        s    := FI[Q];
        FI[Q] := FI[J];
        FI[J] := s;
      end;
      M := ((SampleCount + 1) div 2);

      while M < J do
      begin
        J := J - M;
        M := M div 2;
      end;
      J := J + M;
    end;

    for L := 1 to 8 do
    begin
      le := trunc(Power(2, L));
      le1 := le div 2;
      ur := 1;
      ui := 0;
      wr := Cos(PI / le1);
      wi := Sign * Sin(PI / le1);
     
      for J := 1 to le1 do
      begin
        Q := J;
        while Q <= (SampleCount + 1) do
        begin
          ip    := Q + le1;
          tr    := FR[ip] * ur - FI[ip] * ui;
          ti    := FR[ip] * ui + FI[ip] * ur;
          FR[ip] := FR[Q] - tr;
          FI[ip] := FI[Q] - ti;
          FR[Q] := FR[Q] + tr;
          FI[Q] := FI[Q] + ti;
          Q     := Q + le;
        end;

        ur1 := ur * wr - ui * wi;
        ui := ur * wi + ui * wr;
        ur := ur1;
      end;
    end;

    for Q := Sample to (SampleCount + 1) do
    begin
      FR[Q] := FR[Q] * DivN;
      FI[Q] := FI[Q] * DivN;
    end;
end;
Wenn nötig stelle ich dafür den Quelltext des Projekts zur Verfügung.

gruss


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:19 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz