Jump to content

Recommended Posts

Posted

Hey hey!

I got rid of the silly _Sound function's and replaced them with _BASS in my media player!

Now I also was able to add your visualization's to it, and I did it! It was a little irritating to adjust the size and stuff but I got it!

I haven't uploaded the new version yet, but you'll see..

  • Replies 61
  • Created
  • Last Reply

Top Posters In This Topic

Posted

This Visualize the mp3 file it plays, any way to Visualize the current microphone input?

0x616e2069646561206973206c696b652061206d616e20776974686f7574206120626f64792c20746f206669676874206f6e6520697320746f206e657665722077696e2e2e2e2e

  • 7 months later...
  • 7 months later...
  • 1 month later...
Posted

am i doing something wrong?

i get an error when i try to run this script

Return $call[0]
Return $call^ ERROR

Error: Subscript used with non-Array variable

any clues?

Posted (edited)

I don't know why monoceres has retired but here a version which runs properly on my computer!

#AutoIt3Wrapper_UseX64=n
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;Copyright notice;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Copyright © All rights reserved Andreas Karlsson 2008
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; This source is provided for educational purposes.
; If you wish to use parts of this source you need to credit me in your application.
; Contact: andreas.karlsson3@gmail.com
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Notice that the above copyright does not apply to the following function:
; _GDIPlus_CreateLineBrushFromRect
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

#include <misc.au3>
#include <GDIPlus.au3>
#include <array.au3>
#include <file.au3>
#include <windowsconstants.au3>
Global $bass
Global Const $PI = 3.14159
Bass_Start()
$pluginhandle = Bass_LoadPlugin("bassflac.dll")

Opt("GUIOnEventMode", 1)
Global Const $width = 800
Global Const $height = 600
$hwnd = GUICreate("Visualization", $width, $height, -1, -1, -1, $WS_EX_ACCEPTFILES)
GUISetOnEvent(-3, "close")
GUISetState()


GUIRegisterMsg(563, "WM_DROPFILES_FUNC")

_GDIPlus_Startup()
$graphics = _GDIPlus_GraphicsCreateFromHWND($hwnd)
$bitmap = _GDIPlus_BitmapCreateFromGraphics($width, $height, $graphics)
$vizbitmap = _GDIPlus_BitmapCreateFromGraphics($width, $height, $graphics)
$backbuffer = _GDIPlus_ImageGetGraphicsContext($bitmap)
$vizbuffer = _GDIPlus_ImageGetGraphicsContext($vizbitmap)
$brush = _GDIPlus_BrushCreateSolid(0xFF22FF22)
$pen = _GDIPlus_PenCreate(0xFF22AA22, 2)

Global $blacktrans = _GDIPlus_BrushCreateSolid(0x10000000)

$family = _GDIPlus_FontFamilyCreate("Arial")
$font = _GDIPlus_FontCreate($family, 26)
$format = _GDIPlus_StringFormatCreate()
_GDIPlus_StringFormatSetAlign($format, 1)
$rect = _GDIPlus_RectFCreate(0, 150, $width, $height)
Global $RandomBrushes[128]
For $i = 0 To UBound($RandomBrushes) - 1
    $RandomBrushes[$i] = _GDIPlus_BrushCreateSolid(Random(0xAA000000, 0xAAFFFFFF, 1))
Next
Global $WhiteTransBrushes[256]
For $i = UBound($WhiteTransBrushes) - 1 To 0 Step -1
    $WhiteTransBrushes[$i] = _GDIPlus_BrushCreateSolid("0x" & Hex($i, 2) & "FFFFFF")
Next
Local $aFact[4] = [0.0, 0.01, 0.02, 1.0]
$lgbrush = _GDIPlus_CreateLineBrushFromRect(0, 00, $width, $height, $aFact, -1, 0xFFAA0000, 0xFF00AA00)

_GDIPlus_GraphicsSetSmoothingMode($backbuffer, 2)
_GDIPlus_GraphicsSetSmoothingMode($vizbuffer, 2)

Global $stream
Global $user32 = DllOpen("user32.dll")
Global $ID3 = "char id[3];char title[30];char artist[30];char album[30];char year[4];char comment[30];ubyte genre;"
Global $SongString = "Audio Visualization with GDI+" & @CRLF & "Drag 'n drop audio file to start playback"
Global $SongStringOpacity = 255
Global $active = 3
Global $groundangle = 0
Global $towerscount = 32
Global $roofs[$towerscount + 1][2]
Global $released = True


Global $seed = Random(0, 10000, 1)


$b = DllStructCreate("float[128]")

