![]() |
'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. |
Re: 'Visualissation'
Was ist eine Visualissation? :gruebel:
|
Re: 'Visualissation'
Liste der Anhänge anzeigen (Anzahl: 1)
Sorry, hab den Screenshot vergessen :oops:
|
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 |
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]); { ... } |
Re: 'Visualissation'
Zitat:
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... |
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]); |
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:
nach dem abschließenden
p.Width := Round(Data[1]);
Delphi-Quellcode:
?
end;
Und selbst wenns andersherum sein soll: DAnn macht die Zeile keinen Sinn mehr:
Delphi-Quellcode:
weil er so oder so
p.Width := Round(max);
Delphi-Quellcode:
zugewiesen bekommt.
p.Width := Round(Data[1]);
|
Re: 'Visualissation'
Wenn ich ein Lied öffnen will tritt der Fehler auf.
|
Re: 'Visualissation'
Zitat:
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... |
Re: 'Visualissation'
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
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 ... . |
Re: 'Visualissation'
:pale: Erschrick mich nich so, TBassDLLPlayer macht Fehler ? :mrgreen:
Delphi-Quellcode:
Oder so....
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;
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; |
Re: 'Visualissation'
Zitat:
schon das angeschaut?
Delphi-Quellcode:
Edit. hatte da an meine Komponnete gedacht.
property RightPeak: dword read getRightPeak; {von 0 bis 32768}
property LeftPeak: dword read getLeftPeak; {von 0 bis 32768} ![]() btw. p ist kein guter Bezeichner für eine Paintbox. Ich würde p immer für einen lokalen Pointer halten. |
Re: 'Visualissation'
Zitat:
|
Re: 'Visualissation'
Ja so ist es. Demo bei TBassDLLPlayer (SimplePlayer 3) mit ProgressBar's.
|
Re: 'Visualissation'
Und jetzt muss ich left und right-peak miteinander verbinden, nur wie mach ich das, + - / * geht natürlich nicht.
|
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:
die kannst du dann im Timer aufrufen lassen:
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; (! 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); |
Re: 'Visualissation'
Delphi-Quellcode:
Was mach ich bloß immer falsch *heul* ? Egal wie ich den Timer einstelle, die cpu wird immer überfordert.
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; |
Re: 'Visualissation'
Zitat:
Delphi-Quellcode:
Ich weiß nicht, was p und p2 sein sollen??? Eventuell liegt da auch noch Optimierungsansatz.
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 //edit: schließenden quote-tag ergänzt :oops: |
Re: 'Visualissation'
Zitat:
|
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; |
Re: 'Visualissation'
Zitat:
Rate mal, wofür die zweite Möglichkeit von FAlter ist. |
Re: 'Visualissation'
Bessere Variante (Antiflacker):
Delphi-Quellcode:
Das Würde ich noch in eine extra Procedure auslagern.(Übersichtlicher)
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; 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.) |
Re: 'Visualissation'
Beide Methoden sind sehr gut, thx.
Nur was kann ich dagegen machen, dass immer der Computer überfordert wird ? |
Re: 'Visualissation'
Was haste denn für einen ? Pentium 75 ? :mrgreen:
Ist der Timmer Interval zu klein, höher setzen > 50 oder so. |
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 !!! |
Re: 'Visualissation'
Lager es vllt. in einen Thread aus?
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:00 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