Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Frage zu Bass.dll und Spectrum (https://www.delphipraxis.net/151554-frage-zu-bass-dll-und-spectrum.html)

Blamaster 22. Mai 2010 19:32


Frage zu Bass.dll und Spectrum
 
Hi,

ich möchte mir mit Hilfe der Bass.dll das Spectrum anzeigen lassen. Dazu gibt es bei der Bass.dll ja schon ein schönes Beispielprojekt (CustomLoop).

Allerdings wollte ich das ganze nun so abändern, dass sich das Spectrum zoomen lässt.

Das Spectrum soll dabe allerdings nicht das Fenster in der Breite verändert , sondern sich über den horizontalen Scrollbalken verschieben lassen.

Ich weiß nur nicht so wirklich wie ich an die Sache rangehen soll.

Meine Ansatze war bisher folgender:

- Zoomfunktion vergrößert breite der Paintbox um Faktor x, dann wird die Bitmap mit der standard Customloop funktion gefüllt. Da nun die Paintbox größer ist als das Fenster habe ich den horizontalen Scrollbalken und kann durch das Spectrum scrollen.
Probleme dabei bisher:
- Bei jedem Zoomschritt werden die benötigten Levelwerte neu errechnet und das braucht zeit.
- Weiß ich nicht ob die Lösung so sonderlich elegant ist.
- Ich möchte die Größe der Form ändern können, so das sich das Spectrum dabei automatisch mit anpasst. Momentan müsste ich dazu beim ändern der Form die Werte neu berechnen lassen und das macht im OnFormResize Event bei hunderten dadurch gestarteten Threads nicht wirklich viel spaß.

Hat jemand eine Idee wie sich das ganze umsetzen lassen könnte ?

Ggf. ist ja ein Ansatz die Maximale Breite des Spectrums einmal zu berechnen und in einem Array zu speichern und dann einfach später durch MaximaleBreite geteilt durch Gewünschte Breite einen Wert x zu erhalten und dann nur jeden x´ten wert aus dem Array auslesen und verwenden ?

Nur frage ich mich dabei, ob die Maximale Auflösung einer Soundatei immer gleich ist ? (Ich kenne mich mit dem Aufbau von Audiodaten jetzt nicht sonderlich gut aus).

Mfg Yannic

omata 22. Mai 2010 22:00

Re: Frage zu Bass.dll und Spectrum
 
Vielleicht hilft dir das hier weiter.

Blamaster 22. Mai 2010 22:19

Re: Frage zu Bass.dll und Spectrum
 
Hi,

das sieht wirklich schonmal sehr gut aus. Arbeitet nur leider noch nicht ganz so wie gewünscht. Bei diesem Beispiel ist es ja so, dass die Mittellinie Fixpunkt ist. Ich würde das schon gerne mit der wandernden Zeitlinie umsetzen so wie im Customloop beispiel.

Aber der Code ist dennoch recht hilfreich. Sehe ich das richtig, dass der Zoomwert mit 44100 der Hz Zahl also der Bandbreite entspricht ? Wenn ja ist die automatisch bei jedem Song gleich ?

Wenn ja müsste ich doch nur 44100 / 2 = 22050 ein Array 22050 großes Array einrichten und hätte dann die automatisch geringste Auflösung oder ? Sprich die größte Auflösung die möglich ist entspricht 22050px ?

Mfg Yannic

Edit.

Oder habe ich das ganze doch etwas falsch verstanden. So wie ich es jetzt sehe gehst du nicht den Weg über die Peaks, sondern über die fft Daten richtig ? Und die 44100 sind die Bandbreite eine sampels ?

Sprich die Maximale Auflösung in px beträgt BASS_ChannelGetLength ?

Blamaster 25. Mai 2010 21:55

Re: Frage zu Bass.dll und Spectrum
 
Hi,

ich habe dich geschichte mit dem Scrollen und Zoomen bis jetzt soweit selber hinbekommen.

Hinter eine Sache bin ich bis jetzt allerdings noch nicht gekommen und zwar wodurch sich die maximal mögliche Auflösung in Pixel ergibt.

In der beschreibung des Custloop Beispiels ist ja angegeben, dass die GetLevel function 20ms scannt. Darauf würde sich dann ja ergeben das eine Sekunde Lied auf maximal 50px gezeichnet werden kann, verstehe ich das richtig ?

Wenn ja, dann würde mich allerdings interessieren wie oder besser wodurch sich diese 20ms zum Scannen mit GetLevel ergeben.

In der ScanPeaks function ist das ganze ja in einer while Schleife. Kann man es sich so vorstellen, dass beim scannen der Peaks das Lied praktisch "abgespielt" wird und während dieser Zeit die GetLevel function permanent die Werte abholt und dieser Vorgang dann halt 20ms dauert. (Somit dann alle 20ms ein Scan erfolgt) ?

Wenn ja ist das ganze dann nicht recht ungenau, denn ich möchte bezweifeln, dass die GetLevel Funktion wirklich exakt 20ms braucht.

Mir ist beispielsweise aufgefallen, dass wenn ich die Breite des zu scannenden Bereich extrem hoch setze dieser Codeteil:

Delphi-Quellcode:
  bpp := BASS_ChannelGetLength(chan, BASS_POS_BYTE) div (Buffer.Width + zoom); // stream bytes per pixel
  if (bpp < BASS_ChannelSeconds2Bytes(chan, 0.02)) then // minimum 20ms per pixel (BASS_ChannelGetLevel scans 20ms)
    bpp := BASS_ChannelSeconds2Bytes(chan, 0.02);
zwar aufgeht, sprich bpp ist größer als BASS_ChannelSeconds2Bytes(chan, 0.02) trotzdem scheinbar nicht alle Peaks gescannt werden, sprich bis zum pixel X wird dann das komplette Spectrum korrekt gezeichnet, allerdings nicht über die komplette Breite (Buffer.Width + zoom), ab Pixel X enthält das Array mit den Peaktdaten dann keine Werte mehr.

Kann dabei jemand helfen ?

Mfg Yannic

Blamaster 28. Mai 2010 16:07

Re: Frage zu Bass.dll und Spectrum
 
Liste der Anhänge anzeigen (Anzahl: 1)
Kann wirklich keiner helfen ?

Ich habe mal mein modifiziertes Custloop Beispiel angehängt, dann lässt sich denke ich besser erkennen was ich meine.

Mfg Yannic

omata 29. Mai 2010 00:56

Re: Frage zu Bass.dll und Spectrum
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ich habe dein Beispiel mal überarbeitet und einige gravierende Fehler behoben.

Edit: Das was dein Programm anzeigt ist nicht das Spektrum eines Audiosignals, sondern das Zeitsignal.

Blamaster 29. Mai 2010 01:31

Re: Frage zu Bass.dll und Spectrum
 
Hi,

vielen Dank. Das schau sehr gut aus.

Kannst du evtl. noch kurz erklären wo die groben Fehler lagen ? (Letzlich war es ja nur das Originalbeispiel "leicht" abgeändert)

Und die Konstante MaxZoom = 12 lässt sich diese noch weiter nach oben setzen oder steht die 12 in speziellem Zusammenhang zu etwas ?

Danke nochmal :)