#Region Globals for _ScopeViz
Global $scrollbm1 = _GDIPlus_BitmapCreateFromGraphics($width, $height, $graphics)
Global $scrollbackbuffer1 = _GDIPlus_ImageGetGraphicsContext($scrollbm1)
_GDIPlus_GraphicsClear($scrollbackbuffer1)
Global $scrollbm2 = _GDIPlus_BitmapCreateFromGraphics($width, $height, $graphics)
Global $scrollbackbuffer2 = _GDIPlus_ImageGetGraphicsContext($scrollbm2)
_GDIPlus_GraphicsClear($scrollbackbuffer2)

Global $activeg = $scrollbackbuffer1
Global $totaloffset = 0
Global $step = 2
Global $_oldx=0
Global $_oldy=0
Global $changingbrush=_GDIPlus_BrushCreateSolid()

;~ _AntiAlias($scrollbackbuffer1,4)
;~ _AntiAlias($scrollbackbuffer2,4)
#EndRegion Globals for _ScopeViz

Global $momento=100
;~ Global $


Do
    Sleep(10)

    _GDIPlus_GraphicsClear($backbuffer)
    $call = DllCall($bass, "dword", "BASS_ChannelGetData", "dword", $stream, "ptr", DllStructGetPtr($b), "dword", 0x80000000)

    Switch $active
        Case 0
            _CircleViz($vizbuffer, $b, $brush)
        Case 1
            _SinViz($vizbuffer, $b, $pen)
        Case 2
            _TowerViz($vizbuffer, $b, $lgbrush, $pen)
        Case 3
            _TriangleViz($vizbuffer, $b, $pen)
        Case 4
            _BubbleSleep($vizbuffer, $b)
        Case 5
            _SpeakerViz($vizbuffer, $b, $pen)
        Case 6
            _3DTowerViz($vizbuffer, $b, $lgbrush)
        Case 7
            _ScopeViz($vizbuffer, $b)
        Case 8
            _TestViz($vizbuffer,$b,$pen)

        Case Else
            $active = 0
    EndSwitch
    _GDIPlus_GraphicsDrawImageRect($backbuffer, $vizbitmap, 0, 0, $width, $height)

    If _IsPressed("01", $user32) And WinActive($hwnd) Then
        If $released Then
            For $i = 0 To UBound($roofs) - 1
                $roofs[$i][0] = $height / 2
            Next

            $active += 1
            $released = False
        EndIf
    Else
        $released = True
    EndIf

    If $SongStringOpacity > 0 Then
        _GDIPlus_GraphicsDrawStringEx($backbuffer, $SongString, $font, $rect, $format, $WhiteTransBrushes[$SongStringOpacity])
        $SongStringOpacity -= 1
    EndIf
    _GDIPlus_GraphicsDrawImageRect($graphics, $bitmap, 0, 0, $width, $height)
Until False

Func _ScopeViz($surface, $fftstruct)
    If $totaloffset = 0 Then _GDIPlus_GraphicsClear($surface)
    $Sum = 0
    For $i = 1 To 128
        $Sum += DllStructGetData($fftstruct, 1, $i)
    Next

    $totaloffset += $step

    $activex1 = Mod($totaloffset, $width * 2)
    $activex2 = Mod($totaloffset - $width, $width * 2)


    If $activex2 = $width Then
        _GDIPlus_GraphicsClear($scrollbackbuffer1)
        $activeg = $scrollbackbuffer1
    ElseIf $activex1 = $width Then
        $activeg = $scrollbackbuffer2
        _GDIPlus_GraphicsClear($scrollbackbuffer2)
    EndIf

    $xpaint = Mod($totaloffset, $width)

    $r = $Sum * $height / 4

    $tred=Hex((Sin($totaloffset/1500)+1)/2*255,2)
    $tgreen=Hex((Sin($totaloffset/1500*2)+1)/2*255,2)
    $tblue=Hex((Sin($totaloffset/1500*3)+1)/2*255,2)

    $tcolor="0xFF"&$tred&$tgreen&$tblue
    _GDIPlus_BrushSetSolidColor_FromBeta($changingbrush,$tcolor)

    _GDIPlus_GraphicsFillRect($activeg, $xpaint, $height / 2 - $r / 2, $step, $r, $changingbrush)
    _GDIPlus_GraphicsDrawImageRect($surface, $scrollbm1, $width - $activex1, 0, $width, $height)
    _GDIPlus_GraphicsDrawImageRect($surface, $scrollbm2, $width - $activex2, 0, $width, $height)
EndFunc   ;==>_ScopeViz



