AGB  ·  Datenschutz  ·  Impressum  







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

equalizer mit der bass.dll

Ein Thema von Dr.No · begonnen am 20. Jul 2005 · letzter Beitrag vom 28. Sep 2005
Antwort Antwort
Seite 2 von 4     12 34      
Benutzerbild von dizzy
dizzy

Registriert seit: 26. Nov 2003
Ort: Lünen
1.932 Beiträge
 
Delphi 7 Enterprise
 
#11

Re: equalizer mit der bass.dll

  Alt 20. Sep 2005, 01:40
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

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
Fabian K.
INSERT INTO HandVonFreundin SELECT * FROM Himmel
  Mit Zitat antworten Zitat
padavan

Registriert seit: 12. Jan 2005
271 Beiträge
 
Delphi 7 Enterprise
 
#12

Re: equalizer mit der bass.dll

  Alt 20. Sep 2005, 07:30
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

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);
Angehängte Dateien
Dateityp: zip tbassdllplayer-source_497.zip (164,1 KB, 96x aufgerufen)
  Mit Zitat antworten Zitat
Benutzerbild von turboPASCAL
turboPASCAL

Registriert seit: 8. Mai 2005
Ort: Sondershausen
4.274 Beiträge
 
Delphi 6 Personal
 
#13

Re: equalizer mit der bass.dll

  Alt 20. Sep 2005, 09:13
Den "TBassDllPlayer" kann man hier im DP-Forum hrunterladen.

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)?
Matti
Meine Software-Projekte - Homepage - Grüße vom Rüsselmops -Mops Mopser
  Mit Zitat antworten Zitat
padavan

Registriert seit: 12. Jan 2005
271 Beiträge
 
Delphi 7 Enterprise
 
#14

Re: equalizer mit der bass.dll

  Alt 20. Sep 2005, 09:43
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.
  Mit Zitat antworten Zitat
padavan

Registriert seit: 12. Jan 2005
271 Beiträge
 
Delphi 7 Enterprise
 
#15

Re: equalizer mit der bass.dll

  Alt 20. Sep 2005, 10:27
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".
Miniaturansicht angehängter Grafiken
wave_100hz44k_16bit_151.jpg  
  Mit Zitat antworten Zitat
Benutzerbild von turboPASCAL
turboPASCAL

Registriert seit: 8. Mai 2005
Ort: Sondershausen
4.274 Beiträge
 
Delphi 6 Personal
 
#16

Re: equalizer mit der bass.dll

  Alt 20. Sep 2005, 12:00
Zitat von padavan:
Ich denke ich bin dem Problem jetzt ganz nah...



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

...ohne Worte...
Matti
Meine Software-Projekte - Homepage - Grüße vom Rüsselmops -Mops Mopser
  Mit Zitat antworten Zitat
padavan

Registriert seit: 12. Jan 2005
271 Beiträge
 
Delphi 7 Enterprise
 
#17

Re: equalizer mit der bass.dll

  Alt 20. Sep 2005, 12:18
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!!!
Miniaturansicht angehängter Grafiken
wave-geht_108.jpg  
  Mit Zitat antworten Zitat
Benutzerbild von dizzy
dizzy

Registriert seit: 26. Nov 2003
Ort: Lünen
1.932 Beiträge
 
Delphi 7 Enterprise
 
#18

Re: equalizer mit der bass.dll

  Alt 20. Sep 2005, 14:57
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

Gruss,
Fabian
Fabian K.
INSERT INTO HandVonFreundin SELECT * FROM Himmel
  Mit Zitat antworten Zitat
Benutzerbild von turboPASCAL
turboPASCAL

Registriert seit: 8. Mai 2005
Ort: Sondershausen
4.274 Beiträge
 
Delphi 6 Personal
 
#19

Re: equalizer mit der bass.dll

  Alt 20. Sep 2005, 15:06
Hi, hab noch ein bissel rum gebastelt

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.

Angehängte Dateien
Dateityp: zip simple__oszilloskop_vis_140.zip (2,4 KB, 162x aufgerufen)
Dateityp: zip soundtest_594.zip (255,0 KB, 115x aufgerufen)
Matti
Meine Software-Projekte - Homepage - Grüße vom Rüsselmops -Mops Mopser
  Mit Zitat antworten Zitat
20. Sep 2005, 22:35
Dieses Thema wurde von "alcaeus" von "Programmieren allgemein" nach "Multimedia" verschoben.
Spaet aber doch...ab nach Multimedia
Antwort Antwort
Seite 2 von 4     12 34      


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 14:40 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