Die Werte liegen zwischen 0 und 1
Das menschliche Gehör arbeitet logarithmisch.
Deshalb sollte man erstens die Werte noch via _BASS_EXT_Level2dB umwandeln.
Und zweitens die Frequenzbänder "anpassen"
Ich hab mal versucht das hier zu erklären: FFT Bass.dll kleiner Lehrgang
Spoiler anzeigen
#AutoIt3Wrapper_UseX64=n
#include "Bass.au3"
#include "BassExt.au3"
Opt("GUIOnEventMode", 1)
[/autoit] [autoit][/autoit] [autoit]Global $sFile = FileOpenDialog("Open...", "", "playable formats (*.MP3;*.MP2;*.MP1;*.OGG;*.WAV;*.AIFF;*.AIF)")
[/autoit] [autoit][/autoit] [autoit]Global $hGui = GUICreate("FFT", 1034, 220)
GUISetOnEvent(-3, "_EXIT")
Global $cDummy_1 = GUICtrlCreateDummy()
For $i = 1 To 128
GUICtrlCreateProgress(($i - 1) * 8 + 5, 10, 7, 100, 5)
Next
Global $cDummy_2 = GUICtrlCreateDummy()
For $i = 1 To 128
GUICtrlCreateProgress(($i - 1) * 8 + 5, 115, 7, 100, 5)
Next
GUISetState()
_BASS_Startup()
_BASS_Init(0, -1, 44100, 0, "")
Global $hStream = _BASS_StreamCreateFile(False, $sFile, 0, 0, $BASS_SAMPLE_FLOAT)
[/autoit] [autoit][/autoit] [autoit]Global $tFFT = DllStructCreate("float[128];")
Global $pFFT = DllStructGetPtr($tFFT)
Global $fdB, $adB_1[129], $adB_2[129], $iIdx
_BASS_ChannelPlay($hStream, True)
[/autoit] [autoit][/autoit] [autoit]Global $iTimer = TimerInit()
While _BASS_ChannelIsActive($hStream)
If TimerDiff($iTimer) > 25 Then
$iTimer = TimerInit()
_BASS_ChannelGetData($hStream, $pFFT, $BASS_DATA_FFT256)
For $i = 1 To 128
$fdB = _BASS_EXT_Level2dB(DllStructGetData($tFFT, 1, $i)) * 100
If $fdB > $adB_1[$i] Then $adB_1[$i] = $fdB
GUICtrlSetData($cDummy_1 + $i, $adB_1[$i])
$adB_1[$i] -= 4
$iIdx = Round(10 ^ ($i * (Log(128) / Log(10)) / 128))
$fdB = _BASS_EXT_Level2dB(DllStructGetData($tFFT, 1, $iIdx)) * 100
If $fdB > $adB_2[$i] Then $adB_2[$i] = $fdB
GUICtrlSetData($cDummy_2 + $i, $adB_2[$i])
$adB_2[$i] -= 4
Next
EndIf
WEnd
_Exit()
[/autoit] [autoit][/autoit] [autoit]Func _Exit()
_BASS_StreamFree($hStream)
_BASS_Free()
Exit
EndFunc ;==>_Exit
E