Func close()
    Bass_FreeStream($stream)
    Bass_UnloadPlugin($pluginhandle)
    _GDIPlus_BrushDispose($lgbrush)
    For $i = 0 To UBound($WhiteTransBrushes) - 1
        _GDIPlus_BrushDispose($WhiteTransBrushes[$i])
    Next
    For $i = 0 To UBound($RandomBrushes) - 1
        _GDIPlus_BrushDispose($RandomBrushes[$i])
    Next
    _GDIPlus_StringFormatDispose($format)
    _GDIPlus_FontDispose($font)
    _GDIPlus_FontFamilyDispose($family)
    _GDIPlus_BrushDispose($blacktrans)
    _GDIPlus_PenDispose($pen)
    _GDIPlus_BrushDispose($brush)
    _GDIPlus_GraphicsDispose($vizbuffer)
    _GDIPlus_GraphicsDispose($backbuffer)
    _GDIPlus_BitmapDispose($vizbitmap)
    _GDIPlus_BitmapDispose($bitmap)
    _GDIPlus_GraphicsDispose($graphics)
    _GDIPlus_Shutdown()
    Exit
EndFunc   ;==>close




Func _3DTowerViz($surface, $fftstruct, $brush)
    _GDIPlus_GraphicsClear($surface, 0xFF000000)
    Local $tcount = 10
    Local $towerw = $width / $tcount - 5
    For $i = 0 To $tcount Step 1
        $fft = DllStructGetData($fftstruct, 1, ($i / $tcount) * 128 + 1)
        $h = (Sqrt($fft) ^ 0.75) * $height
        $x = 5 + $i * ($towerw + 5)
        _Fill3DStaple($surface, $x, $height - $h, $towerw - $towerw / 4, $height + $h, $towerw / 4, $brush, $brush, $brush)
    Next
EndFunc   ;==>_3DTowerViz


Func _BubbleSleep($surface, $fftstruct)
    SRandom($seed)
    _GDIPlus_GraphicsClear($surface, 0xFF000000)

    For $i = 1 To 110

        $fft = DllStructGetData($fftstruct, 1, $i)

        $w = Sqrt($fft) * 200 + 10
        $h = Sqrt($fft) * 200 + 10
        $x = Random(0, $width, 1) - $w / 2

        $y = Random(0, $height, 1) - $h / 2

        _GDIPlus_GraphicsFillEllipse($surface, $x, $y, $w, $h, $RandomBrushes[$i - 1])

    Next

EndFunc   ;==>_BubbleSleep


Func _CircleViz($surface, $fftstruct, $brush)
    _GDIPlus_GraphicsClear($surface, 0xFF000000)
    SRandom($seed)
    Local $dots = 100
    For $i = 1 To $dots
        $fft = DllStructGetData($fftstruct, 1, Random(1, 100, 1));$randvalues[$i-1])
        If Mod($i, 2) = 0 Then
            $x = (Cos($PI * ($i / $dots)) * 30 * Sqrt(Sqrt($fft * 100000))) + $width / 2
            $y = (Sin($PI * ($i / $dots)) * 30 * Sqrt(Sqrt($fft * 100000))) + $height / 2
        Else
            $x = (Cos(-1 * $PI * ($i / $dots)) * 30 * Sqrt(Sqrt($fft * 100000))) + $width / 2
            $y = (Sin(-1 * $PI * ($i / $dots)) * 30 * Sqrt(Sqrt($fft * 100000))) + $height / 2
        EndIf

        _GDIPlus_GraphicsFillEllipse($surface, $x, $y, 2, 2, $brush)

    Next

EndFunc   ;==>_CircleViz



Func _SpeakerViz($surface, $fftstruct, $pen)
;~  _GDIPlus_GraphicsClear($surface, 0xFF000000)
    _GDIPlus_GraphicsFillRect($surface, 0, 0, $width, $height, $blacktrans)
    $Sum = 0
    For $i = 1 To 128
        $Sum += DllStructGetData($fftstruct, 1, $i)
    Next
    $size = $Sum * 105 + 10
    _GDIPlus_GraphicsDrawArc($surface, 10, $height / 2 - $size / 2, $size, $size, 270, 180, $pen)
    _GDIPlus_GraphicsDrawArc($surface, $width - 10 - $size, $height / 2 - $size / 2, $size, $size, 90, 180, $pen)

EndFunc   ;==>_SpeakerViz


Func _TriangleViz($surface, $fftstruct, $pen)
    $Sum = 0
;~  _GDIPlus_GraphicsFillRect($surface,0,0,$width,$height,$blacktrans)
    _GDIPlus_GraphicsFillRect($surface, 0, 0, $width, $height, $blacktrans)
