Delphi-PRAXiS
Seite 2 von 4     12 34      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   equalizer mit der bass.dll (https://www.delphipraxis.net/50083-equalizer-mit-der-bass-dll.html)

dizzy 20. Sep 2005 01:40

Re: equalizer mit der bass.dll
 
Die Deklaration von TWaveData wäre an dieser Stelle interessant, wobei es ja aber denk ich ein array of Integer (oder anderem vorzeichenbehafteten Ganzzahltyp) sein müsste. An sich sehe ich in dem QT oben soweit keine groben Schnitzer. Eventuell einfach mal testweise statt der Paintbox.Height und Trackbar.Position fixe Werte einsetzen und schauen ob's ähnlich wird. Aber sonst gäbe es nach dem zu urteilen was du schreibst nur noch 2 Möglichkeiten:
1) Die verwendete Unit macht beim Abholen der Wavedaten Murks (ein Link zur entsprechenden wäre echt hilfreich, oder im Zweifel nochmal hier anhängen)
2) Du hast ein komisches Soundfile :D

Ah, ich schau grad in eine Bass-Unit die ich hier von Gandalfus habe. Die Bezeichner sehen doch recht ähnlich aus - evtl. ist sie das ja. Dort ist TWaveData als "array[0..2048] of smallint" deklariert, also wie vermutet.
Die Funktion zum Befüllen sieht dort so aus:
Delphi-Quellcode:
function TBassPlayer.getwavedata: TWaveData;
begin
  Bass_ChannelGetData(Channel, @result, 2048);
end;
...und das nutze ich 1:1 so in meinem Player der damit manche seiner Visuals realisiert. Schau mal nach wie "GetWavedata" bei deiner Unit implementiert ist, und ob TWaveData ähnlich ausschaut. Probier auch mal verschiedene Musikfiles aus, um das als Fehlerquelle auszuschließen.

Btw noch ein heisser Tipp! Bei Stereo-Daten werden diese in dem Array "interleaved", d.h. in den geraden Indezes des Arrays sind die Daten für den linken Kanal, und in den ungeraden für den rechten :!:

Gruss,
Fabian

padavan 20. Sep 2005 07:30

Re: equalizer mit der bass.dll
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hmm,
1. Soundfiles sind diverse Musikstücke, würde dies als Fehlerquelle auschließen.
2. Paintbox1.height div 2 setzt in die Mitte, lass ich das weg ist es am oberen Anschlag, bringt auch nichts
3. mir ist nicht klar, welche Unit beim Abholen evtl. murks macht. Ich nehme an, du meinst die Komponente in der die Bass.dll zur Verfügung gestellt wird?!
(Hab die Komponente "TBassDllPlayer" mal angehängt.)

4. Das die geraden den linken und die ungeraden den rechten Kanal ausgeben habe ich nicht gewusst, dass war in der Tat ein heißer Tipp :-D

