AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

WaveFade

Ein Thema von EWeiss · begonnen am 25. Apr 2009 · letzter Beitrag vom 20. Jun 2019
Antwort Antwort
Seite 2 von 2     12   
EWeiss
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

Geändert von Daniel ( 7. Feb 2016 um 12:44 Uhr) Grund: Anhänge auf Wunsch des Autors entfernt.
 
EWeiss
 
#11
  Alt 26. Apr 2009, 19:59
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
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

 
Delphi 12 Athens
 
#12
  Alt 26. Apr 2009, 20:07
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]
  Mit Zitat antworten Zitat
EWeiss
 
#13
  Alt 26. Apr 2009, 20:11
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
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

 
Delphi 12 Athens
 
#14
  Alt 26. Apr 2009, 20:16
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]
  Mit Zitat antworten Zitat
EWeiss
 
#15
  Alt 26. Apr 2009, 20:22
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
  Mit Zitat antworten Zitat
EWeiss
 
#16
  Alt 27. Apr 2009, 10:38
Hmm will irgendwie nicht..
Sehe schon muss noch einiges lernen.

Hat sich erledigt..

gruss EMil
  Mit Zitat antworten Zitat
EWeiss
 
#17
  Alt 28. Apr 2009, 08:09
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
  Mit Zitat antworten Zitat
EWeiss
 
#18
  Alt 19. Jun 2019, 18:57
Hat vielleicht jemand von euch den Quelltext noch irgendwo auf seiner Platte oder Archiviert?
Hab meinen verloren.

gruss
  Mit Zitat antworten Zitat
EWeiss
 
#19
  Alt 20. Jun 2019, 06:03
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

Geändert von EWeiss (11. Jul 2019 um 15:57 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:10 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