;~  _GDIPlus_GraphicsClear($surface)

    For $i = 1 To 128
        $Sum += DllStructGetData($fftstruct, 1, $i)
    Next
    $groundangle += $PI / 50
    $size = 50 + $Sum * 100
    $x1 = Cos($groundangle + $PI / 2) * $size + $width / 2
    $y1 = Sin($groundangle + $PI / 2) * $size + $height / 2
    $x2 = Cos($groundangle + $PI / 2 + (2 * $PI) / 3) * $size + $width / 2
    $y2 = Sin($groundangle + $PI / 2 + (2 * $PI) / 3) * $size + $height / 2
    $x3 = Cos($groundangle + $PI / 2 + ((2 * $PI) / 3) * 2) * $size + $width / 2
    $y3 = Sin($groundangle + $PI / 2 + ((2 * $PI) / 3) * 2) * $size + $height / 2
    _GDIPlus_GraphicsDrawLine($surface, $x1, $y1, $x2, $y2, $pen)
    _GDIPlus_GraphicsDrawLine($surface, $x2, $y2, $x3, $y3, $pen)
    _GDIPlus_GraphicsDrawLine($surface, $x3, $y3, $x1, $y1, $pen)

EndFunc   ;==>_TriangleViz

Func _TestViz($surface, $fftstruct, $pen)
;~  _GDIPlus_GraphicsFillRect($surface, 0, 0, $width, $height, $blacktrans)
    _GDIPlus_GraphicsClear($surface)
    $Sum = 0

    For $i = 1 To 128
        $Sum += DllStructGetData($fftstruct, 1, $i)
    Next
    $momento+=$Sum*50


    $groundangle+=( $Sum/100+$momento/1000+0.01)/2
    $momento/=2

    $x1=Cos($groundangle)*200+$width/2
    $y1=Sin($groundangle)*200+$height/2
    $x2=Cos($groundangle+$PI)*200+$width/2
    $y2=Sin($groundangle+$PI)*200+$height/2


    $x3=Cos($groundangle+$PI/2)*200+$width/2
    $y3=Sin($groundangle+$PI/2)*200+$height/2
    $x4=Cos($groundangle+$PI+$PI/2)*200+$width/2
    $y4=Sin($groundangle+$PI+$PI/2)*200+$height/2

    _GDIPlus_GraphicsDrawLine($surface,$x1,$y1,$x2,$y2,$pen)
    _GDIPlus_GraphicsDrawLine($surface,$x1,$y1,$x3,$y3,$pen)
;~  _GDIPlus_GraphicsDrawLine($surface,$x3,$y3,$x2,$y2,$pen)
    _GDIPlus_GraphicsDrawLine($surface,$x2,$y2,$x4,$y4,$pen)
;~  _GDIPlus_GraphicsDrawLine($surface,$x1,$y1,$x4,$y4,$pen)

EndFunc   ;==>_TowerViz


Func _TowerViz($surface, $fftstruct, $brush, $pen)
    _GDIPlus_GraphicsClear($surface, 0xFF000000)

    Local $towerw = $width / $towerscount

    For $i = 0 To $towerscount Step 1
        $fft = DllStructGetData($fftstruct, 1, ($i / $towerscount) * 128 + 1)

        $h = (Sqrt($fft) ^ 0.75) * $height
        ;$h = (Log($fft*100)) * $height
        $x = 1 + $i * ($towerw)
        If $roofs[$i][0] < $h Then
            $roofs[$i][0] = $h
            $roofs[$i][1] = 13
        Else
            $roofs[$i][1] -= 1

            If $roofs[$i][1] < 0 Then $roofs[$i][0] -= 5
        EndIf

        _GDIPlus_GraphicsFillRect($surface, $x, $height - $h, $towerw, $height + $h, $brush)
        _GDIPlus_GraphicsDrawLine($surface, $x, $height - $roofs[$i][0], $x + $towerw, $height - $roofs[$i][0], $pen)
    Next
;~  Sleep(10)

EndFunc   ;==>_TowerViz

Func _SinViz($surface, $fftstruct, $pen)
    Local $oldx = 0, $oldy = $height / 2
    _GDIPlus_GraphicsClear($surface, 0xFF000000)
    For $i = 1 To 128

    Next

    For $i = 0 To $width Step 5
        $fft = DllStructGetData($fftstruct, 1, $i / 6)
        $y = $height / 2 + Sin($i) * Sqrt($fft) * 500
        _GDIPlus_GraphicsDrawLine($surface, $oldx, $oldy, $i, $y, $pen)
        $oldx = $i
        $oldy = $y
    Next
EndFunc   ;==>_SinViz



