1. Dashboard
  2. Mitglieder
    1. Letzte Aktivitäten
    2. Benutzer online
    3. Team
    4. Mitgliedersuche
  3. Forenregeln
  4. Forum
    1. Unerledigte Themen
  • Anmelden
  • Registrieren
  • Suche
Alles
  • Alles
  • Artikel
  • Seiten
  • Forum
  • Erweiterte Suche
  1. AutoIt.de - Das deutschsprachige Forum.
  2. Mitglieder
  3. eukalyptus

Beiträge von eukalyptus

  • ASM-Tricks

    • eukalyptus
    • 15. November 2015 um 19:26

    Hier die FFT-Analyse der 3 Wav-Dateien: FFT_1.png FFT_2.png FFT_3.png


    Wie funktioniert eigentlich die Parabel-Version?
    Ich hab die FUnktion in AutoIt nachgebaut:

    AutoIt
    Func _Sin($fX)
    	Local $tUInt64 = DllStructCreate("uint64")
    	Local $tUInt = DllStructCreate("uint;uint", DllStructGetPtr($tUInt64))
    	Local $tInt = DllStructCreate("int;int", DllStructGetPtr($tUInt64))
    
    
    	DllStructSetData($tUInt, 1, $fX * 2 ^ 31 / $cPI)
    	Local $ebx = DllStructGetData($tInt, 1) 			;-> Sin_1.png
    
    
    	DllStructSetData($tUInt, 1, 0x80000000 + $ebx * 2)
    	Local $eax = DllStructGetData($tInt, 1) 			;-> Sin_2.png
    
    
    	$ebx = BitShift($ebx, 31)
    
    
    	DllStructSetData($tUInt64, 1, $eax * $eax)
    	Local $edx = DllStructGetData($tUInt, 2) 			;-> Sin_3.png
    
    
    	DllStructSetData($tUInt, 1, 0x80000000 + $edx * 2)
    	$eax = DllStructGetData($tInt, 1) 					;-> Sin_4.png
    
    
    	$eax = BitXOR($eax, $ebx) 							;-> Sin_5.png
    
    
    	Return $eax / -2 ^ 31
    EndFunc
    Alles anzeigen


    Bei den einzelnen Schritten kommt man nun zu diesen Outputs:
    Sin_1.png Sin_2.png Sin_3.png Sin_4.png Sin_5.png

    Erklärung kommt evtl später ;)

  • ASM-Tricks

    • eukalyptus
    • 15. November 2015 um 19:26

    Teil 1: extrem schnelle Sinus Funktion
    Original: http://music.columbia.edu/pipermail/musi…ber/046673.html

    Die Funktion f=X^2 ergibt eine Parabel; das kann man nützen, um näherungsweise eine Sinuskurve zu berechnen.
    Der ASM-Code dazu ist sehr kurz und sieht so aus:


    Aufgerufen wird der Code mit folgender Funktion:

    AutoIt
    Func _Sin($fX)
    	Local $aResult = DllCallAddress("int", $pASM_Sin, "uint", $fX * 2 ^ 31 / $cPI)
    	Return $aResult[0] / -2 ^ 31
    EndFunc   ;==>_Sin


    Das TestScript dazu ergibt dieses Bild:
    SinCos_1.au3
    SinCos_1.png


    Sieht schon ganz OK aus! Allerdings nicht ganz...
    Wenn man damit einen Kreis zeichnen möchte sieht man besser, dass eine Parabel doch keine Sinuskurve ist:
    SinCos_4.au3
    SinCos_4.png


    Es geht natürlich noch besser, um nicht zu sagen: Fast perfekt!
    SinCos_2.au3
    SinCos_2.png


    Nun wollen wir testen, wie schnell die Funktionen im Vergleich zu der Sinusberechnung der FPU ist.
    Dieses Script erzeugt eine Wav-Datei von mehreren Sekunden in den 3 Varianten FPU, Parabel, und "Fast Perfekt":
    SinCos_3.au3


    Wir sehen, dass die ASM-Versionen 10x schneller sind, als die Berechnung der FPU!
    Weiters kann man hören, dass die Parabel-Version harmonische Obertöne erzeugt, siehe FFT-Analyse im nächsten Post!


    Fazit: Die ParabelVersion ist am schnellsten, jedoch sehr ungenau. Das reicht etwa für Animationen, aber nicht für Sound. (Außer man kann mit den harmonischen Obertönen leben)
    Die Version "Fast Perfekt" ist wirklich nahezu perfekt! Nur ein einziger Oberton mit -70dB, das ist zu vernachlässigen. Der Geschwindigkeitsvorteil ist wirklich enorm!
    Nachteil bei beiden Versionen ist, dass man etwas tricksen muss, um am Ende das gewünschte Ergebnis zu erhalten. Das kann aber auch ein Vorteil sein: Siehe SinCos_3.au3: Bei der Variable $fPhaseInc kann man PI komplett wegkürzen.


  • Button Hintergrund ändern UND Icon einfügen?

    • eukalyptus
    • 14. November 2015 um 20:54

    SO?

    AutoIt
    #include <GUIButton.au3>
    #include <ButtonConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #include <WinAPIShellEx.au3>
    #include <WinAPIGdi.au3>
    
    
    
    
    $GUI = GUICreate("", 100, 100)
    GUISetBkColor(0x0)
    
    
    Global $hIcon = _WinAPI_ShellExtractIcon(@ScriptDir & "\ICO.ico", 0, 48, 48)
    $Button_Refresh = GUICtrlCreateButton("", 30, 30, 30, 30)
    GUICtrlSetStyle($Button_Refresh, BitOR($WS_TABSTOP, $BS_NOTIFY, $BS_OWNERDRAW))
    
    
    GUIRegisterMsg($WM_DRAWITEM, "WM_DRAWITEM")
    GUISetState(@SW_SHOW, $GUI)
    
    
    While 1
    
    
    	$nMsg = GUIGetMsg()
    
    
    	Switch $nMsg
    		Case $GUI_EVENT_CLOSE
    			_WinAPI_DestroyIcon($hIcon)
    			Exit
    	EndSwitch
    
    
    WEnd
    
    
    
    
    Func WM_DRAWITEM($hWnd, $iMsg, $wParam, $lParam)
    	#forceref $iMsg, $wParam, $lParam
    	Local $tDrawItem = DllStructCreate("uint CtlType; uint CtlID; uint ItemID; uint ItemAction; uint ItemState; hwnd hWndItem; hwnd hDC; int Left; int Top; int Right; int Bottom; ptr ItemData;", $lParam)
    	Local Const $ODT_BUTTON = 4
    
    
    	Switch $tDrawItem.CtlType
    		Case 4 ;ODT_BUTTON
    			Switch $tDrawItem.CtlID
    				Case $Button_Refresh
    					_WinAPI_ExtFloodFill($tDrawItem.hDC, 0, 0, 0)
    					_WinAPI_DrawIconEx($tDrawItem.hDC, $tDrawItem.Left, $tDrawItem.Top, $hIcon, $tDrawItem.Right - $tDrawItem.Left, $tDrawItem.Bottom - $tDrawItem.Top)
    					Return 1
    
    
    			EndSwitch
    	EndSwitch
    
    
    	$tDrawItem = 0
    	Return $GUI_RUNDEFMSG
    EndFunc   ;==>WM_DRAWITEM
    Alles anzeigen
  • Echtzeit Beat-Detection mit Bass.au3

    • eukalyptus
    • 14. November 2015 um 15:40

    ASM hab ich wieder aufgegeben - hat nicht so funktioniert, wie ich dachte...

    Stattdessen hab ich folgendes probiert:

    Du musst etwas mit den Parametern $iFreq, $iGain und evtl Bandwith (Wert "0.4" in FXSetParameters) spielen
    und die Zeilen "$fLVL -= 0.05" und "If $fLevel > 0.3 Then $iBeat = 8" anpassen.

    AutoIt
    #AutoIt3Wrapper_UseX64=n
    #include <GDIPlus.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #include "Bass.au3"
    #include "BassFX.au3"
    
    
    
    
    
    
    Opt("MustDeclareVars", 1)
    Opt("GUIOnEventMode", 1)
    
    
    Global $iWidth = 320
    Global $iHeight = 180
    
    
    _GDIPlus_Startup()
    Global $hGui = GUICreate("ASM", $iWidth, $iHeight)
    GUISetOnEvent($GUI_EVENT_CLOSE, "_Exit")
    Global $hGraphics = _GDIPlus_GraphicsCreateFromHWND($hGui)
    Global $hBmp_Buffer = _GDIPlus_BitmapCreateFromGraphics($iWidth, $iHeight, $hGraphics)
    Global $hGfx_Buffer = _GDIPlus_ImageGetGraphicsContext($hBmp_Buffer)
    _GDIPlus_GraphicsSetSmoothingMode($hGfx_Buffer, 2)
    _GDIPlus_GraphicsClear($hGfx_Buffer, 0xFF000000)
    GUIRegisterMsg($WM_PAINT, "WM_PAINT")
    GUISetState()
    
    
    
    
    
    
    
    
    _BASS_Startup()
    _BASS_FX_Startup()
    
    
    _BASS_Init(0)
    
    
    Global $iFreq = 120
    Global $iGain = 12
    
    
    Global $hStreamEQ = _BASS_StreamCreate(44100, 2, BitOR($BASS_STREAM_DECODE, $BASS_SAMPLE_FLOAT), $STREAMPROC_DUMMY)
    Global $hFX_GAIN = _BASS_ChannelSetFX($hStreamEQ, $BASS_FX_BFX_VOLUME, 4)
    _BASS_FXSetParameters($hFX_GAIN, "0|" & $iGain)
    Global $hFX_EQ = _BASS_ChannelSetFX($hStreamEQ, $BASS_FX_BFX_BQF, 5)
    _BASS_FXSetParameters($hFX_EQ, $BASS_BFX_BQF_BANDPASS & "|" & $iFreq & "|0|0.4|0|0|" & $BASS_BFX_CHANALL)
    
    
    Global $hStreamLV = _BASS_StreamCreate(44100, 2, BitOR($BASS_STREAM_DECODE, $BASS_SAMPLE_FLOAT), $STREAMPROC_PUSH)
    
    
    _BASS_RecordInit(1)
    Global $hRecord = _BASS_RecordStart(44100, 2, $BASS_SAMPLE_FLOAT)
    
    
    Global $fLevel, $iBytes, $tData
    While 1
    	$iBytes = _BASS_ChannelGetData($hRecord, 0, 0)
    	If $iBytes Then
    		$tData = DllStructCreate("byte[" & $iBytes & "]")
    		_BASS_ChannelGetData($hRecord, DllStructGetPtr($tData), $iBytes)
    		_BASS_ChannelGetData($hStreamEQ, DllStructGetPtr($tData), $iBytes)
    
    
    		_BASS_StreamPutData($hStreamLV, DllStructGetPtr($tData), $iBytes)
    		$fLevel = _BASS_LoWord(_BASS_ChannelGetLevel($hStreamLV)) / 32768
    		_BASS_ChannelGetData($hStreamLV, DllStructGetPtr($tData), $iBytes)
    	EndIf
    	_Draw()
    	Sleep(10)
    WEnd
    
    
    
    
    
    
    
    
    Func _Draw()
    	Local Static $fLVL = 0, $iBeat
    	$fLVL -= 0.05
    
    
    	If $fLevel > $fLVL Then
    		$fLVL = $fLevel
    		If $fLevel > 0.3 Then $iBeat = 8
    	EndIf
    
    
    
    
    	Local $hBrush = _GDIPlus_BrushCreateSolid(0xFF00FF00)
    
    
    	If $iBeat > 0 Then
    		_GDIPlus_GraphicsClear($hGfx_Buffer, BitOR(0xFF000000, 0xFF * $iBeat / 8))
    		$iBeat -= 1
    	Else
    		_GDIPlus_GraphicsClear($hGfx_Buffer, 0xFF000000)
    	EndIf
    
    
    	_GDIPlus_GraphicsFillRect($hGfx_Buffer, 10, 10, ($iWidth - 20) * $fLVL, 10, $hBrush)
    
    
    	_GDIPlus_GraphicsDrawImage($hGraphics, $hBmp_Buffer, 0, 0)
    	_GDIPlus_BrushDispose($hBrush)
    EndFunc   ;==>_Draw
    
    
    
    
    
    
    Func WM_PAINT($hWnd, $iMsg, $wParam, $lParam)
    	_GDIPlus_GraphicsDrawImage($hGraphics, $hBmp_Buffer, 0, 0)
    	Return $GUI_RUNDEFMSG
    EndFunc   ;==>WM_PAINT
    
    
    
    
    Func _Exit()
    	_BASS_RecordFree()
    	_BASS_StreamFree($hStreamEQ)
    	_BASS_StreamFree($hStreamLV)
    	_BASS_Free()
    	_GDIPlus_GraphicsDispose($hGfx_Buffer)
    	_GDIPlus_BitmapDispose($hBmp_Buffer)
    	_GDIPlus_GraphicsDispose($hGraphics)
    	_GDIPlus_Shutdown()
    	GUIDelete($hGui)
    	Exit
    EndFunc   ;==>_Exit
    Alles anzeigen
  • Echtzeit Beat-Detection mit Bass.au3

    • eukalyptus
    • 10. November 2015 um 23:51

    Wird noch ein paar Tage dauern, ist grad streßig... :whistling:

  • Echtzeit Beat-Detection mit Bass.au3

    • eukalyptus
    • 9. November 2015 um 12:41

    GetLevel wird nicht gehn, weil ein DummyStream nur virtuell ist.

    Folgende Möglichkeiten fallen mir ein:

    Falls du unbedingt GetLevel brauchst:
    Eigenen PushStream, welchen du mit PutData fütterst - Damit sollte GetLevel gehn (danach mit GetData wieder leeren, weil sich sonst der Speicher füllen könnte); Diese Variante find ich aber unschön...

    Um die Lautstärke zu verändern:
    1) Level mit $BASS_BFX_COMPRESSOR2: Mit dem Parameter "Gain" kannst du die Lautstärke der Samples verändern.
    2) Level mit $BASS_BFX_DAMP: Automatische Lautstärke (wird lauter, wenn zu leise und umgekehrt);

    BeatDetection bei Stille:
    1) BeatDetection Parameter verändern: Bandwidth u. Center frequency
    2) Mit einem LowPassFilter zuerst alle hohen Töne herausfiltern, dann BeatDetection
    3) eigene ASM-Funktion, welche alle Samples unter einem best. Wert auf Null setzt. (könnte gleichzeitig auch Get und SetLevel machen!!) <- das werd ich evtl. heute Nachmitag mal probieren

    lgE

  • Echtzeit Beat-Detection mit Bass.au3

    • eukalyptus
    • 9. November 2015 um 00:23

    PutData braucht man nicht!

    Bei einem Dummy-Stream mit Decoding-Flag ($hStream) werden die Samples im Buffer direkt von den DSPs bearbeitet.
    dh: erstes GetData = Lese Samples von Record
    zweites GetData = direkte BeatDetection an den Samples. (Ist quasi ein Set und GetData in einem)

    Nimm mal ein paar Sekunden vom StereoMix als Wav-File auf.
    Dann findest du bei den Bass-Beispielen ein Script namens "WaveForm_Beat_Detection"
    Da kannst du dir mal ansehen, ob die Detection auch richtig funktionieren würde; Weil schon etwas älter, musst du alle $ghGDIPDll noch zu $__g_hGDIPDll machen...

  • Echtzeit Beat-Detection mit Bass.au3

    • eukalyptus
    • 7. November 2015 um 21:07

    Probier mal folgendes:

    ChannelGetData von $hRecord
    und dann mit StreamPutData in einen PushStream einfüllen.

    Diesen PushStream müsstest du allerdings vorher mit Play starten, und würde evtl. wieder Rückkopplungen verursachen.
    Es könnte ein Trick helfen:
    PushStream bleibt gestoppt!
    Nach StreamPutData gleich ChannelGetData($hStream) aufrufen (somit spielt der STream nicht, aber die DSP-Funktionen = BeatDetection sollten aufgerufen werden...)


    EDIT:

    AutoIt
    #AutoIt3Wrapper_UseX64=n
    #include "Bass.au3"
    #include "BassFX.au3"
    
    
    OnAutoItExitRegister("_FreeBass")
    
    
    HotKeySet("{ESC}", "_Exit")
    
    
    
    
    _BASS_Startup()
    _BASS_FX_Startup()
    
    
    _BASS_Init(0)
    _BASS_RecordInit(-1)
    
    
    $hStream = _BASS_StreamCreate(44100, 2, $BASS_STREAM_DECODE, $STREAMPROC_DUMMY)
    _BASS_FX_BPM_BeatCallbackSet($hStream, "_BPMBEATPROC", 0)
    
    
    $hRecord = _BASS_RecordStart(44100, 2, 0)
    
    
    
    
    While 1
    	$iBytes = _BASS_ChannelGetData($hRecord, 0, 0)
    	If $iBytes Then
    		$tData = DllStructCreate("byte[" & $iBytes & "]")
    		_BASS_ChannelGetData($hRecord, DllStructGetPtr($tData), $iBytes)
    		_BASS_ChannelGetData($hStream, DllStructGetPtr($tData), $iBytes)
    	EndIf
    	Sleep(20)
    WEnd
    
    
    
    
    
    
    Func _BPMBEATPROC($handle, $pos, $user)
    	ConsoleWrite("Beat position: " & $pos & @CRLF)
    EndFunc   ;==>_BPMBEATPROC
    
    
    
    
    
    
    Func _Exit()
    	Exit
    EndFunc   ;==>_Exit
    
    
    Func _FreeBass()
    	_BASS_StreamFree($hStream)
    	_BASS_Free()
    EndFunc   ;==>_FreeBass
    Alles anzeigen
  • Times Table, Mandelbrot und Symmetrie

    • eukalyptus
    • 7. November 2015 um 20:54

    Äußerst interessant! :thumbup:

    Hier als Animation:

    AutoIt
    #include <GDIPlus.au3>
    #include <Color.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    
    
    Opt("MustDeclareVars", 1)
    Opt("GUIOnEventMode", 1)
    
    
    Global $iWidth = 600
    Global $iHeight = 600
    
    
    _GDIPlus_Startup()
    Global $hGui = GUICreate("Test", $iWidth, $iHeight + 70)
    GUISetOnEvent($GUI_EVENT_CLOSE, "_Exit")
    Global $cSL_Mul = GUICtrlCreateSlider(10, $iHeight + 5, $iWidth - 20, 30)
    Global $cSL_MulF = GUICtrlCreateSlider(10, $iHeight + 35, $iWidth - 20, 30)
    Global $hGraphics = _GDIPlus_GraphicsCreateFromHWND($hGui)
    Global $hBmp_Buffer = _GDIPlus_BitmapCreateFromGraphics($iWidth, $iHeight, $hGraphics)
    Global $hGfx_Buffer = _GDIPlus_ImageGetGraphicsContext($hBmp_Buffer)
    _GDIPlus_GraphicsSetSmoothingMode($hGfx_Buffer, 2)
    GUIRegisterMsg($WM_PAINT, "WM_PAINT")
    GUIRegisterMsg($WM_HSCROLL, "WM_HSCROLL")
    GUISetState()
    
    
    For $i = 0 To 101 Step 0.05
    	If GUIGetCursorInfo($hGui)[2] Then ExitLoop
    	GUICtrlSetData($cSL_Mul, Floor($i))
    	GUICtrlSetData($cSL_MulF, ($i-Floor($i)) * 100)
    	_Draw($i, 200, $iWidth * 0.5, $iHeight * 0.5, $iHeight * 0.4, $i / 25 * 240)
    	Sleep(10)
    Next
    
    
    While Sleep(10)
    WEnd
    
    
    
    
    
    
    Func _Draw($fMultiplier, $iSegments, $fX, $fY, $fR, $iHue)
    	WinSetTitle($hGui, "", StringFormat("%.2f", $fMultiplier))
    
    
    	Local $fAngle = 360 / $iSegments * ATan(1) / 45
    
    
    	Local $hPath = _GDIPlus_PathCreate()
    	For $i = 0 To $iSegments - 1
    		_GDIPlus_PathAddLine($hPath, $fX + Cos($i * $fAngle) * $fR, $fY + Sin($i * $fAngle) * $fR, $fX + Cos($i * $fAngle * $fMultiplier) * $fR, $fY + Sin($i * $fAngle * $fMultiplier) * $fR)
    		_GDIPlus_PathCloseFigure($hPath)
    	Next
    
    
    	Local $aHSL[3] = [Mod($iHue, 240), 240, 120]
    	Local $aRGB = _ColorConvertHSLtoRGB($aHSL)
    	Local $hPen = _GDIPlus_PenCreate(BitOR(0xFF000000, BitShift($aRGB[0], -16), BitShift($aRGB[1], -8), $aRGB[2]))
    	_GDIPlus_GraphicsClear($hGfx_Buffer, 0xFF000000)
    	_GDIPlus_GraphicsDrawPath($hGfx_Buffer, $hPath, $hPen)
    	_GDIPlus_GraphicsDrawEllipse($hGfx_Buffer, $fX - $fR, $fY - $fR, $fR + $fR, $fR + $fR, $hPen)
    	_GDIPlus_PathDispose($hPath)
    	_GDIPlus_PenDispose($hPen)
    	_GDIPlus_GraphicsDrawImage($hGraphics, $hBmp_Buffer, 0, 0)
    EndFunc   ;==>_Draw
    
    
    
    
    Func WM_HSCROLL($hWnd, $iMsg, $wParam, $lParam)
    	#forceref $hWnd, $iMsg, $wParam, $lParam
    	Switch $hWnd
    		Case $hGui
    			If BitAND($wParam, 0x0000FFFF) = 5 Then
    				Switch $lParam
    					Case GUICtrlGetHandle($cSL_Mul)
    						Local $fMul = BitShift($wParam, 16) + GUICtrlRead($cSL_MulF) / 100
    						_Draw($fMul, 200, $iWidth * 0.5, $iHeight * 0.5, $iHeight * 0.4, $fMul / 25 * 240)
    					Case GUICtrlGetHandle($cSL_MulF)
    						Local $fMul = BitShift($wParam, 16) / 100 + GUICtrlRead($cSL_Mul)
    						_Draw($fMul, 200, $iWidth * 0.5, $iHeight * 0.5, $iHeight * 0.4, $fMul / 25 * 240)
    				EndSwitch
    			EndIf
    	EndSwitch
    	Return $GUI_RUNDEFMSG
    EndFunc   ;==>WM_HSCROLL
    
    
    
    
    Func WM_PAINT($hWnd, $iMsg, $wParam, $lParam)
    	_GDIPlus_GraphicsDrawImage($hGraphics, $hBmp_Buffer, 0, 0)
    	Return $GUI_RUNDEFMSG
    EndFunc   ;==>WM_PAINT
    
    
    
    
    Func _Exit()
    	_GDIPlus_GraphicsDispose($hGfx_Buffer)
    	_GDIPlus_BitmapDispose($hBmp_Buffer)
    	_GDIPlus_GraphicsDispose($hGraphics)
    	_GDIPlus_Shutdown()
    	GUIDelete($hGui)
    	Exit
    EndFunc   ;==>_Exit
    Alles anzeigen


    Die Slider können auch mit der Maus bewegt werden, dann stoppt allerdings die Animation...

    lgE

  • Echtzeit Beat-Detection mit Bass.au3

    • eukalyptus
    • 1. November 2015 um 22:01

    Hi

    Wenn RecordStart ohne CallBack aufgerufen wurde, dann wird leider nichts aufgenommen!
    Es sei denn, man ruft regelmässig GetLevel oder GetData auf.

    Die CallBackFunktion $BASS_EXT_RecordProc sendet jedesmal ein True, und die Aufnahme wird fortgesetzt. - Das funktioniert z.b mit einem Encoder, aber scheinbar nicht mit der BeatDetection!

    Probier mal folgendes:
    1) Nimm eine StreamPipe

    Sollte in etwa so funktionieren:
    (Recordet Data wird an einen PushStream weitergeleitet)

    AutoIt
    $hStream = _BASS_StreamCreate(44100, 2, 0, $STREAMPROC_PUSH, 0)
    $aPipe = _BASS_EXT_StreamPipeCreate($hStream, $BASS_EXT_STREAMPROC_PUSH)
    _BASS_ChannelPlay($hStream, True)
    $hRecord = _BASS_RecordStart(44100, 2, 0, $BASS_EXT_RecordProc, $aPipe[0])

    2) Oder rufe selber in einer Schleife regelmässig GetData auf und befülle damit einen Stream

    lgE

    EDIT: scheinbar gibt es verschiedene Versionen von BassEXT.dll - diese sollte funktionieren: BassEXT.7z
    frag mich aber nicht warum :whistling:


    AutoIt
    #AutoIt3Wrapper_UseX64=n
    #include "Bass.au3"
    #include "BassFX.au3"
    #include "BassExt.au3"
    
    
    HotKeySet("{ESC}", "_Exit")
    
    
    _BASS_Startup()
    _BASS_FX_Startup()
    _BASS_EXT_Startup()
    _BASS_Init(0)
    _BASS_RecordInit(-1)
    
    
    $hStream = _BASS_StreamCreate(44100, 2, 0, $STREAMPROC_PUSH, 0)
    $aPipe = _BASS_EXT_StreamPipeCreate($hStream, $BASS_EXT_STREAMPROC_PUSH)
    _BASS_ChannelPlay($hStream, True)
    $hRecord = _BASS_RecordStart(44100, 2, 0, $BASS_EXT_RecordProc, $aPipe[0])
    
    
    _BASS_FX_BPM_BeatCallbackSet($hStream, "_BPMBEATPROC", 0)
    
    
    While _BASS_ChannelIsActive($hStream)
    	Sleep(20)
    WEnd
    
    
    
    
    Func _BPMBEATPROC($handle, $pos, $user)
    	ConsoleWrite("Beat position: " & $pos & @CRLF)
    EndFunc   ;==>_BPMBEATPROC
    
    
    
    
    Func _Exit()
    	Exit
    EndFunc   ;==>_Exit
    Alles anzeigen
  • Icon auf Button - schlechte Qualität

    • eukalyptus
    • 14. Oktober 2015 um 23:52

    So gehts:

    AutoIt
    #include <GUIConstantsEx.au3>
    
    
    Opt("GUIOnEventMode", 1)
    
    
    $sIcon = @ScriptDir & "\" & "icon.ico"
    
    
    $hGui = GUICreate("Test", 200, 400)
    GUICtrlCreateIcon($sIcon, 0, 10, 10, 128, 128)
    $idButton = GUICtrlCreateButton("Some Text", 10, 200, 150, 150, 0x0400)
    GUICtrlSetImage(-1, $sIcon)
    GUISetOnEvent($GUI_EVENT_CLOSE, "_beenden")
    
    
    GUISetState()
    
    
    While 1
    	Sleep(10)
    WEnd
    
    
    Func _beenden()
    	Exit
    EndFunc   ;==>_beenden
    Alles anzeigen


    Falls das Ergebnis nicht ganz deinen Wünschen entspricht, dann...
    Muss es optisch wirklich ein "richtiger" Button sein.
    Mit dem Ownerdraw-Style kannst du den Button einfach selber zeichnen, wie du willst!
    Siehe Beispiel zu "GUIRegisterMsg"
    In WM_DRAWITEM einfach _WinAPI_DrawIconEx und _WinAPI_TextOut/DrawText anwenden...

    lgE

  • Icon auf Button - schlechte Qualität

    • eukalyptus
    • 11. Oktober 2015 um 20:16

    Probier mal: GUICtrlSetImage($idButton, $sIcon)
    Edit: Sorry, Text bleibt leider immer rechts fom Icon...

  • Array auf Ursprungsgröße zurücksetzen

    • eukalyptus
    • 16. August 2015 um 10:05

    .Add ergibt einen Error, wenn der Eintrag schon existiert.
    Das war schon immer so! 3.3.12.0 hat diese Fehlermeldung anscheinend abgefangen...

    Probier mal "$dictArr.Item($_sName) = $aTmp" statt "$dictArr.Add($_sName, $aTmp)"

  • Icondatei mit mehreren Icongrößen mit GDI+ laden

    • eukalyptus
    • 15. Juni 2015 um 13:30

    Anhand des Wikipediaartikels https://en.wikipedia.org/wiki/ICO_(file_format) hab ich mal dieses kurze Beispiel gebastelt:


    [autoit][/autoit][autoit][/autoit][autoit]

    Global $sIcon = @ScriptDir & '\Everaldo-Crystal-Clear-App-display.ico'

    [/autoit][autoit][/autoit][autoit][/autoit][autoit]

    _Test($sIcon)

    [/autoit][autoit][/autoit][autoit][/autoit][autoit]

    Func _Test($sIcon)
    Local $hFile = FileOpen($sIcon, 16)
    Local $bIcon = FileRead($hFile)
    FileClose($hFile)

    [/autoit][autoit][/autoit][autoit][/autoit][autoit]

    Local $tIconHeader = DllStructCreate("ushort Res; ushort Type; ushort Cnt;")
    Local $tByte = DllStructCreate("byte[" & DllStructGetSize($tIconHeader) & "];", DllStructGetPtr($tIconHeader))
    DllStructSetData($tByte, 1, BinaryMid($bIcon, 1, DllStructGetSize($tIconHeader)))

    [/autoit][autoit][/autoit][autoit][/autoit][autoit]

    Local $iCnt = DllStructGetData($tIconHeader, "Cnt")

    [/autoit][autoit][/autoit][autoit][/autoit][autoit]

    ConsoleWrite("> Type: " & DllStructGetData($tIconHeader, "Type") & @CRLF)
    ConsoleWrite("> Cnt: " & DllStructGetData($tIconHeader, "Cnt") & @CRLF & @CRLF)

    [/autoit][autoit][/autoit][autoit][/autoit][autoit]

    Local $iOffset = DllStructGetSize($tIconHeader) + 1
    For $i = 1 To $iCnt
    ConsoleWrite("> ICON " & $i & " :" & @CRLF)
    $tIconHeader = DllStructCreate("byte Width; byte Height; byte Colors; byte Res; ushort Planes; ushort Bits; uint Size; uint Offset;")
    $tByte = DllStructCreate("byte[" & DllStructGetSize($tIconHeader) & "];", DllStructGetPtr($tIconHeader))
    DllStructSetData($tByte, 1, BinaryMid($bIcon, $iOffset, DllStructGetSize($tIconHeader)))

    [/autoit][autoit][/autoit][autoit][/autoit][autoit]

    ConsoleWrite("! " & @TAB & " W: " & DllStructGetData($tIconHeader, "Width") & @CRLF)
    ConsoleWrite("! " & @TAB & " H: " & DllStructGetData($tIconHeader, "Height") & @CRLF)
    ConsoleWrite("! " & @TAB & " Bits: " & DllStructGetData($tIconHeader, "Bits") & @CRLF)

    [/autoit][autoit][/autoit][autoit][/autoit][autoit]

    $iOffset += DllStructGetSize($tIconHeader)

    [/autoit][autoit][/autoit][autoit][/autoit][autoit]

    Next

    [/autoit][autoit][/autoit][autoit][/autoit][autoit]

    EndFunc ;==>_Test

    [/autoit]
  • Icondatei mit mehreren Icongrößen mit GDI+ laden

    • eukalyptus
    • 15. Juni 2015 um 12:23

    Schau dir mal in der Hilfe das Beispiel zu _GDIPlus_BitmapCreateFromHICON32 an.

  • [Just 4 Fun] WAV Generator

    • eukalyptus
    • 6. Mai 2015 um 22:15

    Das gefällt mir schon mal sehr gut!
    Daraus sollten wir was machen!

    Ein Loop, welcher live befüllt wird, könnte sich durchaus ausgehn... muss ich mal austesten.

    Hab auch meinen alten Thread zu diesem Thema wiederhergestellt: https://autoit.de/index.php/Thre…0479#post360479

  • Bilder trapezförmig skalieren und mit Text versehen

    • eukalyptus
    • 13. April 2015 um 10:20

    Du kannst die Größe zb. so anpassen:

    [autoit]


    #include <GDIPlus.au3>
    #include <GUIConstantsEx.au3>

    [/autoit][autoit][/autoit][autoit][/autoit][autoit]

    Global $sImageFile = FileOpenDialog("Select an image", "", "Images (*.jpg;*.png;*.bmp)")
    If @error Then Exit MsgBox(0, "Information", "Nothing selected - stopping script!", 30)
    _GDIPlus_Startup()
    Global $hBitmap = _GDIPlus_BitmapCreateFromFile($sImageFile)
    DrawTextOnBitmap($hBitmap, "This is a GDI+ demo")
    Global Const $iW = _GDIPlus_ImageGetWidth($hBitmap), $iH = _GDIPlus_ImageGetHeight($hBitmap)
    Global Const $hGUI = GUICreate("GDI+ Test", $iW, $iH)
    GUISetBkColor(0)
    GUISetState()
    Global Const $hGraphics = _GDIPlus_GraphicsCreateFromHWND($hGUI)
    Global Const $hBmp = _GDIPlus_BitmapCreateFromGraphics($iW, $iH, $hGraphics)
    Global Const $hCtxt = _GDIPlus_ImageGetGraphicsContext($hBmp)
    _GDIPlus_GraphicsSetPixelOffsetMode($hCtxt, 2)
    Global $fPosX = 0, $fPosY = 0, $iSpeed = $iH / 20
    ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $iSpeed = ' & $iSpeed & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console
    AdlibRegister("Anim", 20)

    [/autoit][autoit][/autoit][autoit][/autoit][autoit]

    Do
    Switch GUIGetMsg()
    Case $GUI_EVENT_CLOSE
    AdlibUnRegister("Anim")
    _GDIPlus_GraphicsDispose($hGraphics)
    _GDIPlus_GraphicsDispose($hCtxt)
    _GDIPlus_BitmapDispose($hBitmap)
    _GDIPlus_BitmapDispose($hBmp)
    _GDIPlus_Shutdown()
    GUIDelete()
    Exit
    EndSwitch
    Until False

    [/autoit][autoit][/autoit][autoit][/autoit][autoit]

    Func Anim()
    _GDIPlus_GraphicsClear($hCtxt)
    _GDIPlus_DrawImagePoints($hCtxt, $hBitmap, 0, 0, $iW, 0, $fPosX, $fPosY)
    _GDIPlus_GraphicsDrawImageRect($hGraphics, $hBmp, 0, 0, $iW, $iH)
    $fPosY += ($fPosY < $iH) ? $iSpeed : AdlibUnRegister("Anim")
    EndFunc ;==>Anim

    [/autoit][autoit][/autoit][autoit][/autoit][autoit]

    Func DrawTextOnBitmap(ByRef $hBitmap, $sText, $iBorder = 10, $sFontTyp = "Impact", $iInnerColor = 0xFFFFFFFF, $iBorderColor = 0xFF000000)
    Local Const $iW = _GDIPlus_ImageGetWidth($hBitmap), $iH = _GDIPlus_ImageGetHeight($hBitmap)
    Local Const $hGfx = _GDIPlus_ImageGetGraphicsContext($hBitmap)
    _GDIPlus_GraphicsSetSmoothingMode($hGfx, 4)
    _GDIPlus_GraphicsSetTextRenderingHint($hGfx, 3)
    _GDIPlus_GraphicsSetPixelOffsetMode($hGfx, 2)
    Local Const $hBrush_Inner = _GDIPlus_BrushCreateSolid($iInnerColor), $hPen_Border = _GDIPlus_PenCreate($iBorderColor, 1.5)
    Local Const $hPath = _GDIPlus_PathCreate(), $hFamily = _GDIPlus_FontFamilyCreate($sFontTyp), $hFormat = _GDIPlus_StringFormatCreate()
    Local Const $tLayout = _GDIPlus_RectFCreate(0, 0, $iW, $iH)
    ;_GDIPlus_StringFormatSetAlign($hFormat, 1)
    ;_GDIPlus_StringFormatSetLineAlign($hFormat, 1)
    _GDIPlus_PathAddString($hPath, $sText, $tLayout, $hFamily, 0, 10, $hFormat)

    [/autoit][autoit][/autoit][autoit][/autoit][autoit]

    Local $aBounds = _GDIPlus_PathGetWorldBounds($hPath)
    Local $fScale = ($iW - $iBorder * 2) / $aBounds[2]
    If ($iH - $iBorder * 2) / $aBounds[3] < $fScale Then $fScale = ($iH - $iBorder * 2) / $aBounds[3]
    Local $hMatrix = _GDIPlus_MatrixCreate()
    _GDIPlus_MatrixTranslate($hMatrix, -($aBounds[0] + $aBounds[2] * 0.5), -($aBounds[1] + $aBounds[3] * 0.5))
    _GDIPlus_MatrixScale($hMatrix, $fScale, $fScale, True)
    _GDIPlus_MatrixTranslate($hMatrix, $iW * 0.5, $iH * 0.5, True)
    _GDIPlus_PathTransform($hPath, $hMatrix)
    _GDIPlus_MatrixDispose($hMatrix)

    [/autoit][autoit][/autoit][autoit][/autoit][autoit][/autoit][autoit]

    _GDIPlus_GraphicsFillPath($hGfx, $hPath, $hBrush_Inner)
    _GDIPlus_GraphicsDrawPath($hGfx, $hPath, $hPen_Border)
    _GDIPlus_GraphicsDispose($hGfx)
    _GDIPlus_BrushDispose($hBrush_Inner)
    _GDIPlus_PenDispose($hPen_Border)
    _GDIPlus_PathDispose($hPath)
    _GDIPlus_FontFamilyDispose($hFamily)
    _GDIPlus_StringFormatDispose($hFormat)
    EndFunc ;==>DrawTextOnBitmap

    [/autoit]
  • SSE Shuffle Explorer V2

    • eukalyptus
    • 13. April 2015 um 10:09

    Hab das mal eingebaut.
    Falls die CPU SSE3 bzw. SSSE3 nicht unterstützt, werden diese Befehle einfach simuliert.

  • SSE Shuffle Explorer V2

    • eukalyptus
    • 11. April 2015 um 20:27

    Wie bekommt man beim programmieren in Assembler die Werte in den xmm-Registern in die richtige Reihenfolge?!
    Es gibt zahlreiche Befehle, um die Bits und Bytes umzuschachteln; Um mir selber das Leben etwas einfacher zu machen, hab ich mir folgendes Tool gebastelt.

    Gleich vorweg: es ist brandneu und ich hab selber noch nicht damit gearbeitet, ich hoffe jedoch, dass es seinen Zweck gut erfüllt und keine Bugs enthält :whistling:

    Ich erspar mir erstmal eine Funktionserklärung und hoffe, dass das meiste selbsterklärend ist...
    Nur folgendes: Bei den Shuffle-Befehlen kann man mit der Maus durch Kilcken und Ziehen die Register in die gewünschte Reihenfolge bringen.
    Und bei pshufb wird mit Reset (Button "R" bei xmm1) nicht auf Null resettet, sondern auf die Werte, welche xmm0 1:1 kopieren.

    SSE_Shuffle.jpg


    EDIT: Simuliert nun SSE3 u. SSSE3 - Befehle, falls die CPU diese nicht unterstützt.

    E

    Dateien

    _SSE_Shuffle.7z 668,49 kB – 491 Downloads
  • CoSiNUs brOTHerS inTRO build 2015-04-20

    • eukalyptus
    • 11. April 2015 um 19:36

    Also, wenn am Ende sowas rauskommt, dann darfst du ruhig öfters "ungewollte" Effekte produzieren ;)

Spenden

Jeder Euro hilft uns, Euch zu helfen.

Download

AutoIt Tutorial
AutoIt Buch
Onlinehilfe
AutoIt Entwickler
  1. Datenschutzerklärung
  2. Impressum
  3. Shoutbox-Archiv
Community-Software: WoltLab Suite™