Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi RGB Lampe Sound 2 Light Steuerung (https://www.delphipraxis.net/134132-rgb-lampe-sound-2-light-steuerung.html)

Blamaster 16. Mai 2009 12:02


RGB Lampe Sound 2 Light Steuerung
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hi,

ich habe diesen thread jetzt erstellt, um da der alte thread:

"Winamp Peaks auslesen" (http://www.delphipraxis.net/internal...t.php?t=157807)

nicht mehr so wirklich passt, bzw. es nun um etwas anderes geht.

Ich lese jetzt mithilfe der Bass.dll die Peaks der Soundkarten Ausgänge aus und habe somit nun die Peakwerte.

Mein Problem ist jetzt allerdings das meine Umsetzungsidee um anhand der Peaks die Farben zu erzeugen nicht so wirklich klappt.

Delphi-Quellcode:
procedure TForm1.Timer1Timer(Sender: TObject);
var
  Color_R, Color_G, Color_B, level: integer;
begin
  level := BASS_ChannelGetLevel(RecChannel);
  if CheckBox1.Checked = true then Color_R := (round(HIWORD(level) / 255) + TrackBar1.Position) else Color_R := 0;
  if CheckBox2.Checked = true then Color_G := (round(HIWORD(level) / 255) + TrackBar1.Position) else Color_G := 0;
  if CheckBox3.Checked = true then Color_B := (round(HIWORD(level) / 255) + TrackBar1.Position) else Color_B := 0;

  JvColorTrackBar4.Position := Color_R;
  JvColorTrackBar5.Position := Color_G;
  JvColorTrackBar6.Position := Color_B;
  JvPanel3.Color := RGB(Color_R, Color_G, Color_B);

  SendRGB(Color_R, Color_G, Color_B);
end;
Funktionieren tut das ansich auch. (Timer ist momentan auf 100ms eingestellt). Das Problem ist nur das die Übergänge der Farben viel zu ruppig sind. Somit hat man einfach nur ein nerviges flackern.

Um sich das ggf. besser vorstellen zu können habe ich das Programm mal angehängt. (Im Reiter Sound2Light auf aktivieren klicken)

Hat jemand eine Idee wie man das ganze abändern könnte um schön weiche Farbübergänge/Effekte zur Musik zur erzeugen ?

mfg Blamaster

himitsu 16. Mai 2009 12:23

Re: RGB Lampe Sound 2 Light Steuerung
 
Du könntes die RGB-Wert des vorherirgen Durchlaufs mit einrechnen und so die starken Sprünge verringern/abschwächen?

z.B. nur 10% (eventuell auch mehr oder weniger) des Sound-Wertes in den aktuellen Anzeige-Wert einfließen lassen
Delphi-Quellcode:
var Color_R_old, Color_G_old, Color_B_old: Integer;

procedure TForm1.Timer1Timer(Sender: TObject);
var
  Color_R, Color_G, Color_B, level: Integer;

begin
  ...
  if CheckBox3.Checked = true then Color_B := (round(HIWORD(level) / 255) + TrackBar1.Position) else Color_B := 0;

  Color_R := Color_R * 10 div 100 + Color_R_old * 90 div 100;
  Color_G := Color_G * 10 div 100 + Color_G_old * 90 div 100;
  Color_B := Color_B * 10 div 100 + Color_B_old * 90 div 100;
  Color_R_old := Color_R;
  Color_G_old := Color_G;
  Color_B_old := Color_B;

  JvColorTrackBar4.Position := Color_R;
  ...
end;

Blamaster 16. Mai 2009 12:39

Re: RGB Lampe Sound 2 Light Steuerung
 
Hi,

Danke für den Tipp.

Delphi-Quellcode:
procedure TForm1.Timer1Timer(Sender: TObject);
var
  Color_R, Color_G, Color_B, Color_R_old, Color_G_old, Color_B_old, level: integer;
begin
  level := BASS_ChannelGetLevel(RecChannel);

  if CheckBox1.Checked = true then Color_R := (round(HIWORD(level) / 255) + TrackBar1.Position) else Color_R := 0;
  if CheckBox2.Checked = true then Color_G := (round(HIWORD(level) / 255) + TrackBar1.Position) else Color_G := 0;
  if CheckBox3.Checked = true then Color_B := (round(HIWORD(level) / 255) + TrackBar1.Position) else Color_B := 0;

  if CheckBox1.Checked = true then Color_R := Color_R * 10 div 100 + Color_R_old * 90 div 100;
  if CheckBox2.Checked = true then Color_G := Color_G * 10 div 100 + Color_G_old * 90 div 100;
  if CheckBox3.Checked = true then Color_B := Color_B * 10 div 100 + Color_B_old * 90 div 100;
  Color_R_old := Color_R;
  Color_G_old := Color_G;
  Color_B_old := Color_B;

  JvColorTrackBar4.Position := Color_R;
  JvColorTrackBar4.Position := Color_G;
  JvColorTrackBar4.Position := Color_B;
  JvPanel3.Color := RGB(Color_R, Color_G, Color_B);

  SendRGB(Color_R, Color_G, Color_B);
end;
so tut sich leider garnichts mehr, oder habe ich da einen Denkfehler drin ?

himitsu 16. Mai 2009 12:55

Re: RGB Lampe Sound 2 Light Steuerung
 
Color_G_old und Co. mußt du natürlich extern haben, da diese ja die Funktion, bis zum nächsten Aufruf, überleben sollen :zwinker:
Also am Besten wohl im Private-Abschnitt deiner Form.

Delphi-Quellcode:
type
  TForm1 = class(TForm)
  private
    { Private-Deklarationen }
    Color_R_old, Color_G_old, Color_B_old: Integer;
  public
    { Public-Deklarationen }
  end;

procedure TForm1.Timer1Timer(Sender: TObject);
var
  Color_R, Color_G, Color_B, level: integer;
begin
  level := BASS_ChannelGetLevel(RecChannel);

  if CheckBox1.Checked then begin
    Color_R := (round(HIWORD(level) / 255) + TrackBar1.Position);
    Color_R := Color_R * 10 div 100 + Color_R_old * 90 div 100;
    Color_R_old := Color_R;
  end else Color_R := 0;

  if CheckBox1.Checked then begin
    Color_G := (round(HIWORD(level) / 255) + TrackBar1.Position);
    Color_G := Color_G * 10 div 100 + Color_G_old * 90 div 100;
    Color_G_old := Color_G;
  end else Color_G := 0;

  if CheckBox1.Checked then begin
    Color_B := (round(HIWORD(level) / 255) + TrackBar1.Position);
    Color_B := Color_B * 10 div 100 + Color_B_old * 90 div 100;
    Color_B_old := Color_B;
  end else Color_B := 0;

  JvColorTrackBar4.Position := Color_R;
  JvColorTrackBar5.Position := Color_G;
  JvColorTrackBar6.Position := Color_B;
  JvPanel3.Color := RGB(Color_R, Color_G, Color_B);

  SendRGB(Color_R, Color_G, Color_B);
end;
Aber mal 'ne Frage, kann es sein, daß die Berechnungen für R, G und B gleich sind?
Und wenn ja, warum dann 3-Mal berechnen und nicht nur einmal?


PS: prüfe niemals auf TRUE ... gibt aber schon genügend Threads, welche das WARUM erklären

Medium 16. Mai 2009 14:39

Re: RGB Lampe Sound 2 Light Steuerung
 
Ganz nett schaut es meist aus, wenn man Lautstärkenänderung nach oben sofort anzeigt, und von da aus das Peakmeter langsam abfallen lässt. Also wenn man sich das als Balken vorstellt ist das ein von selbst ständig langsam kleiner werdender Balken, der von der Musik immer wieder mal hoch gedrückt wird. Das dürfte bei Helligkeiten ähnlich gut ausschauen.


Delphi-Quellcode:
TForm1 = class
..
private
  Color_R, Color_G, Color_B: integer;
end;

.
.
.


procedure TForm1.Timer1Timer(Sender: TObject);
var
  r, g, b, level: Integer;
begin
  level := BASS_ChannelGetLevel(RecChannel);
  if CheckBox1.Checked then r := (round(HIWORD(level) / 255) + TrackBar1.Position) else r := 0;
  if CheckBox2.Checked then g := (round(HIWORD(level) / 255) + TrackBar1.Position) else g := 0;
  if CheckBox3.Checked then b := (round(HIWORD(level) / 255) + TrackBar1.Position) else b := 0;

  if r>Color_R then Color_R := r else
    if Color_R>0 then dec(Color_R);
  if g>Color_G then Color_G := g else
    if Color_G>0 then dec(Color_G);
  if b>Color_B then Color_B := b else
    if Color_B>0 then dec(Color_B);

  JvColorTrackBar4.Position := Color_R;
  JvColorTrackBar5.Position := Color_G;
  JvColorTrackBar6.Position := Color_B;
  JvPanel3.Color := RGB(Color_R, Color_G, Color_B);

  SendRGB(Color_R, Color_G, Color_B);
end;
Sowas könnte funktionieren (im Browser getippt, keine Garantie ;))

Blamaster 16. Mai 2009 19:39

Re: RGB Lampe Sound 2 Light Steuerung
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hi,

Danke für die guten Lösungsansätze.

Ich habe aus den 2 Vorschlägen jetzt mal einen gemacht.

Delphi-Quellcode:
procedure TForm1.Timer1Timer(Sender: TObject);
var
  Color_R, Color_G, Color_B, level: integer;
begin

  level := BASS_ChannelGetLevel(RecChannel);

  if CheckBox1.Checked then begin
    Color_R := round((LOWORD(level) / (32768 / 255)) - TrackBar1.Position);
    Color_R := Color_R * 5 div 100 + Color_R_old * 95 div 100;
  end else Color_R := 0;

  if CheckBox2.Checked then begin
    Color_G := round((LOWORD(level) / (32768 / 255)) - TrackBar1.Position);
    Color_G := Color_G * 5 div 100 + Color_G_old * 95 div 100;
  end else Color_G := 0;

  if CheckBox3.Checked then begin
    Color_B := round((HIWORD(level) / (32768 / 255)) - TrackBar1.Position);
    Color_B := Color_B * 5 div 100 + Color_B_old * 95 div 100;
  end else Color_B := 0;

  if Color_R > Color_R_old then Color_R_old := Color_R else
    if Color_R_old > 0 then Color_R_old := (Color_R_old - 20);
  if Color_G > Color_G_old then Color_G_old := Color_G else
    if Color_G_old > 0 then Color_G_old := (Color_G_old - 20);
  if Color_B > Color_B_old then Color_B_old := Color_B else
    if Color_B_old > 0 then Color_B_old := (Color_B_old - 20);

  JvColorTrackBar4.Position := Color_R_old;
  JvColorTrackBar5.Position := Color_G_old;
  JvColorTrackBar6.Position := Color_B_old;
  JvPanel3.Color := RGB(Color_R_old, Color_G_old, Color_B_old);

  SendRGB(Color_R_old, Color_G_old, Color_B_old);

end;
Funktioniert soweit auch schonmal garnicht so schlecht, denke aber mal noch verbesserungsfähig.

Falls jemand noch einen Vorschlag zur verbesserung hat immer her damit :)

Ich habe damit sich auch besser probieren lässt im anhang nochmal das Programm inkl. Source.

mfg Blamaster


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