Func WM_DROPFILES_FUNC($hwnd, $msgID, $wParam, $lParam)
    Local $nSize, $pFileName
    Local $nAmt = DllCall("shell32.dll", "int", "DragQueryFile", "hwnd", $wParam, "int", 0xFFFFFFFF, "ptr", 0, "int", 255)
    For $i = 0 To $nAmt[0] - 1
        $nSize = DllCall("shell32.dll", "int", "DragQueryFile", "hwnd", $wParam, "int", $i, "ptr", 0, "int", 0)
        $nSize = $nSize[0] + 1
        $pFileName = DllStructCreate("char[" & $nSize & "]")
        DllCall("shell32.dll", "int", "DragQueryFile", "hwnd", $wParam, "int", $i, "ptr", DllStructGetPtr($pFileName), "int", $nSize)
        Bass_FreeStream($stream)
        $stream = Bass_StreamCreateFile(DllStructGetData($pFileName, 1))


        If $stream = 0 Then Return
        If StringRight(DllStructGetData($pFileName, 1), 4) = "flac" Or StringRight(DllStructGetData($pFileName, 1), 4) = ".ogg" Then
            $ptr = Bass_ChannelGetTags($stream, 2)
            $temp = _GetID3StructFromOGGComment($ptr)
            $SongString = DllStructGetData($temp, "Title")
            If StringLen(DllStructGetData($temp, "Artist")) > 1 Then $SongString &= " - " & DllStructGetData($temp, "Artist")
            $SongStringOpacity = 255
        Else
            $ptr = Bass_ChannelGetTags($stream, 0)
            $temp = DllStructCreate($ID3, $ptr)
            $SongString = DllStructGetData($temp, "Title")
            If StringLen(DllStructGetData($temp, "Artist")) > 1 Then $SongString &= " - " & DllStructGetData($temp, "Artist")
            $SongStringOpacity = 255
        EndIf


        Bass_ChannelPlay($stream)

    Next
EndFunc   ;==>WM_DROPFILES_FUNC

Func _GDIPlus_BrushSetSolidColor_FromBeta($hBrush, $iARGB = 0xFF000000)
    Local $aResult
    $aResult = DllCall($ghGDIPDll, "int", "GdipSetSolidFillColor", "hwnd", $hBrush, "int", $iARGB)
    If @error Then Return SetError(@error, @extended, 0)
    Return SetError($aResult[0], 0, $aResult[0] = 0)
EndFunc ;==>_GDIPlus_BrushSetSolidColor

Func Bass_UnloadPlugin($plugin)
    DllCall($bass, "int", "BASS_PluginFree", "dword", $plugin)
EndFunc   ;==>Bass_UnloadPlugin

Func Bass_LoadPlugin($fname)
    $str = DllStructCreate("char[255];")
    DllStructSetData($str, 1, $fname)
    $call = DllCall($bass, "dword", "BASS_PluginLoad", "ptr", DllStructGetPtr($str), "dword", 0)
    Return $call[0]
EndFunc   ;==>Bass_LoadPlugin

Func Bass_StreamCreateFile($fname)
    $str = DllStructCreate("char[255];")
    DllStructSetData($str, 1, $fname)

    $call = DllCall($bass, "int", "BASS_StreamCreateFile", "int", 0, "ptr", DllStructGetPtr($str), "uint64", 0, "uint64", 0, "dword", 0);
    Return $call[0]
EndFunc   ;==>Bass_StreamCreateFile

Func Bass_Start()
    $bass = DllOpen(@ScriptDir & "\bass.dll")
    $call = DllCall($bass, "int", "BASS_Init", "int", -1, "dword", 44100, "dword", 0, "hwnd", 0, "ptr", 0)
EndFunc   ;==>Bass_Start

Func Bass_ChannelPlay($stream)
    $call = DllCall($bass, "int", "BASS_ChannelPlay", "dword", $stream, "int", 1);
EndFunc   ;==>Bass_ChannelPlay

Func Bass_FreeStream($stream)
    DllCall($bass, "int", "BASS_StreamFree", "dword", $stream)
EndFunc   ;==>Bass_FreeStream
Func Bass_ChannelGetTags($stream, $flag)
    $call = DllCall($bass, "ptr", "BASS_ChannelGetTags", "dword", $stream, "dword", $flag)
    Return $call[0]
EndFunc   ;==>Bass_ChannelGetTags

Func _GetID3StructFromOGGComment($ptr)
    $tags = DllStructCreate($ID3)
    Do
        $s = DllStructCreate("char[255];", $ptr)
        $string = DllStructGetData($s, 1)
        If StringLeft($string, 1) = Chr(0) Then ExitLoop
