Seite 2 von 3

Verfasst: 19.06.2008 10:44
von Ghosty1967
Hab mir jetzt die dll und Dein Beispiel runtergeladen.

Wenn ich das Beispiel mit dem Debugger starte, dann kommt zwar keine
Fehlermeldung, aber auch kein Sound und im Debugger steht immer

--------------------
isPlaying: 0
position: 0
spectrum: 0.0000 0.0000 0.0000 0.0000 ...

...gibt es da irgendwelche Versionsprobleme oder hab ich was falsch gemacht?

Verfasst: 19.06.2008 12:47
von Kai
Ghosty1967 hat geschrieben:Hab mir jetzt die dll und Dein Beispiel runtergeladen.

Wenn ich das Beispiel mit dem Debugger starte, dann kommt zwar keine
Fehlermeldung, aber auch kein Sound und im Debugger steht immer

--------------------
isPlaying: 0
position: 0
spectrum: 0.0000 0.0000 0.0000 0.0000 ...

...gibt es da irgendwelche Versionsprobleme oder hab ich was falsch gemacht?
Passt ja, probier mal ob das hier bei dir läuft, is aktuell für pb4.20 mit neuster dll ect. musst nur die eine Zeile auskommentieren.

http://uploaded.to/?id=p3dr0q

Verfasst: 19.06.2008 12:56
von Deluxe0321
Lösung mit der Bass.dll:
Hier

Mir ist klar das ich die Bass.dll aufzwinge :mrgreen:

Verfasst: 20.06.2008 12:50
von Ghosty1967
Hey das sieht beides sehr vielversprechend aus... :mrgreen:

Ich denke, ich werde die Lösung mit der bass.dll nehmen, da ich den Eindruck
habe, das ich besser mit dem Beispiel zurechtkomme. Sorry Kai :allright:

@Deluxe321... In dem Beispiel speicherst Du ja in das Array fft(0) die Frequenzdaten des Ausgangssignals. Wie bekomme ich denn die Daten für
ein VU-Meter aus diesen Daten - oder muß ich da einen anderen Aufruf an
die bass.dll machen?
Könntest Du mir auch hierfür ein Beispiel geben?

Verfasst: 20.06.2008 12:59
von Ghosty1967
...habs schon gefunden, man benutze einfach BASS_ChannelGetLevel()
stimmts :lol:

Verfasst: 20.06.2008 14:27
von Kai
Ghosty1967 hat geschrieben:Sorry Kai :allright:
Gibt es nix zu entschuldigen, mehrere Wege führen zum Ziel. :D

Verfasst: 20.06.2008 17:20
von Ghosty1967
Also, ich komme ja weiter... aber ich habe doch noch eine Frage

Ich lese die Daten per BASS_ChannelGetData(chan,@fft.f(),#BASS_DATA_FFT256) aus.
Also habe ich in einem Array danach 128 Werte, welche dem Spectrum der
Frequenzen entsprechen.
Jetzt möchte ich dieses Spectrum auf 8 Schaltkanäle aufteilen, sodaß ich
bei einem bestimmten Wert den entsprechenden Kanal schalten kann.
Also z.B

Kanal 1 für 16KHz
Kanal 2 für 8KHz
Kanal 3 für 4KHz
Kanal 4 für 2KHz
Kanal 5 für 1KHz
Kanal 6 für 500Hz
Kanal 7 für 250Hz
Kanal 8 für 125Hz

eben wie bei einer "einfachen" Lichtorgel... aber ich komme da nicht wirklich
weiter. Wie muß ich die Daten in fft() weiter verarbeiten um zu meinem
gewünschten Ergebnis zu kommen? :cry:

Verfasst: 20.06.2008 18:30
von Froggerprogger
Die Daten sollten so zu verstehen sein:

fft(k) hält die Amplitude (als Wert zwischen 0.0 und 1.0) für die Frequenz (k+1)*Step Hz

wobei Step = Samplingrate/FFT-Size, also bspw. bei 44100 Hz Samplingrate und 1024-Punkt-FFT ist Step etwa 43,066 Hz.

In dem Bsp ist dann:
fft(0) hält Amplitude für 43,066 Hz,
fft(100) hält Amplitude für 4306,6 Hz,
fft(511) hält Amplitude für 22050 Hz,

(Es könnte aber auch bei 0 Hz (Gleichstromanteil) beginnen, bei fmod wird dieser aber verworfen)

Ggf. musst Du die Amplituden nachher noch exponentiell verzerren, um besser damit arbeiten zu können, also bspw per:

Code: Alles auswählen

a.f = fft(k)
a.f = (Pow(1000.0, a) - 1) / 999.0

Verfasst: 20.06.2008 22:13
von Ghosty1967
und wie finde ich die Samplingrate raus?

Verfasst: 21.06.2008 11:00
von Froggerprogger
Das ist die Wiedergabesamplingrate, die man beim Initialisieren einstellt (defaultmäßig sollte das 44100 Hz sein, ist es zumindest bei fmod)