Mfg Yannic

omata 29. Mai 2010 01:43

Re: Frage zu Bass.dll und Spectrum
 
Zitat:

Zitat von Blamaster
Kannst du evtl. noch kurz erklären wo die groben Fehler lagen?

  • Status & Statusauswertung falsch
  • Bereichsfehler
  • Globale Variablen unnötig bzw. an falscher Stelle deklariert
Zitat:

Zitat von Blamaster
Und die Konstante MaxZoom = 12 lässt sich diese noch weiter nach oben setzen oder steht die 12 in speziellem Zusammenhang zu etwas ?

Natürlich kannst du die Konstante größer machen, dann wird allerdings der Fehler der Positionsberechnung größer.

Blamaster 29. Mai 2010 12:51

Re: Frage zu Bass.dll und Spectrum
 
Zitat:

Zitat von omata
Natürlich kannst du die Konstante größer machen, dann wird allerdings der Fehler der Positionsberechnung größer.

Wodurch ergeben sich dabei die Fehler in der Positionsberechnung ? Und wieso wurde beispielsweise gerade 12 als Wert gewählt ?

Kommen die Fehler in der Positionsberechnung dadurch zustande, dass ab einem gewissen Zoomgrad bpp unter die 20ms kommt ?

Mfg Yannic

omata 29. Mai 2010 22:04

Re: Frage zu Bass.dll und Spectrum
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von Blamaster
Wodurch ergeben sich dabei die Fehler in der Positionsberechnung ? Und wieso wurde beispielsweise gerade 12 als Wert gewählt ?

Bis 12 entstanden keine Probleme, deshalb habe ich 12 gewählt.
Ich habe das jetzt behoben, die Positionierung ist nun nicht mehr fehlerhaft. Aber trotzdem ist ein weiterzoomen nicht möglich (möglich schon, aber es passiert nichts mehr).

Ein anderes Konzept, dass auch wesentlich weiter reinzoomen kann habe ich ja unter #2 schon angegeben.


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:08 Uhr.
Seite 1 von 2  1 2      

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