;~      MsgBox(0, "", $string)


        Switch StringLeft($string, StringInStr($string, "=") - 1)
            Case "title"
                DllStructSetData($tags, "title", StringTrimLeft($string, StringInStr($string, "=")))
            Case "artist"
                DllStructSetData($tags, "artist", StringTrimLeft($string, StringInStr($string, "=")))
            Case "album"
                DllStructSetData($tags, "album", StringTrimLeft($string, StringInStr($string, "=")))
            Case "date"
                DllStructSetData($tags, "year", StringTrimLeft($string, StringInStr($string, "=")))
            Case "genre"
                DllStructSetData($tags, "genre", StringTrimLeft($string, StringInStr($string, "=")))
            Case "comment"
                DllStructSetData($tags, "comment", StringTrimLeft($string, StringInStr($string, "=")))
        EndSwitch
        $ptr += StringLen($string) + 1
    Until False

    Return $tags
EndFunc   ;==>_GetID3StructFromOGGComment

;==== GDIPlus_CreateLineBrushFromRect ===
;Description - Creates a LinearGradientBrush object from a set of boundary points and boundary colors.
; $aFactors - If non-array, default array will be used.
;           Pointer to an array of real numbers that specify blend factors. Each number in the array
;           specifies a percentage of the ending color and should be in the range from 0.0 through 1.0.
;$aPositions - If non-array, default array will be used.
;            Pointer to an array of real numbers that specify blend factors' positions. Each number in the array
;            indicates a percentage of the distance between the starting boundary and the ending boundary
;            and is in the range from 0.0 through 1.0, where 0.0 indicates the starting boundary of the
;            gradient and 1.0 indicates the ending boundary. There must be at least two positions
;            specified: the first position, which is always 0.0, and the last position, which is always
;            1.0. Otherwise, the behavior is undefined. A blend position between 0.0 and 1.0 indicates a
;            line, parallel to the boundary lines, that is a certain fraction of the distance from the
;            starting boundary to the ending boundary. For example, a blend position of 0.7 indicates
;            the line that is 70 percent of the distance from the starting boundary to the ending boundary.
;            The color is constant on lines that are parallel to the boundary lines.
; $iArgb1    - First Top color in 0xAARRGGBB format
; $iArgb2    - Second color in 0xAARRGGBB format
; $LinearGradientMode -  LinearGradientModeHorizontal       = 0x00000000,
;                        LinearGradientModeVertical         = 0x00000001,
;                        LinearGradientModeForwardDiagonal  = 0x00000002,
;                        LinearGradientModeBackwardDiagonal = 0x00000003
; $WrapMode  - WrapModeTile       = 0,
;              WrapModeTileFlipX  = 1,
;              WrapModeTileFlipY  = 2,
;              WrapModeTileFlipXY = 3,
;              WrapModeClamp      = 4
; GdipCreateLineBrushFromRect(GDIPCONST GpRectF* rect, ARGB color1, ARGB color2,
;             LinearGradientMode mode, GpWrapMode wrapMode, GpLineGradient **lineGradient)
; Reference:  http://msdn.microsoft.com/en-us/library/ms534043(VS.85).aspx
;
Func _GDIPlus_CreateLineBrushFromRect($iX, $iY, $iWidth, $iHeight, $aFactors, $aPositions, _
                                                                        $iArgb1 = 0xFF0000FF, $iArgb2 = 0xFFFF0000, $LinearGradientMode = 0x00000001, $WrapMode = 0)

    Local $tRect, $pRect, $aRet, $tFactors, $pFactors, $tPositions, $pPositions, $iCount

    If $iArgb1 = -1 Then $iArgb1 = 0xFF0000FF
    If $iArgb2 = -1 Then $iArgb2 = 0xFFFF0000
    If $LinearGradientMode = -1 Then $LinearGradientMode = 0x00000001
    If $WrapMode = -1 Then $WrapMode = 1

    $tRect = DllStructCreate("float X;float Y;float Width;float Height")
    $pRect = DllStructGetPtr($tRect)
    DllStructSetData($tRect, "X", $iX)
    DllStructSetData($tRect, "Y", $iY)
    DllStructSetData($tRect, "Width", $iWidth)
    DllStructSetData($tRect, "Height", $iHeight)

    ;Note: Withn _GDIPlus_Startup(), $ghGDIPDll is defined
    $aRet = DllCall($ghGDIPDll, "int", "GdipCreateLineBrushFromRect", "ptr", $pRect, "int", $iArgb1, _
            "int", $iArgb2, "int", $LinearGradientMode, "int", $WrapMode, "int*", 0)

    If IsArray($aFactors) = 0 Then Dim $aFactors[4] = [0.0, 0.4, 0.6, 1.0]
    If IsArray($aPositions) = 0 Then Dim $aPositions[4] = [0.0, 0.3, 0.7, 1.0]

    $iCount = UBound($aPositions)
    $tFactors = DllStructCreate("float[" & $iCount & "]")
    $pFactors = DllStructGetPtr($tFactors)
    For $iI = 0 To $iCount - 1
        DllStructSetData($tFactors, 1, $aFactors[$iI], $iI + 1)
    Next
    $tPositions = DllStructCreate("float[" & $iCount & "]")
    $pPositions = DllStructGetPtr($tPositions)
    For $iI = 0 To $iCount - 1
        DllStructSetData($tPositions, 1, $aPositions[$iI], $iI + 1)
    Next

    $hStatus = DllCall($ghGDIPDll, "int", "GdipSetLineBlend", "hwnd", $aRet[6], _
            "ptr", $pFactors, "ptr", $pPositions, "int", $iCount)
    Return $aRet[6] ; Handle of Line Brush
EndFunc   ;==>_GDIPlus_CreateLineBrushFromRect



Func _Fill3DStaple($surface, $x, $y, $w, $h, $3D, $b1, $b2, $b3)
    Local $va1[5][2]
    Local $va2[5][2]
    Local $va3[5][2]
    $va1[0][0] = 4
    $va1[1][0] = $x
    $va1[1][1] = $y
    $va1[2][0] = $x + $w
    $va1[2][1] = $y
    $va1[3][0] = $x + $w + $3D
    $va1[3][1] = $y + $3D
    $va1[4][0] = $x + $3D
    $va1[4][1] = $y + $3D
    $va2[0][0] = 4
    $va2[1][0] = $x + $3D
    $va2[1][1] = $y + $3D
    $va2[2][0] = $x + $w + $3D
    $va2[2][1] = $y + $3D
    $va2[3][0] = $x + $w + $3D
    $va2[3][1] = $y + $h
    $va2[4][0] = $x + $3D
    $va2[4][1] = $y + $h
    $va3[0][0] = 4
    $va3[1][0] = $x + $3D
    $va3[1][1] = $y + $h
    $va3[2][0] = $x
    $va3[2][1] = $y + $h - $3D
    $va3[3][0] = $x
    $va3[3][1] = $y
    $va3[4][0] = $x + $3D
    $va3[4][1] = $y + $3D
    _GDIPlus_GraphicsFillPolygon($surface, $va1, $b1)
    _GDIPlus_GraphicsFillPolygon($surface, $va2, $b2)
    _GDIPlus_GraphicsFillPolygon($surface, $va3, $b3)
EndFunc   ;==>_Fill3DStaple

Br,

UEZ

Edited by UEZ

Please don't send me any personal message and ask for support! I will not reply!

Selection of finest graphical examples at Codepen.io

The own fart smells best!
Her 'sikim hıyar' diyene bir avuç tuz alıp koşma!
¯\_(ツ)_/¯  ٩(●̮̮̃•̃)۶ ٩(-̮̮̃-̃)۶ૐ

Posted

@nonab

It could be that you are using the x64 AutoIt and trying to use a x86 dll. That wont work (And vice-versa). Install SciTE4AutoIt3 if you haven't, and add #AutoIt3Wrapper_UseX64=n at the top of your script.

@UEZ

I don't know why monoceres has retired

Last I heard, he was swamped by university and work.

Your changes still didn't work for me due to some stupid app adding a incompatible version of bass.dll to @SystemDir. Fix by changing:

$bass = DllOpen("bass.dll")

to

$bass = DllOpen(@ScriptDir & "\bass.dll")

Checking @AutoItX64 wouldn't be bad either.

  • 4 years later...
Posted (edited)

Add at the top of your script just after the _GDIPlus_Startup() line

Global $ghGDIPDll = $__g_hGDIPDll

and it should work.

Edited by UEZ

Please don't send me any personal message and ask for support! I will not reply!

Selection of finest graphical examples at Codepen.io

The own fart smells best!
Her 'sikim hıyar' diyene bir avuç tuz alıp koşma!
¯\_(ツ)_/¯  ٩(●̮̮̃•̃)۶ ٩(-̮̮̃-̃)۶ૐ

  • 1 year later...
Posted

Trying to get this working. Per the suggestions I have done:

  • Added #AutoIt3Wrapper_UseX64=n at the very top of the script
  • Changed $bass = DllOpen("bass.dll") to $bass = DllOpen(@ScriptDir & "\bass.dll")
  • Added Global $ghGDIPDll = $__g_hGDIPDll below the #include lines

 

I am still getting the below error:

Line 603:

$hStatus = DllCall($ghGDIPDll, "int", "GdipSetLineBlend", "hwnd", $aRet[6],
"ptr", $pFactors, "ptr", $pPositions, "int", $iCount)

$hStatus = DllCall($ghGDIPDll, "int", "GdipSetLineBlend", "hwnd", $aRet^ERROR

Error: Subscript used on non-accessible variable

 

 

Any ideas?

Thank you,

 

Posted

You have to add Global $ghGDIPDll = $__g_hGDIPDll just after _GDIPlus_Startup()!

_GDIPlus_Startup()
Global $ghGDIPDll = $__g_hGDIPDll

 

Please don't send me any personal message and ask for support! I will not reply!

Selection of finest graphical examples at Codepen.io

The own fart smells best!
Her 'sikim hıyar' diyene bir avuç tuz alıp koşma!
¯\_(ツ)_/¯  ٩(●̮̮̃•̃)۶ ٩(-̮̮̃-̃)۶ૐ

  • 1 year later...
Posted

When i try to port to x64 with update dll i get a  0xc0000005 crash in 604 line:

$hStatus = DllCall($ghGDIPDll, "int", "GdipSetLineBlend", "handle", $aRet[6], "ptr", $pFactors, "ptr", $pPositions, "int", $iCount)

do it have a solution?

  • Moderators
Posted

Ontosy,

The $ghGDIPDll DLL name within the various GDI #include files was renamed a long time ago to $__g_hGDIPDll - try changing that in the calling line and see if it works.

M23

Public_Domain.png.2d871819fcb9957cf44f4514551a2935.png Any of my own code posted anywhere on the forum is available for use by others without any restriction of any kind

Open spoiler to see my UDFs:

Spoiler

ArrayMultiColSort ---- Sort arrays on multiple columns
ChooseFileFolder ---- Single and multiple selections from specified path treeview listing
Date_Time_Convert -- Easily convert date/time formats, including the language used
ExtMsgBox --------- A highly customisable replacement for MsgBox
GUIExtender -------- Extend and retract multiple sections within a GUI
GUIFrame ---------- Subdivide GUIs into many adjustable frames
GUIListViewEx ------- Insert, delete, move, drag, sort, edit and colour ListView items
GUITreeViewEx ------ Check/clear parent and child checkboxes in a TreeView
Marquee ----------- Scrolling tickertape GUIs
NoFocusLines ------- Remove the dotted focus lines from buttons, sliders, radios and checkboxes
Notify ------------- Small notifications on the edge of the display
Scrollbars ----------Automatically sized scrollbars with a single command
StringSize ---------- Automatically size controls to fit text
Toast -------------- Small GUIs which pop out of the notification area

 

  • 1 month later...
Posted
Just now, Fr33b0w said:

Can someone update this please so some of us less experienced can enjoy this too

Depends on what's not working, and how hard it is to update this. Why are y ou here if not to learn how to do it yourself?

If I posted any code, assume that code was written using the latest release version unless stated otherwise. Also, if it doesn't work on XP I can't help with that because I don't have access to XP, and I'm not going to.
Give a programmer the correct code and he can do his work for a day. Teach a programmer to debug and he can do his work for a lifetime - by Chirag Gude
How to ask questions the smart way!

I hereby grant any person the right to use any code I post, that I am the original author of, on the autoitscript.com forums, unless I've specifically stated otherwise in the code or the thread post. If you do use my code all I ask, as a courtesy, is to make note of where you got it from.

Back up and restore Windows user files _Array.au3 - Modified array functions that include support for 2D arrays.  -  ColorChooser - An add-on for SciTE that pops up a color dialog so you can select and paste a color code into a script.  -  Customizable Splashscreen GUI w/Progress Bar - Create a custom "splash screen" GUI with a progress bar and custom label.  -  _FileGetProperty - Retrieve the properties of a file  -  SciTE Toolbar - A toolbar demo for use with the SciTE editor  -  GUIRegisterMsg demo - Demo script to show how to use the Windows messages to interact with controls and your GUI.  -   Latin Square password generator

Posted (edited)

At this point that is science fiction to me (and I don't know much about science fiction yet). It would take ages really.

 

Line 583  (File "L:\autoit\scripts_date\#examples_en\Audio Visualization with GDI+  Bass\Visualization.au3"):

$aRet = DllCall($ghGDIPDll, "int", "GdipCreateLineBrushFromRect", "ptr", $pRect, "int", $iArgb1, "int", $iArgb2, "int", $LinearGradientMode, "int", $WrapMode, "int*", 0)
$aRet = DllCall(^ ERROR

Error: Variable used without being declared.

I did try to change some of it (like Melba suggested)  but had no luck in getting it to work. Still learning and looking at examples, will leave this a side. Maybe sometime in the future I would be able to get what is wrong with it.

Edited by Fr33b0w

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...