Jump to content

Get Musical Frequency


Recommended Posts

Hello all ;)

I want to do a program that analyzes a music and play it by processor's beep, getting the frequency millisecond by millisecond. My problem is get the frequency of a determinate moment of the song. I studied this script made by Andreas Karlsson that "draw the music" (like in windows media player) but I didn't understood how to get frequency.

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;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)

_AntiAlias($backbuffer, 4)
_AntiAlias($vizbuffer, 4)

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 _AntiAlias($hGraphics, $iMode)
    Local $aResult

    $aResult = DllCall($ghGDIPDll, "int", "GdipSetSmoothingMode", "hwnd", $hGraphics, "int", $iMode)
    If @error Then Return SetError(@error, @extended, False)
    Return SetError($aResult[0], 0, $aResult[0] = 0)
EndFunc   ;==>_AntiAlias

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("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_FromBeta($surface, $va1, $b1)
    _GDIPlus_GraphicsFillPolygon_FromBeta($surface, $va2, $b2)
    _GDIPlus_GraphicsFillPolygon_FromBeta($surface, $va3, $b3)
EndFunc   ;==>_Fill3DStaple


; #FUNCTION# ===================================================================================
; Name...........: _GDIPlus_GraphicsFillPolygon
; Description ...: Fill a polygon
; Syntax.........: _GDIPlus_GraphicsFillPolygon($hGraphics, $aPoints[, $hBrush = 0])
; Parameters ....: $hGraphics   - Handle to a Graphics object
;                  $aPoints     - Array that specify the vertices of the polygon:
;                  |[0][0] - Number of vertices
;                  |[1][0] - Vertice 1 X position
;                  |[1][1] - Vertice 1 Y position
;                  |[2][0] - Vertice 2 X position
;                  |[2][1] - Vertice 2 Y position
;                  |[n][0] - Vertice n X position
;                  |[n][1] - Vertice n Y position
;                  $hBrush      - Handle to a brush object that is used to fill the polygon.
;                               - If $hBrush is 0, a solid black brush is used.
; Return values .: Success      - True
;                  Failure      - False
; Author ........:
; Modified.......: smashly
; Remarks .......:
; Related .......:
; Link ..........; @@MsdnLink@@ GdipFillPolygonI
; Example .......; Yes
; ===============================================================================================
Func _GDIPlus_GraphicsFillPolygon_FromBeta($hGraphics, $aPoints, $hBrush = 0)
    Local $iI, $iCount, $pPoints, $tPoints, $aResult, $tmpError, $tmpExError

    $iCount = $aPoints[0][0]
    $tPoints = DllStructCreate("int[" & $iCount * 2 & "]")
    $pPoints = DllStructGetPtr($tPoints)
    For $iI = 1 To $iCount
        DllStructSetData($tPoints, 1, $aPoints[$iI][0], (($iI - 1) * 2) + 1)
        DllStructSetData($tPoints, 1, $aPoints[$iI][1], (($iI - 1) * 2) + 2)
    Next

    _GDIPlus_BrushDefCreate($hBrush)
    $aResult = DllCall($ghGDIPDll, "int", "GdipFillPolygonI", "hWnd", $hGraphics, "hWnd", $hBrush, _
            "ptr", $pPoints, "int", $iCount, "int", "FillModeAlternate")
    $tmpError = @error
    $tmpExError = @extended
    _GDIPlus_BrushDefDispose()
    If $tmpError Then Return SetError($tmpError, $tmpExError, False)
    Return SetError($aResult[0], 0, $aResult[0] = 0)
EndFunc   ;==>_GDIPlus_GraphicsFillPolygon_FromBeta

Can anybody help me? :evil:

By a poor Italian :evil:

p.s. Sorry for my bad english, i hope you can understand what i wrote

Link to comment
Share on other sites

Hey, that's me ;)

Saying that you wish to receive frequency is too vague to answer directly. The script I wrote for example visualize the amplitude at different frequencies in the output sound.

Here's a good read to understand what is going on and how you can use the FFT-generated data to accomplish your need.

http://www.steema.com/FFTProp/FFTProperties/FFTProperties.htm

Broken link? PM me and I'll send you the file!

Link to comment
Share on other sites

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
 Share

  • Recently Browsing   0 members

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