komplexer Synthesizer (Bass.dll)

  • Hi

    Ich habe mal begonnen mich mit der Generierung von Wellenformen (Sinus, Rechteck usw...) und Filter zu beschäftigen.
    Dann bin ich reingekippt und dieser Synthesizer ist entstanden:

    Der Inhalt kann nicht angezeigt werden, da er nicht mehr verfügbar ist.

    Demnächst werde ich das Ding komplett neu schreiben, da die CPU-Auslastung einfach viel zu hoch ist.
    Ich hab einfach zu sehr um den heißen Brei herumprogrammiert :D
    Trotzdem hier mal diese Version, welche (abgesehen von ein paar bugs) ganz gut funktioniert - finde ich

    Läuft nur unter 32bit!

    Falls sich jemand mit Synthesizern auskennt, würde ich mich über neue Presets freuen, bzw über gewünschte Features die ich in die neue Version einbauen soll.
    Geplant hab ich mal 3 OSC´s, FM und Apreggiator

    Die BassSynth.dll, die die eigentlichen Berechnungen durchführt, ist in Lazarus programmiert

    Steuerung mit Tastatur:

    Code
    2 3   5 6 7   9 0
    Q W E R T Z U I O P
     S D   G H J
    Y X C V B N M


    Der Synthesizer kann auch über ein angeschlossenes Midikeyboard gespielt werden

    Ich verwende die Schriftart Tahoma - ich hoffe, daß diese auf allen euren Systemen vorhanden ist, sonst passt die grafische Darstellung nicht...

    Na dann
    Viel Spaß!

    E

  • Du haust hier ein geiles Script nach dem anderen raus 8| .
    Ich bin wirklich sehr beeindruckt. Das einzige, was mir nicht gefällt ist die Steuerung der Drehknöpfe ^^.
    Ich hätte es eher so gemacht:

    Spoiler anzeigen
    [autoit]

    #include <GDIPlus.au3>
    #include <GUIConstants.au3>
    #include <Misc.au3>

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

    Opt("GUIOnEventMode", 1)

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

    Global Const $Pi_Div_180 = ACos(-1) / 180
    $vU32Dll = DllOpen("User32.dll")

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

    $iGUIColorBG = 0xFFFFFFFF
    $iGUIWidth = 400
    $iGUIHeight = 400
    $FPS = 40

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

    $iRadiusButton = 60
    $iRadiusPoint = 40

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

    $vButton_Middle = _Vector_Create(200, 200)
    $vButton_Point = _Vector_Create(200, 160)

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

    $vNegativeYAxis = _Vector_Create(0, -1)
    $iAngle = 0

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

    $hWnd = GUICreate("Test", $iGUIWidth, $iGUIHeight)
    GUISetState()

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

    _GDIPlus_Startup()

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

    $hGraphic = _GDIPlus_GraphicsCreateFromHWND($hWnd)
    $hBitmap = _GDIPlus_BitmapCreateFromGraphics($iGUIWidth, $iGUIHeight, $hGraphic)
    $hBuffer = _GDIPlus_ImageGetGraphicsContext($hBitmap)
    _GDIPlus_GraphicsSetSmoothingMode($hBuffer, 2)

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

    $hFormat_Text = _GDIPlus_StringFormatCreate()
    $hFamily_Text = _GDIPlus_FontFamilyCreate("Arial")
    $hFont_Text = _GDIPlus_FontCreate($hFamily_Text, 15)

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

    $hPen_Button = _GDIPlus_PenCreate(0xFF000000, 2)
    $hBrush_Point = _GDIPlus_BrushCreateSolid(0xFF000000)
    $hBrush_Text = _GDIPlus_BrushCreateSolid(0xFF0000FF)

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

    GUISetOnEvent($GUI_EVENT_CLOSE, "_Exit")
    AdlibRegister("_DrawFrame", Round(1000 / $FPS))

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

    $bMouseClick = False

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

    While Sleep(1000)
    WEnd

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

    Func _DrawFrame()
    If _IsPressed("01", $vU32Dll) Then
    $aCursorInfo = GUIGetCursorInfo($hWnd)
    If $bMouseClick Or _PointIsInCircle($aCursorInfo[0], $aCursorInfo[1], DllStructGetData($vButton_Middle, "X"), DllStructGetData($vButton_Middle, "Y"), $iRadiusButton) Then
    $vDirection = _Vector_Normalize(_Vector_Create($aCursorInfo[0] - DllStructGetData($vButton_Middle, "X"), $aCursorInfo[1] - DllStructGetData($vButton_Middle, "Y")))

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

    DllStructSetData($vButton_Point, "X", DllStructGetData($vButton_Middle, "X") + DllStructGetData($vDirection, "X") * $iRadiusPoint)
    DllStructSetData($vButton_Point, "Y", DllStructGetData($vButton_Middle, "Y") + DllStructGetData($vDirection, "Y") * $iRadiusPoint)

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

    $iAngle = _Vector_GetAngle($vDirection, $vNegativeYAxis)
    If DllStructGetData($vDirection, "X") < 0 Then $iAngle = 360 - $iAngle

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

    $bMouseClick = True
    EndIf
    Else
    If $bMouseClick Then $bMouseClick = False
    EndIf

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

    $aLayout_Text = _GDIPlus_GraphicsMeasureString($hBuffer, Round($iAngle, 2), $hFont_Text, _GDIPlus_RectFCreate(0, 270), $hFormat_Text)
    DllStructSetData($aLayout_Text[0], "X", 200 - DllStructGetData($aLayout_Text[0], "Width") / 2)

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

    _GDIPlus_GraphicsClear($hBuffer, $iGUIColorBG)
    _GDIPlus_GraphicsDrawStringEx($hBuffer, Round($iAngle, 2), $hFont_Text, $aLayout_Text[0], $hFormat_Text, $hBrush_Text)
    _GDIPlus_GraphicsDrawEllipse($hBuffer, DllStructGetData($vButton_Middle, "X") - $iRadiusButton, DllStructGetData($vButton_Middle, "Y") - $iRadiusButton, $iRadiusButton * 2, $iRadiusButton * 2, $hPen_Button)
    _GDIPlus_GraphicsFillEllipse($hBuffer, DllStructGetData($vButton_Point, "X") - 3, DllStructGetData($vButton_Point, "Y") - 3, 6, 6, $hBrush_Point)
    _GDIPlus_GraphicsDrawImageRect($hGraphic, $hBitmap, 0, 0, $iGUIWidth, $iGUIHeight)
    EndFunc ;==>_DrawFrame

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

    Func _Exit()
    _GDIPlus_GraphicsDispose($hGraphic)
    _GDIPlus_GraphicsDispose($hBuffer)
    _GDIPlus_BitmapDispose($hBitmap)
    _GDIPlus_PenDispose($hPen_Button)
    _GDIPlus_BrushDispose($hBrush_Point)
    _GDIPlus_BrushDispose($hBrush_Text)
    _GDIPlus_StringFormatDispose($hFormat_Text)
    _GDIPlus_FontFamilyDispose($hFamily_Text)
    _GDIPlus_FontDispose($hFont_Text)
    _GDIPlus_Shutdown()
    DllClose($vU32Dll)
    Exit
    EndFunc ;==>_Exit

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

    Func _Vector_GetAngle($vVector1, $vVector2)
    $nScalarProduct = DllStructGetData($vVector1, "X") * DllStructGetData($vVector2, "X") + DllStructGetData($vVector1, "Y") * DllStructGetData($vVector2, "Y")
    $nVector1_Length = Sqrt(DllStructGetData($vVector1, "X") ^ 2 + DllStructGetData($vVector1, "Y") ^ 2)
    $nVector2_Length = Sqrt(DllStructGetData($vVector2, "X") ^ 2 + DllStructGetData($vVector2, "Y") ^ 2)

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

    Return ACos($nScalarProduct / ($nVector1_Length * $nVector2_Length)) / $Pi_Div_180
    EndFunc ;==>_Vector_GetAngle

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

    Func _Vector_Normalize($vNorm)
    Local $vReturn = DllStructCreate("float X;float Y")

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

    $nVectorLength = Sqrt(DllStructGetData($vNorm, "X") ^ 2 + DllStructGetData($vNorm, "Y") ^ 2)
    If $nVectorLength Then
    DllStructSetData($vReturn, "X", DllStructGetData($vNorm, "X") / $nVectorLength)
    DllStructSetData($vReturn, "Y", DllStructGetData($vNorm, "Y") / $nVectorLength)
    Else
    DllStructSetData($vReturn, "X", 0)
    DllStructSetData($vReturn, "Y", 0)
    EndIf

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

    Return $vReturn
    EndFunc ;==>_Vector_Normalize

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

    Func _Vector_RotateOnZAxis($vRotate, $iDegree)
    Local $vReturn = DllStructCreate("float X;float Y")

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

    DllStructSetData($vReturn, "X", DllStructGetData($vRotate, "X") * _Cos($iDegree) - DllStructGetData($vRotate, "Y") * _Sin($iDegree))
    DllStructSetData($vReturn, "Y", DllStructGetData($vRotate, "Y") * _Cos($iDegree) + DllStructGetData($vRotate, "X") * _Sin($iDegree))

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

    Return $vReturn
    EndFunc ;==>_Vector_RotateOnZAxis

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

    Func _Vector_ProjectVector($vProject1, $vProject2)
    Local $vReturn = DllStructCreate("float X;float Y")

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

    $ScalarProduct = DllStructGetData($vProject1, "X") * DllStructGetData($vProject2, "X") + DllStructGetData($vProject1, "Y") * DllStructGetData($vProject2, "Y")
    DllStructSetData($vReturn, "X", ($ScalarProduct / (DllStructGetData($vProject1, "X") * DllStructGetData($vProject1, "Y") + DllStructGetData($vProject2, "X") * DllStructGetData($vProject1, "Y"))) * DllStructGetData($vProject2, "X"))
    DllStructSetData($vReturn, "Y", ($ScalarProduct / (DllStructGetData($vProject1, "X") * DllStructGetData($vProject1, "Y") + DllStructGetData($vProject2, "X") * DllStructGetData($vProject1, "Y"))) * DllStructGetData($vProject2, "Y"))

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

    Return $vReturn
    EndFunc ;==>_Vector_ProjectVector

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

    Func _Vector_GetLength($vLength)
    Return Sqrt(DllStructGetData($vLength, "X") ^ 2 + DllStructGetData($vLength, "Y") ^ 2)
    EndFunc ;==>_Vector_GetLength

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

    Func _Vector_Create($nXValue, $nYValue)
    Local $vReturn = DllStructCreate("float X;float Y")

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

    DllStructSetData($vReturn, "X", $nXValue)
    DllStructSetData($vReturn, "Y", $nYValue)

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

    Return $vReturn
    EndFunc ;==>_Vector_Create

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

    Func _Cos($nValue)
    Return Cos($nValue * $Pi_Div_180)
    EndFunc ;==>_Cos

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

    Func _Sin($nValue)
    Return Sin($nValue * $Pi_Div_180)
    EndFunc ;==>_Sin

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

    Func _Tan($nValue)
    Return Tan($nValue * $Pi_Div_180)
    EndFunc ;==>_Tan

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

    Func _PointIsInCircle($iX_Point, $iY_Point, $iX_Circle, $iY_Circle, $iRadius_Circle)
    $iDistPoints = _GetPointsDistance($iX_Point, $iY_Point, $iX_Circle, $iY_Circle)
    If ($iRadius_Circle > 0 And $iDistPoints < $iRadius_Circle) Or ($iRadius_Circle < 0 And $iDistPoints > $iRadius_Circle) Or $iDistPoints = 0 Then Return 1
    Return 0
    EndFunc ;==>_PointIsInCircle

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

    Func _GetPointsDistance($iPointX1, $iPointY1, $iPointX2, $iPointY2)
    Return Sqrt(($iPointX1 - $iPointX2) ^ 2 + ($iPointY1 - $iPointY2) ^ 2)
    EndFunc ;==>_GetPointsDistance

    [/autoit]
  • Wow, das heut mich ja glatt aus den Socken ^^. Funktioniert alles perfekt, außer das du den falschen Standart-Output oder so anscheinend hast, weil ich keinen Sound höre :D .

    Nur keine Hektik - das Leben ist stressig genug

  • Ups! Ich hab tatsächlich vergessen eine Soundkartenauswahl zu machen! :whistling:
    Muß man derzeit bei

    [autoit]

    _BASS_Init(0, -1, 44100)

    [/autoit]

    (mitleren Wert verändern) manuell einstellen...
    -1 = Standart Soundkarte
    1 = erster Ausgang / Soundkarte
    2 = zweiter
    usw...

    meistens sollte -1 aber funktionieren!

  • Ich bin immerwieder beeintruckt was man alles mit AutoIt machen kann ... ein wirklich Geniales Script mit einer geilen Oberfläche!!! Respekt!! Hat sicherlich lange gedauert.

  • Klasse :thumbup: , das haut mich jetzt um 8o
    auf jeden Fall ein 1000%iges THUMBS UP! :thumbup:

    "Je mehr Käse, desto mehr Löcher; je mehr Löcher, desto weniger Käse. Ergo: Je mehr Käse, desto weniger Käse. 8| "
    "Programmers never die: they just GOSUB without RETURN"
    "I tried to change the world but I couldn't find the source code."

    Einmal editiert, zuletzt von Developer30 (15. Mai 2011 um 15:35)

  • Ist zwar schon ziemlich alt der Thread, aber ich muss einfach mein Kompliment an den Coder los werden. es ist einfach unglaublich was mit AutoIt alles möglich ist. und das dieses Script auch noch so reibungslos funktioniert, ist einfach unfassbar. mit diesem quellcode habe ich noch einige zeit zu tun, um mir da einige methoden ab zu schauen.

    Ich programiere jetzt seit etwa ein einhalb jahre mit Autoit, aber sowas ist mir noch nicht untergekommen. solche synthesiser programme kosten doch sonst richtig schotter. oder? RESPEKT!!! :thumbup:


    Gruß DJBeatstar :rock: