Delphi-PRAXiS

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)

Dr.No 20. Jul 2005 13:56


equalizer mit der bass.dll
 
Hallo, ich mach gerade nen mediaplayer mit der bass.dll.
hab das teil jetzt auch zum laufen bekommen, und wollte nen equalizer einbauen. Ich weiß, gleich will mir wieder einer nen link andrehen, aber ich hab auch schon selbs gesucht, und nicht wiklich eine gute beschreibung gefunden. und ich kenn mir auch noch nicht gut mit der bass dll aus, deshalb brauch ich da was ausführlicheres. Also? kann mir jamand helfen?

turboPASCAL 20. Jul 2005 14:07

Re: equalizer mit der bass.dll
 
Hast Du schon einmal bei Demo Samples der Bass.dll reingeschaut ?

...bass21\Delphi\fxtest\FXTest.dpr <- Ein einfaches Beispiel für einen EQ

Dr.No 20. Jul 2005 16:11

Re: equalizer mit der bass.dll
 
ja, gerade eben, es tut zwar, aber richtig verstanden hab ichs net

warum braucht man das?

Delphi-Quellcode:
    fx[1] := BASS_ChannelSetFX(chan, BASS_FX_PARAMEQ, 1);
    fx[2] := BASS_ChannelSetFX(chan, BASS_FX_PARAMEQ, 1);
    fx[3] := BASS_ChannelSetFX(chan, BASS_FX_PARAMEQ, 1);
und für was ist
fBandwidth := 18;
da?

[edit=alcaeus]delphi-Tags Mfg, alcaeus[/edit]

turboPASCAL 20. Jul 2005 17:01

Re: equalizer mit der bass.dll
 
Delphi-Quellcode:
... := BASS_ChannelSetFX(chan, BASS_FX_PARAMEQ, 1);
Damit wird der Effekt auf/zum dem aktuellem Stream ( Channel ) gesetzt, mit der Priorität 1.
Also den aktuellen Stream den EQ- Effekt zuweisen.
Mann kann somit auch einzelnen Kanälen verschiedene Effekte zuweisen.

z.B.:
- MP3-Kanal bekommt einen Halleffect,
- Musick–Kanal einen Chorus,
…usw.

fBandwidth - da wird irgend eine Bandbreite gesetzt (in Semitones) 1 bis 36.

Semitones: kann ich jetzt nicht genau sagen (¿ Durchschnittliche Töne ?)

Dr.No 20. Jul 2005 20:00

Re: equalizer mit der bass.dll
 
ok, danke.

Kann mir jezt noch jemand sagen, wie ich mit
BASS_ChannelGetData
ne visualisierung machen kann.
es soll nur was einfaches sein!
und gibts vieleicht ein gutes tutorial auf deutsch zu der bass.dll?

Dr.No 20. Jul 2005 20:37

Re: equalizer mit der bass.dll
 
Delphi-Quellcode:
image1.Picture.LoadFromFile('J:\mediaplayer\bass\a.bmp');
  Bass_ChannelGetData(stream, @data, BASS_DATA_FFT512);
  for i := 1 to 256 do
  begin
 image1.Canvas.LineTo(i, strtoint(formatfloat('0',450-data[i]*2000)) );

  end;
  end;
isch das schon eine?
also ausshen tuts schon wie eine!

[edit=alcaeus]Delphi-Tags Mfg, alcaeus[/edit]

turboPASCAL 20. Jul 2005 22:31

Re: equalizer mit der bass.dll
 
Ich würde es eher so machen (Spectrumanalyzer) :

Delphi-Quellcode:

var
  data : array[1..255] of Single;
  i : byte;
begin
  Bass_ChannelGetData(stream, @data, BASS_DATA_FFT512);

  Paintbox1.Canvas.FillRect(Paintbox1.ClientRect);
  Paintbox1.canvas.Lineto(0, Paintbox1.height);
   for i := 0 to 255 do
   begin
     Paintbox1.Canvas.Lineto(i, Paintbox1.Height - round( Data[i] * 200 ) );
//     strtoint(formatfloat('0',450-data[i]*2000)) ); ???
   end;
...

padavan 19. Sep 2005 14:37

Re: equalizer mit der bass.dll
 
Liste der Anhänge anzeigen (Anzahl: 1)
Wenn ich das so mach, wie von Dr. No vorgeschlagen, kommt etwa sowas bei raus: (siehe Anhang)
Der Abstand zwischen den Balken gibt zwar schon die Frequen an, aber so richtig schön (Oszillokop wie bei Winamp) ist es nicht grad....
Wie geht´s ???

(habe die Schleife aber bis 2048 laufen lassen, weil ich der Meinung bin, dass ich das irgendwo in der Bass.dll gelesen hätte)

dizzy 19. Sep 2005 15:29

Re: equalizer mit der bass.dll
 
Ich fasse mal eine Antwort aus deinen beiden Fragen (hier und da) zusammen (besser wäre nen eigener Thread gewesen :roll:).

padavan hat im anderen Thread geschrieben:
Hab immer die maximale Amplitude und die Frequenz stellt sich im Abstand der Balken dar.

Kleine Begriffsklärung: Die X-Achse stellt die Zeit da. Somit ist der Begriff "Frequenz" an dieser Stelle missverständlich - ich musste 3 Mal drüberlesen ;)

Wie greifst du auf die Bass.dll zu? GetWaveData z.B. ist kein nativer Aufruf an die DLL. Dort hieße es ChannelGetData, und dort wird erst via Parameter angegeben ob man FFT oder Wave haben möchte. Von daher wäre es schonmal gut wenn du die entsprechenden Funktionen dazuschreiben könntest.

Dazu wäre auch der QT deiner Zeichenmethode sehr interessant - die aktuellen Infos sind zu knapp. Zudem sind die Wertebereiche von Wave- und FFT-Daten wenn ich mich nicht irre unterschiedlich.
Die Schleife bis 2048 laufen zu lassen ist auch nicht per se richtig. Die gewünschte Länge kann der Bass.dll angegeben werden.


Gruss,
Fabian

padavan 19. Sep 2005 22:32

Re: equalizer mit der bass.dll
 
Sorry,
du hast natürlich recht, der Quelltext ist recht knapp,
hab aber nichts richtiges Vorzuweisen, da ich hin und her probiere.
Ich benutze eine Komponente die ich hier gefunden habe, in der die Bass.Dll zur Verfügung gestellt wird. Dort ist der Aufruf BassDllplayer1.Getwavedata wohl das was dir mit ChannelGetData bekannt ist.

Das ist mein letzter Versuch

Delphi-Quellcode:
procedure TForm1.Timer1Timer(Sender: TObject);  // Draw Vis.
var
  data: TFFTData;
  data1: TwaveData;
  i: integer;
  tmpBitmap: TBitmap;
begin
data1 := BassdllPlayer1.GetwaveData;

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 - Data1[i] div Trackbar1.position);
                                                                 // als Offset quasi...

end;
(danke für´s drüber nachdenken)

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

padavan 21. Sep 2005 06:44

Re: equalizer mit der bass.dll
 
Zitat:

Das wäre bei sofortigem Posten der verwendeten Komponente übrigends sofort aufgefallen
Schuldig!
Ich hatte es nicht gleich begriffen
:roteyes:

Sehr schöne kleine Demo übrigens, gefällt mir.
Danke für eure Hilfe nochmal

Hoffe dem ursprünglichen Poster hat´s auch noch was gebracht!!!

turboPASCAL 21. Sep 2005 06:50

Re: equalizer mit der bass.dll
 
Hab noch oben schnell 'ne Test-MP3 hinzugefügt, für den Soundcheck. ;)

padavan 21. Sep 2005 07:00

Re: equalizer mit der bass.dll
 
Liste der Anhänge anzeigen (Anzahl: 1)
und ich noch schnell ne Spielerei reingebastelt....

turboPASCAL 21. Sep 2005 07:09

Re: equalizer mit der bass.dll
 
nice. ;)

Nils_13 25. Sep 2005 17:56

Re: equalizer mit der bass.dll
 
Bei mir laufen die Beispiele nicht, liegt das an den verschiedenen Delphi Versionen ?

PierreB 25. Sep 2005 18:04

Re: equalizer mit der bass.dll
 
Zitat:

Zitat von Nils_13
Bei mir laufen die Beispiele nicht, liegt das an den verschiedenen Delphi Versionen ?

Grml, gewöhn dir doch mal an das du sagst was "da nicht läuft". Es kommt sicherlich irgendeine Fehlermeldung oder so, wenn du uns die sagen würdest könnte dir vielleicht auch einer helfen. Ferndiagnosen liegen nicht in der Natur des DP'ler. ;)

Nils_13 25. Sep 2005 18:05

Re: equalizer mit der bass.dll
 
Bei mir stimmt die größe der Analyse nicht (sie ist also zu klein :wink:).

Ich Idiot. Hab vergessen PaintBox mit PaintBox2 zu verwechseln :wall:

padavan 26. Sep 2005 06:48

Re: equalizer mit der bass.dll
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ich schon wieder,
eigentlich wieder ein wenig am Thema des Titels vorbei, aber es hat sich grad so schön warmgelabert
:cheers:

Hat jemand ne Idee, wie man eine "nachleuchtende" Visualisierung erstellen könnte?
Bisher hab ich keinen besseren Ansatz als das was im Anhang zu finden ist.
Kommt auf dem Bild nicht so rüber, sieht aber in Aktion gar nicht so schlecht aus.
Das Problem ist aber, dass es nicht wirklich nachleuchtend ist, sondern eher gemogelt, setze nämlich via Zufall zwischen jeder 10ten Aufzeichnung einfach eine recht üppige Anzahl von Punkten in Hintergrundfarbe, was sich natürlich "ein wenig" negativ auf die Performance auswirkt, hehe.

Sowas in der Art was ich suche, habe ich schon mal hier im Forum gesehen, beim "FKBassplayer", Hut ab vor diesem Teil, da ist sowas auch realisiert. (ich bekomm aber die Komponenten nicht installiert um das nachzuvollziehen).

turboPASCAL 26. Sep 2005 09:53

Re: equalizer mit der bass.dll
 
Hi.

@padavan, mach doch bitte einen neuen Thread auf für deine Frage und verlinke dann von hier.

padavan 26. Sep 2005 14:38

Re: equalizer mit der bass.dll
 
Yo, hast ja recht!
:roll:

turboPASCAL 27. Sep 2005 10:08

Re: equalizer mit der bass.dll
 
Liste der Anhänge anzeigen (Anzahl: 3)
Zitat:

eigentlich wieder ein wenig am Thema des Titels vorbei, aber es hat sich grad so schön warmgelabert
:warn: Desawegen soltest du ein neues Thema aufmachen


Zitat:

Hat jemand 'ne Idee, wie man eine "nachleuchtende" Visualisierung erstellen könnte?
Ja.


Intern mit einem Bitmap ungefähr so vorgehen:
- Bitmap abdunkeln
- neu auf das Bitmap zeichnen
- das ganze wieder von vorn ...

padavan 28. Sep 2005 12:04

Re: equalizer mit der bass.dll
 
He, erst maßregelst du mich :warn: und dann bringst du mir doch die coole :???: Lösung meines Problems...
Danke dir :hi:


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