Trotzdem hat´s am aussehen nichts geändert. Der Pegel der Visalisierung erinnert nach wie vor eher an einen Gleichstromsteller für Elektromotoren als an Musik :(

Ich hab das Gefühl, dass ich sehr nah dran bin, aber irgendwie....

Delphi-Quellcode:

Paintbox1.Canvas.pen.color := RGB(255 - i, i, 0);
if i mod 2 = 0 then
  Paintbox1.Canvas.LineTo(i,Paintbox1.height div 2 - Data1[i] div trackbar3.position);

Paintbox1.Canvas.pen.color := clyellow;
if i mod 2 = 1 then
  Paintbox1.Canvas.LineTo(i,Paintbox1.height div 2 - Data1[i] div trackbar3.position);

turboPASCAL 20. Sep 2005 09:13

Re: equalizer mit der bass.dll
 
Den "TBassDllPlayer" kann man hier im DP-Forum hrunterladen. :wink:

Besser wäre es wenn du einfach mal Deinen Code anhängen wurdest. Dein QT ist ein bissel knapp.
Ich würde mir gern die Zusammenhäng anschauen.

Was für eine Vis willst du überhaupt erstellen (Spectrum, Oscilloscop)?

padavan 20. Sep 2005 09:43

Re: equalizer mit der bass.dll
 
Oszilloskop hätte ich gern, Spectrum klappt ja bereits einwandfrei mit FFTData.

Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin
  OpenDialog1.Filter := BassDLLPlayerFileFilter;

  bkBitmap := TBitmap.Create;
  bkBitmap.Width := 30;
  bkBitmap.Height := 30;
  bkBitmap.Canvas.Brush.Color := clBlack;
  bkBitmap.Canvas.FillRect(Rect(0, 0, 30, 30));
  BitmapRect := Rect(0, 0, bkBitmap.Width, bkBitmap.Height);

end;



procedure TForm1.Button1Click(Sender: TObject);
begin // Open File & Play
  if Opendialog1.Execute then
  begin
    if BassdllPlayer1.LoadFromFile(Opendialog1.FileName) then
    begin
      BassdllPlayer1.Play;
  end;
end;


(* um nur eine "Probe zu holen" *)
procedure TForm1.Button2Click(Sender: TObject);
var Data1: Twavedata;
    i: integer;
begin
    data1 := BassdllPlayer1.GetwaveData;

      Paintbox1.Canvas.CopyRect(Paintbox1.ClientRect, bkBitmap.Canvas, BitmapRect);

      Paintbox1.Canvas.MoveTo(0, Paintbox1.height div 2);
      for i := 0 to 2048 do begin
        Paintbox1.Canvas.pen.color := RGB(255 - i, i, 0);
        if i mod 2 = 0 then
          Paintbox1.Canvas.LineTo(i,Paintbox1.height div 2 - Data1[i] div trackbar3.position);

// test für rechten Kanal
//        Paintbox1.Canvas.pen.color := clyellow;
//        if i mod 2 = 1 then
//          Paintbox1.Canvas.LineTo(i,Paintbox1.height div 2 - Data1[i] div trackbar3.position);
      end;

end;
Das war´s, erst mal auf´s wesentliche runtergebrochen.


hier das für´s Spectrum, was wiegesagt aber schon funzt...
Delphi-Quellcode:
procedure TForm1.Timer2Timer(Sender: TObject);  // Draw Vis.
var
  data: TFFTData;
  i: integer;
  tmpBitmap: TBitmap;
begin
    data := BassdllPlayer1.GetfftData;

    for i := 0 to 255 do
      Data[i] := Data[i] * ln(i + 1) * Trackbar1.Position * Paintbox1.ClientHeight;

    Paintbox1.Canvas.CopyRect(Paintbox1.ClientRect, bkBitmap.Canvas, BitmapRect);

    Paintbox1.Canvas.MoveTo(0, Paintbox1.height div 2);
    for i := 0 to 255 do begin
      Paintbox1.Canvas.pen.color := RGB(255 - i, i, 0);
      Paintbox1.Canvas.LineTo(i, Paintbox1.height div 2 - round(Data[i]));
    end;
end;
PS: Also um´s auf den Punkt zu bringen:
Die Frequenz des Lieder wird richtig dargestellt, nur die Spannungshöhe/ der Pegel ist irgendwie falsch,
da es wiegesagt mehr an eine Pulsweitenmodulation ausschaut, aber irgendwie gar nicht wie Musik eben.

padavan 20. Sep 2005 10:27

Re: equalizer mit der bass.dll
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ich denke ich bin dem Problem jetzt ganz nah auch die Schliche gekommen.
Habe mal einen 100Hz Ton abgespielt, im Anhang ist zu sehen, was dabei herauskam.
Es liegt einfach daran, das ich nicht weiß, was ich mit den Werten aus GetWaveData machen muss, denn:
Es ist jetzt eindeutig zu erkennen, dass der Kurvenverlauf an sich ja stimmt, nur das Quasi zwischen jeder Halbwelle irgendwie einen "rießen Offset" reinkommt, der die Welle dann nach oben bzw. nach unten "schiebt".

turboPASCAL 20. Sep 2005 12:00

Re: equalizer mit der bass.dll
 
Zitat:

Zitat von padavan
Ich denke ich bin dem Problem jetzt ganz nah...

:mrgreen:

:gruebel:
Delphi-Quellcode:
RechterKanal := LoWord(WaveData[i]);
LinkerKanal := HiWord(WaveData[i]);
;-)
Delphi-Quellcode:
procedure OscDraw(Paintbox: TPaintBox; WaveData : TWaveData; ScopeOff: Word);
const
  DrawRes = 2; // "Genauigkeit"
