Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi 'Visualissation' (https://www.delphipraxis.net/47947-visualissation.html)

Nils_13 18. Jun 2005 11:21


'Visualissation'
 
Hi,

wie ist es möglich eine 'Visualissation' zu programmieren. Ich weiß nur, dass man die Farbe bei einer entsprechenden 'Weite' abgeändert wird (Paintbox). Nur wie mach ich das ? Komponenten gibt es anscheinend nicht.

Luckie 18. Jun 2005 11:28

Re: 'Visualissation'
 
Was ist eine Visualissation? :gruebel:

Nils_13 18. Jun 2005 11:29

Re: 'Visualissation'
 
Liste der Anhänge anzeigen (Anzahl: 1)
Sorry, hab den Screenshot vergessen :oops:

Aenogym 18. Jun 2005 12:44

Re: 'Visualissation'
 
hi nils,

du zeichest einfach mehrere farbeverläufe in die paintbox und darüber dnan die skala. sollte nicht allzu schwer sein. die gesamtbriete der zu zeichnenden gradients nimmst du halt aus deinem eingabewert.

aenogym

Nils_13 18. Jun 2005 16:23

Re: 'Visualissation'
 
warum kommt hier eine ungültige Gleitkommaoperation ?
Delphi-Quellcode:
{ ... }
  if Data[1] > max then
    begin
      Max := Data[1];
      p.Width := Round(max);
    end;
  end;
  p.Width := Round(Data[1]);
{ ... }

Daniel G 18. Jun 2005 16:24

Re: 'Visualissation'
 
Zitat:

Zitat von Nils_13
warum kommt hier eine ungültige Gleitkommaoperation ?
Delphi-Quellcode:
{ ... }
  if Data[1] > max then
    begin
      Max := Data[1];
      p.Width := Round(max);
    end;
  end;
  p.Width := Round(Data[1]);
{ ... }

Ehrliche Antwort?
Keine Ahnung!

Von welchem Typ sind denn die Variablen? Das müsstest du schon dazu sagen. Durch 0 zu teilen scheinst du ja nicht zu tun...

Nils_13 18. Jun 2005 16:28

Re: 'Visualissation'
 
Delphi-Quellcode:
  private
    { Private-Deklarationen }
    Max: Single;

{...}

var
  data: TFFTData;
begin
    data := BassdllPlayer1.GetFFTData;
  if Data[1] > max then
    begin
      Max := Data[1];
      p.Width := Round(max);
    end;
  end;
  p.Width := Round(Data[1]);

Daniel G 18. Jun 2005 16:41

Re: 'Visualissation'
 
Hm...keine Ahnung... an welcher Stelle tritt das denn genau auf?


Da fällt mir grad was auf:

Warum kommt denn

Delphi-Quellcode:
p.Width := Round(Data[1]);
nach dem abschließenden
Delphi-Quellcode:
end;
?

Und selbst wenns andersherum sein soll:

DAnn macht die Zeile keinen Sinn mehr:

Delphi-Quellcode:
p.Width := Round(max);
weil er so oder so

Delphi-Quellcode:
 p.Width := Round(Data[1]);
zugewiesen bekommt.

Nils_13 18. Jun 2005 16:43

Re: 'Visualissation'
 
Wenn ich ein Lied öffnen will tritt der Fehler auf.

dizzy 18. Jun 2005 22:22

Re: 'Visualissation'
 
Zitat:

Wenn ich ein Lied öffnen will tritt der Fehler auf.
Mir platzt echt der Kragen. Du erwartest doch nicht allen Ernstes dass man dir auf Grund deiner Infos helfen wird, bzw. es überhaupt kann oder?
Wie könntest du mir Hilfe leisten, wenn ich dir sage: "Mein linker Hutzen tropft, das kadüngelt wenn ich pangelich sehe."? ... Richtig - garnicht. Ohne Definitionen und Kontext kann das einfach nichts werden. Lies dir deine Beiträge bitte mal durch, und zwar stelle dir dabei vor dass du kein Stück des Zusammenhangs wüsstest, wie jeder andere hier auch. Was fällt dir auf?

Entschuldigt dieses OT bitte, aber das war mir jetzt ein großes Anliegen...

Nils_13 19. Jun 2005 15:58

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

Zitat von dizzy
Zitat:

Wenn ich ein Lied öffnen will tritt der Fehler auf.
Mir platzt echt der Kragen. Du erwartest doch nicht allen Ernstes dass man dir auf Grund deiner Infos helfen wird, bzw. es überhaupt kann oder?
Wie könntest du mir Hilfe leisten, wenn ich dir sage: "Mein linker Hutzen tropft, das kadüngelt wenn ich pangelich sehe."? ... Richtig - garnicht. Ohne Definitionen und Kontext kann das einfach nichts werden. Lies dir deine Beiträge bitte mal durch, und zwar stelle dir dabei vor dass du kein Stück des Zusammenhangs wüsstest, wie jeder andere hier auch. Was fällt dir auf?

Entschuldigt dieses OT bitte, aber das war mir jetzt ein großes Anliegen...

Sry.
Ich wollte mich erstmal nicht mit der bass.dll rumschlagen und habe zum testen den 'bassdllplayer' benutzt.
Der Fehler tritt erst auf, wenn ich auf den 'open-button' klicke. Unten im Anhang der gesamte Code ... .
Erstmal danke für die vielen antworten ... .

turboPASCAL 19. Jun 2005 17:37

Re: 'Visualissation'
 
:pale: Erschrick mich nich so, TBassDLLPlayer macht Fehler ? :mrgreen:


Delphi-Quellcode:
procedure TForm1.Timer2Timer(Sender: TObject);
var
  data: TFFTData;
begin
  IF BassdllPlayer1.status = sndPLAYING then
  begin
    data := BassdllPlayer1.GetFFTData;
    if Data[1] > max then
    begin
      Max := Data[1];
      p.Width := Round(max);
    end;

    // <--- da wäre es besser

  end;

  if Data[1] > max then // <--- ab hier Fehler
  begin
    Max := Data[1];
    ProgressBar1.Max := Round(max);
  end;
  ProgressBar1.Position := Round(Data[1]);
end;
Oder so....

Delphi-Quellcode:
procedure TForm1.Timer2Timer(Sender: TObject);
var
  data: TFFTData;
begin
  if BassdllPlayer1.status <> sndPLAYING then exit;

  data := BassdllPlayer1.GetFFTData;
  if Data[1] > max then
  begin
    Max := Data[1];
    p.Width := Round(max);
  end;

  if Data[1] > max then
  begin
    Max := Data[1];
    ProgressBar1.Max := Round(max);
  end;

  ProgressBar1.Position := Round(Data[1]);
end;

Gandalfus 19. Jun 2005 20:11

Re: 'Visualissation'
 
Zitat:

Zitat von turboPASCAL
:pale: Erschrick mich nich so, TBassDLLPlayer macht Fehler ? :mrgreen:

Nein das ist unmöglich. :wink:


schon das angeschaut?

Delphi-Quellcode:
property RightPeak: dword read getRightPeak;  {von 0 bis 32768}
property LeftPeak: dword read getLeftPeak;    {von 0 bis 32768}
Edit. hatte da an meine Komponnete gedacht. www.blubplayer.de wusste nicht das es eine Komponnete mit dem gleichen Namen gibt.

btw. p ist kein guter Bezeichner für eine Paintbox. Ich würde p immer für einen lokalen Pointer halten.

Nils_13 20. Jun 2005 14:59

Re: 'Visualissation'
 
Zitat:

Zitat von Gandalfus
Zitat:

Zitat von turboPASCAL
:pale: Erschrick mich nich so, TBassDLLPlayer macht Fehler ? :mrgreen:

Nein das ist unmöglich. :wink:


schon das angeschaut?

Delphi-Quellcode:
property RightPeak: dword read getRightPeak;  {von 0 bis 32768}
property LeftPeak: dword read getLeftPeak;    {von 0 bis 32768}
Edit. hatte da an meine Komponnete gedacht. www.blubplayer.de wusste nicht das es eine Komponnete mit dem gleichen Namen gibt.

btw. p ist kein guter Bezeichner für eine Paintbox. Ich würde p immer für einen lokalen Pointer halten.

Schön, ich kenn mich damit nicht aus, deshalb frag ich ja auch nach, left peak steht für linken Lautsprecher und right peak für den rechten ?

turboPASCAL 20. Jun 2005 15:03

Re: 'Visualissation'
 
Ja so ist es. Demo bei TBassDLLPlayer (SimplePlayer 3) mit ProgressBar's.

Nils_13 20. Jun 2005 15:16

Re: 'Visualissation'
 
Und jetzt muss ich left und right-peak miteinander verbinden, nur wie mach ich das, + - / * geht natürlich nicht.

turboPASCAL 20. Jun 2005 15:51

Re: 'Visualissation'
 
Verbinden ? Du hast eine Aussteuerung vom linken und vom rechten Kanal, also so zu sagen den linken und den rechten Lautsprecher.

Baue dir eine procedure die zwei Balken zeichnet.

Delphi-Quellcode:
procedure DrawMyBars(LKanal, RKanal: Longword);
begin
  if BassDLLPlayer1.Status = sndPlaying then
  begin
    // alles was in der PaintBox gezeichnet werden soll wenn Player läuft zB.:
    for i := 0 to LKanal do
      PaintBoxX.Canvas....odersowas
    for i := 0 to RKanal do
      PaintBoxX.Canvas....odersowas
  end else
  begin
    // alles was in der PaintBox gezeichnet werden soll wenn Player auf Stop
  end;
end;
die kannst du dann im Timer aufrufen lassen:
(! Setze den Interval des Timers nicht zu klein das gibt event. Probleme)

Delphi-Quellcode:
procedure TFormX.Timer1Timer(Sender: TObject);
begin
  // Bar's zeichnen
  DrawMyBars(BassDLLPlayer1.LeftPeak, BassDLLPlayer1.RightPeak);

Nils_13 20. Jun 2005 16:06

Re: 'Visualissation'
 
Delphi-Quellcode:
procedure TForm1.DrawMyBars(LKanal, RKanal: Longword);
var i: integer;
begin
  if BassDLLPlayer1.Status = sndPlaying then
  begin
    for i := 0 to LKanal do
      p.Width := p.Width + 1;
     // DrawGradient
    for i := 0 to RKanal do
      p2.Width := p2.Width + 1;
  end else
  begin
    p.Width := 0;
    p2.Width := 0;
  end;
end;
Was mach ich bloß immer falsch *heul* ? Egal wie ich den Timer einstelle, die cpu wird immer überfordert.

FAlter 20. Jun 2005 16:24

Re: 'Visualissation'
 
Zitat:

Zitat von Nils_13
Delphi-Quellcode:
    for i := 0 to LKanal do
      p.Width := p.Width + 1;
     // DrawGradient
    for i := 0 to RKanal do
      p2.Width := p2.Width + 1;

Optimierungsvorschlag: Statt es in einer Schleife jedes mal um eins zu erhöhen...

Delphi-Quellcode:
inc(p.Width, LKanal + 1); //analog für rechts

//oder (falls Width ein Property ist)
p.Width := LKanal + 1 + p.Width; //analog für rechts
Ich weiß nicht, was p und p2 sein sollen??? Eventuell liegt da auch noch Optimierungsansatz.

//edit: schließenden quote-tag ergänzt :oops:

Nils_13 20. Jun 2005 17:39

Re: 'Visualissation'
 
Zitat:

Zitat von FAlter
Zitat:

Zitat von Nils_13
Delphi-Quellcode:
    for i := 0 to LKanal do
      p.Width := p.Width + 1;
     // DrawGradient
    for i := 0 to RKanal do
      p2.Width := p2.Width + 1;

Optimierungsvorschlag: Statt es in einer Schleife jedes mal um eins zu erhöhen...

Delphi-Quellcode:
inc(p.Width, LKanal + 1); //analog für rechts

//oder (falls Width ein Property ist)
p.Width := LKanal + 1 + p.Width; //analog für rechts
Ich weiß nicht, was p und p2 sein sollen??? Eventuell liegt da auch noch Optimierungsansatz.

//edit: schließenden quote-tag ergänzt :oops:

Geht nicht: der linken Seite kann nichs zugewiesen werden.

turboPASCAL 20. Jun 2005 18:17

Re: 'Visualissation'
 
Ein Beispiel:

Delphi-Quellcode:
// Diese Methode flackert, weil erst der Hintergrund gelöscht wird
// und danach gezeichnet.
procedure TForm1.Timer1Timer(Sender: TObject);
var
  p: integer;
  aRect: TRect;
begin
  // Bar's zeichnen / aktualisieren
  if BassDLLPlayer1.Status = sndPlaying then
  begin
    aRect := PaintBox1.ClientRect;

    // Hintergrund der PaintBox Löschen
    PaintBox1.Canvas.Brush.Color := clBlack;
    PaintBox1.Canvas.Brush.Style := bsSolid;
    PaintBox1.Canvas.FillRect(aRect);

    //--- Obere Hälfte - LeftPeak ---------------------------------
    aRect.Bottom := (aRect.Bottom div 2) - 1; //Obere Hälfte der PaintBox

    // Ein bischen Prozentrechnung
    p := trunc((BassDLLPlayer1.LeftPeak / MaxPeak) * 100);
    aRect.Right := trunc((p * aRect.Right) / 100);

    PaintBox1.Canvas.Brush.Color := clRed;
    PaintBox1.Canvas.FillRect(aRect);

    //--- Untere Hälfte - RightPeak -------------------------------
    aRect.Right := TmpRight;  // <----<<< diese Zeile fehlte noch <----<<<
    aRect.Top := aRect.Bottom + 3; //Untere Hälfte der PaintBox 3 Px Abstand
    aRect.Bottom := aRect.Bottom * 2 + 3;

    // Ein bischen Prozentrechnung
    p := trunc((BassDLLPlayer1.RightPeak / MaxPeak) * 100);
    aRect.Right := trunc((p * aRect.Right) / 100);

    PaintBox1.Canvas.Brush.Color := clRed;
    PaintBox1.Canvas.FillRect(aRect);
  end;
end;

Khabarakh 20. Jun 2005 18:27

Re: 'Visualissation'
 
Zitat:

Zitat von Nils_13
Zitat:

Zitat von FAlter
Zitat:

Zitat von Nils_13
Delphi-Quellcode:
    for i := 0 to LKanal do
      p.Width := p.Width + 1;
     // DrawGradient
    for i := 0 to RKanal do
      p2.Width := p2.Width + 1;

Optimierungsvorschlag: Statt es in einer Schleife jedes mal um eins zu erhöhen...

Delphi-Quellcode:
inc(p.Width, LKanal + 1); //analog für rechts

//oder (falls Width ein Property ist)
p.Width := LKanal + 1 + p.Width; //analog für rechts
Ich weiß nicht, was p und p2 sein sollen??? Eventuell liegt da auch noch Optimierungsansatz.

//edit: schließenden quote-tag ergänzt :oops:

Geht nicht: der linken Seite kann nichs zugewiesen werden.

:roll:

Rate mal, wofür die zweite Möglichkeit von FAlter ist.

turboPASCAL 20. Jun 2005 19:00

Re: 'Visualissation'
 
Bessere Variante (Antiflacker):

Delphi-Quellcode:
procedure TForm1.Timer1Timer(Sender: TObject);
const
  MaxPeak = 32768; // sollte schon in BassDLLPlayer global def. sein
var
  p, TmpRight: integer;
  aRect, bRect: TRect;
begin
  // Bar's zeichnen / aktualisieren
  if BassDLLPlayer1.Status = sndPlaying then
  begin
    // Leinwandgrösse ermitteln
    aRect := PaintBox1.ClientRect;
    TmpRight := aRect.Right;
   
    // Hintergrund Style für Pinsel setzen
    PaintBox1.Canvas.Brush.Style := bsSolid;

    //--- Obere Hälfte - LeftPeak ---------------------------------
    aRect.Bottom := (aRect.Bottom div 2) - 1; //Obere Hälfte der PaintBox

    // Ein bischen Prozentrechnung (p {Prozent} = Peak ist wieviel % von MaxPeak)
    p := trunc((BassDLLPlayer1.LeftPeak / MaxPeak) * 100);
    aRect.Right := trunc((p * aRect.Right) / 100);
    // Zeichnen des Peak-Wertes
    PaintBox1.Canvas.Brush.Color := clRed; // <-
    PaintBox1.Canvas.FillRect(aRect);     // <-
    // oder DrawGradient(PaintBox1.Canvas, aRect, True, [clYellow, clRed]);

    // Rechten Rest von PaintBox berechnen
    bRect := aRect;
    bRect.Right := TmpRight;
    bRect.Left := aRect.Right;
    // Zeichnen des rechten Rests in Black
    PaintBox1.Canvas.Brush.Color := clBlack;
    PaintBox1.Canvas.FillRect(bRect);
    //--- Untere Hälfte - RightPeak -------------------------------
    aRect.Right := TmpRight;  // <----<<< diese Zeile fehlte noch <----<<<
    aRect.Top := aRect.Bottom + 3; // untere Hälfte der PaintBox 3 Px Abstand
    aRect.Bottom := (aRect.Bottom * 2) + 3; // es Fehlen ja noch 3 Px von oben

    // Ein bischen Prozentrechnung
    p := trunc((BassDLLPlayer1.RightPeak / MaxPeak) * 100);
    aRect.Right := trunc((p * aRect.Right) / 100);
    // Zeichnen des Peak Wertes
    PaintBox1.Canvas.Brush.Color := clRed; // <-
    PaintBox1.Canvas.FillRect(aRect);     // <-
    // oder DrawGradient(PaintBox1.Canvas, aRect, True, [clYellow, clRed]);
    // Rechten Rest von PaintBox berechnen
    bRect := aRect;
    bRect.Right := TmpRight;
    bRect.Left := aRect.Right;
    // Zeichnen des rechten Rests in Black
    PaintBox1.Canvas.Brush.Color := clBlack;
    PaintBox1.Canvas.FillRect(bRect);
  end;
end;
Das Würde ich noch in eine extra Procedure auslagern.(Übersichtlicher)

Bitte verwende aussagekräftigere Namen PaintBox1 oder MyPaintBox auch wenn es mehr Arbeit beim Tippen macht, sonst verliert man nach einer Weile die Übersicht.
(…und die Leute im Forum wissen nicht was Du damit meinst.)

Nils_13 20. Jun 2005 19:14

Re: 'Visualissation'
 
Beide Methoden sind sehr gut, thx.
Nur was kann ich dagegen machen, dass immer der Computer überfordert wird ?

turboPASCAL 20. Jun 2005 19:20

Re: 'Visualissation'
 
Was haste denn für einen ? Pentium 75 ? :mrgreen:

Ist der Timmer Interval zu klein, höher setzen > 50 oder so.

Nils_13 20. Jun 2005 19:22

Re: 'Visualissation'
 
Ich hab einen AMD AThlon mit einer guten Grafikkarte, außerdem muss das Programm auch auf anderen Computern laufen. Bei mir sind es 100%, mit 50 ist es auch nicht besser.
ICh geb mich geschlagen, ich hatte noch einen anderen Timer laufen.

THX !!!

Die Muhkuh 20. Jun 2005 19:24

Re: 'Visualissation'
 
Lager es vllt. in einen Thread aus?


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:52 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