Hallo Zusammen
ich arbeite im Moment an so einer Art visuellen Darstellung von Musik, wie man sie zum Beispiel von Windows Media Player kennt.
Dazu sollte ich vielleicht sagen, dass ich absoluter Bass.dll Neuling bin...
Also ich möchte die Lautstärke der einzelnen Frequenzen der ausgewählten Musik graphisch darstellen, genau das macht die Funktion _BASS_EXT_ChannelGetFFT.
Allerdings gibt die Funktion nicht die einzelnen Werte zur eigenen Verwendung mit GDI+ aus, sondern eine Struktur, die GDI+ per DllCall verwurstet, meine Frage ist also, wie bekomme ich die Werte aus der Struktur oder wie komme ich anders an sie heran?
Skript:
Spoiler anzeigen
#include <BASS.au3>
#include <BASSExt.au3>
#include <ProgressConstants.au3>
#include <GDIPlus.au3>
#include <Array.au3>
Local $MusicHandle
Local $playingState = -1
OnAutoItExitRegister("_EXIT")
[/autoit] [autoit][/autoit] [autoit]_BASS_Startup()
_BASS_EXT_Startup()
_BASS_Init(0)
$aFFT = _BASS_EXT_CreateFFT(30,10,10,300,360,1,True)
$hWnd = GUICreate("Sound dies das",340,460)
$bPlayPause = GUICtrlCreateButton("Play/Pause",10,10,155,20)
$bStop = GUICtrlCreateButton("Stop",175,10,155,20)
$bPath = GUICtrlCreateButton("Pfad wählen",10,40,100,20)
$lPfadAnzeige = GUICtrlCreateLabel("Nichts ausgewählt",120,40,210,20)
$bSpecial = GUICtrlCreateButton("",165,10,10,20)
GUICtrlSetBkColor($bSpecial, "#FFFFFF")
_GDIPlus_Startup()
$brushSchwarz = _GDIPlus_BrushCreateSolid(0xFF000000)
$brushBlau = _GDIPlus_BrushCreateSolid(0xFF6077FF)
$graphic = _GDIPlus_GraphicsCreateFromHWND($hWnd)
$bitmap = _GDIPlus_BitmapCreateFromGraphics(320, 380, $graphic)
$buffer = _GDIPlus_ImageGetGraphicsContext($bitmap)
GUISetState(@SW_SHOW)
[/autoit] [autoit][/autoit] [autoit]Do
_GDIPlus_GraphicsFillRect($buffer, 0, 0, 320, 380, $brushSchwarz)
_BASS_EXT_ChannelGetFFT($MusicHandle, $aFFT)
DllCall($ghGDIPDll, "int", "GdipFillPolygon", "handle", $buffer, "handle", $brushBlau, "ptr", $aFFT[0], "int", $aFFT[1], "int", "FillModeAlternate")
_GDIPlus_GraphicsDrawImageRect($graphic, $bitmap, 10, 70, 320, 380)
[/autoit] [autoit][/autoit] [autoit]$msg = GUIGetMsg()
Switch $msg
Case $bPlayPause
Switch $playingState
Case -1 ;vorher gestoppt
_BASS_ChannelPlay($MusicHandle,True)
$playingState = 1
Case 0 ;pause
_BASS_ChannelPlay($MusicHandle,False)
$playingState = 1
Case 1
_BASS_ChannelPause($MusicHandle)
$playingState = 0
EndSwitch
Case $bStop
_BASS_ChannelStop($MusicHandle)
$playingState = -1
Case $bPath
_BASS_ChannelStop($MusicHandle)
$file = FileOpenDialog("Open File","","Musik (*.MP3;*.MP2;*.MP1;*.OGG;*.WAV;*.AIFF;*.AIF)")
$MusicHandle = _BASS_StreamCreateFile(False,$file,0,0,0)
GUICtrlSetData($lPfadAnzeige,$file)
$aFFT = _BASS_EXT_CreateFFT(30,10,10,300,360,1,True)
Case $bSpecial
_ArrayDisplay($aFFT)
EndSwitch
Until $msg = -3
_BASS_Free()
Func _EXIT()
_GDIPlus_BrushDispose($brushBlau)
_GDIPlus_BrushDispose($brushSchwarz)
_GDIPlus_GraphicsDispose($buffer)
_GDIPlus_GraphicsDispose($graphic)
_GDIPlus_Shutdown()
_BASS_Free()
EndFunc
Wenn ihr irgendwann während des Lieds auf den schwarzen Knopf oben zwischen den anderen beiden Knöpfen klickt, seht ihr den Array, der zurückgegeben wird.
Danke
DFPWare