var
  i, YPos : LongInt;
  HalfHeight : Integer;
  R, L : SmallInt;
begin
  With PaintBox do
  begin
    // Zeichenstifte setzen
    Canvas.Pen.Color := clBlack;
    Canvas.Brush.Color := clBlack;

    // Hintergrund löschen
    Canvas.Rectangle(0, 0, Width, Height);

    // halbe höhe der PaintBox
    HalfHeight := Height div 2;

    // Zeichenstifte setzen
    Canvas.Pen.Color := clRed;
    Canvas.Pen.Width := 1;

    // Anfangspos setzen
    Canvas.moveto(0, HalfHeight);

    // Daten Zeichnen
    for i := 0 to 255 do
    begin
      R := SmallInt(Loword(WaveData[i * DrawRes])); // Rechter Kanal
      L := SmallInt(HIword(WaveData[i * DrawRes])); // Linker Kanal

      // Zusammenrechnen der Kanäle + Zoom
      YPos := Trunc( ((R + L) / (2 * 65535)) * ScopeOff ) ;
      Canvas.lineto(i, HalfHeight + YPos);
    end;
  end;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  OscDraw(Paintbox1, BassdllPlayer1.getWaveData, 250);
end;
Ähnlichkeiten zu anderen Codes können durchaus entstanden sein. ;-)
Beispiele zu VIS sind im Ordner ..\bass21\Delphi\SampleVis

:hi:
...ohne Worte...

padavan 20. Sep 2005 12:18

Re: equalizer mit der bass.dll
 
Liste der Anhänge anzeigen (Anzahl: 1)
WOW,
ich bin offiziell begeistert.
Muss mir jetzt erstmal reinziehen was du da gemacht hast, aber ich hab´s übernommen und es funzt genauso wie ich wollte. Vielen Vielen Dank!!!
:dancer:

dizzy 20. Sep 2005 14:57

Re: equalizer mit der bass.dll
 
Genau deswegen war mir wichtig welche der Bass.dll Wrapper du verwendest - und um den Anhang hatte ich gebeten turboPASCAL, das war schon okay :).
Weil so ist klar was falsch lief. In meiner Version habe ich ein Array von SmallInts, und somit auf jedem Index auch nur einen Wert liegen, wodurch es kommt dass linker und rechter Kanal auf geraden bzw. ungeraden Indezes liegen.
Bei der Variante von tP hast du jedoch ein Array von Integern oder Cardinals, die doppelt so breit sind wie SmallInts, und somit landen beide Kanäle auf ein und dem selben Index, nämlich einer im High- und der andere im Low-Word. Beide Varianten sind möglich, und letztlich Geschmackssache was man bevorzugt.
Das wäre bei sofortigem Posten der verwendeten Komponente übrigends sofort aufgefallen :zwinker:

Gruss,
Fabian

turboPASCAL 20. Sep 2005 15:06

Re: equalizer mit der bass.dll
 
Liste der Anhänge anzeigen (Anzahl: 2)
Hi, hab noch ein bissel rum gebastelt ;-)

Zitat:

Zitat von dizzy
Weil so ist klar was falsch lief. In meiner Version habe ich ein Array von SmallInts, ...
[...]
Bei der Variante von tP hast du jedoch ein Array von Integern oder Cardinals, die doppelt so breit sind wie SmallInts, und somit landen beide Kanäle auf ein und dem selben Index...

Jupp.

Zitat:

Beide Varianten sind möglich, und letztlich Geschmackssache was man bevorzugt. ...
Jupp.

:hi:

DP-Maintenance 20. Sep 2005 22:35

DP-Maintenance
 
Dieses Thema wurde von "alcaeus" von "Programmieren allgemein" nach "Multimedia" verschoben.
Spaet aber doch...ab nach Multimedia


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:48 Uhr.
Seite 2 von 4     12 34      

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