AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi Frage zu Bass.dll und Spectrum
Thema durchsuchen
Ansicht
Themen-Optionen

Frage zu Bass.dll und Spectrum

Ein Thema von Blamaster · begonnen am 22. Mai 2010 · letzter Beitrag vom 13. Jun 2010
Antwort Antwort
Seite 1 von 2  1 2      
Blamaster

Registriert seit: 20. Jul 2007
230 Beiträge
 
#1

Frage zu Bass.dll und Spectrum

  Alt 22. Mai 2010, 20:32
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
  Mit Zitat antworten Zitat
omata

Registriert seit: 26. Aug 2004
Ort: Nebel auf Amrum
3.154 Beiträge
 
Delphi 7 Enterprise
 
#2

Re: Frage zu Bass.dll und Spectrum

  Alt 22. Mai 2010, 23:00
Vielleicht hilft dir das hier weiter.
  Mit Zitat antworten Zitat
Blamaster

Registriert seit: 20. Jul 2007
230 Beiträge
 
#3

Re: Frage zu Bass.dll und Spectrum

  Alt 22. Mai 2010, 23:19
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 ?
  Mit Zitat antworten Zitat
Blamaster

Registriert seit: 20. Jul 2007
230 Beiträge
 
#4

Re: Frage zu Bass.dll und Spectrum

  Alt 25. Mai 2010, 22:55
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
  Mit Zitat antworten Zitat
Blamaster

Registriert seit: 20. Jul 2007
230 Beiträge
 
#5

Re: Frage zu Bass.dll und Spectrum

  Alt 28. Mai 2010, 17:07
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
Angehängte Dateien
Dateityp: zip custloop_-_mod_429.zip (99,2 KB, 39x aufgerufen)
  Mit Zitat antworten Zitat
omata

Registriert seit: 26. Aug 2004
Ort: Nebel auf Amrum
3.154 Beiträge
 
Delphi 7 Enterprise
 
#6

Re: Frage zu Bass.dll und Spectrum

  Alt 29. Mai 2010, 01:56
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.
Angehängte Dateien
Dateityp: zip custloop_-_mod_655.zip (196,1 KB, 44x aufgerufen)
  Mit Zitat antworten Zitat
Blamaster

Registriert seit: 20. Jul 2007
230 Beiträge
 
#7

Re: Frage zu Bass.dll und Spectrum

  Alt 29. Mai 2010, 02:31
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
  Mit Zitat antworten Zitat
omata

Registriert seit: 26. Aug 2004
Ort: Nebel auf Amrum
3.154 Beiträge
 
Delphi 7 Enterprise
 
#8

Re: Frage zu Bass.dll und Spectrum

  Alt 29. Mai 2010, 02:43
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 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.
  Mit Zitat antworten Zitat
Blamaster

Registriert seit: 20. Jul 2007
230 Beiträge
 
#9

Re: Frage zu Bass.dll und Spectrum

  Alt 29. Mai 2010, 13:51
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
  Mit Zitat antworten Zitat
omata

Registriert seit: 26. Aug 2004
Ort: Nebel auf Amrum
3.154 Beiträge
 
Delphi 7 Enterprise
 
#10

Re: Frage zu Bass.dll und Spectrum

  Alt 29. Mai 2010, 23:04
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.
Angehängte Dateien
Dateityp: zip custloop_-_mod_207.zip (196,4 KB, 60x aufgerufen)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 17:51 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