Bass Ton bearbeiten

  • Hallo, ich möchte einen Equalizer für mein Micro machen.
    Der soll z.B. einen Ton empfangen und ihn bearbeitet wieder geben.

    Ich hab einen Anfang obwohl das nicht einmal von mir ist ...

    Spoiler anzeigen
    [autoit]

    #include "BASS.au3"#include "BASSEXT.au3"
    OnAutoItExitRegister("_FreeBass")HotKeySet("{ESC}", "_Exit")
    _BASS_Startup()_BASS_EXT_Startup()
    _BASS_RecordInit(-1)
    $hRecord = _BASS_RecordStart(44100, 2, 0, $BASS_EXT_RecordProc)$tFFT = DllStructCreate("float[4096]")$pFFT = DllStructGetPtr($tFFT)
    While 1 _BASS_ChannelGetData($hRecord, $pFFT, $BASS_DATA_FFT8192) $fMax = 0 $fFreq = 0 ;~ hier soll der ton bearbeitet werden und wider gegeben werden. For $i = 1 To 4096 If DllStructGetData($tFFT, 1, $i) > $fMax Then $fMax = DllStructGetData($tFFT, 1, $i) $fFreq = $i * 44100 / 8190 EndIf Next ToolTip("Frequency: " & Round($fFreq, 1) & "Hz") Sleep(50)WEnd

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

    Func _Exit() ExitEndFunc ;==>_Exit
    Func _FreeBass() _BASS_RecordFree()EndFunc ;==>_FreeBass

    [/autoit]

    ich wäre für jede hilfe dankbar

    Einmal editiert, zuletzt von Shadowy (19. September 2011 um 17:13)

  • Hier ein Beispielscript eines 31-Band EQs

    Spoiler anzeigen
    [autoit]

    #include "Bass.au3"
    #include "BassExt.au3"
    #include "BassFX.au3"
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #AutoIt3Wrapper_UseX64=n

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

    Opt("GUIOnEventMode", 1)

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

    $hGui = GUICreate("31 Band EQ", 1105, 350)
    GUISetOnEvent($GUI_EVENT_CLOSE, "_Exit")

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

    _GDIPlus_Startup()
    $hGraphics = _GDIPlus_GraphicsCreateFromHWND($hGui)
    $hBmpBuffer = _GDIPlus_BitmapCreateFromGraphics(1085, 100, $hGraphics)
    $hGfxBuffer = _GDIPlus_ImageGetGraphicsContext($hBmpBuffer)
    _GDIPlus_GraphicsSetSmoothingMode($hGfxBuffer, 2)
    $hBrush = _GDIPlus_BrushCreateSolid(0xFF00FF00)

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

    _BASS_Startup()
    _BASS_FX_Startup()
    _BASS_EXT_Startup()
    _BASS_Init(0, -1, 44100, 0, "")
    _BASS_RecordInit(-1)

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

    $hStream = _BASS_StreamCreate(44100, 2, 0, $STREAMPROC_PUSH, 0)

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

    $aPipe = _BASS_EXT_StreamPipeCreate($hStream, $BASS_EXT_STREAMPROC_PUSH)
    _BASS_ChannelPlay($hStream, True)

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

    $hRecord = _BASS_RecordStart(44100, 2, 0, $BASS_EXT_RecordProc, $aPipe[0])

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

    $aFreq = StringSplit("20,25,31.5,40,50,63,80,100,125,160,200,250,315,400,500,630,800,1000,1250,1600,2000,2500,3150,4000,5000,6300,8000,10000,12500,16000,20000", ",")
    Global $aFX[$aFreq[0] + 1]
    Global $aSlider[$aFreq[0] + 1][2]

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

    $iBW = 0.5

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

    For $i = 1 To $aFreq[0]
    $aFX[$i] = _BASS_ChannelSetFX($hRecord, $BASS_FX_BFX_BQF, $i)
    _BASS_FXSetParameters($aFX[$i], $BASS_BFX_BQF_PEAKINGEQ & "|" & $aFreq[$i] & "|0|" & $iBW & "|0|0|" & $BASS_BFX_CHANALL)
    GUICtrlCreateLabel(_FormatHz($aFreq[$i]), ($i - 1) * 35 + 10, 10, 35, 20, 1)
    $aSlider[$i][0] = GUICtrlCreateSlider(($i - 1) * 35 + 10, 30, 28, 200, 10)
    $aSlider[$i][1] = GUICtrlGetHandle($aSlider[$i][0])
    GUICtrlSetLimit(-1, 150, -150)
    GUICtrlSetOnEvent(-1, "_SetEQ")
    Next

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

    $aFFT = _BASS_EXT_CreateFFT(96, 0, 0, 1085, 100, 2, True)

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

    GUIRegisterMsg($WM_VSCROLL, "WM_VSCROLL")
    GUISetState()

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

    While 1
    _GDIPlus_GraphicsClear($hGfxBuffer, 0xFF000000)
    _BASS_EXT_ChannelGetFFT($hStream, $aFFT, 6)
    If Not @error Then DllCall($ghGDIPDll, "int", "GdipFillPolygon", "handle", $hGfxBuffer, "handle", $hBrush, "ptr", $aFFT[0], "int", $aFFT[1], "int", "FillModeAlternate")
    _GDIPlus_GraphicsDrawImage($hGraphics, $hBmpBuffer, 10, 240)
    Sleep(20)
    WEnd

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

    Func _SetEQ()
    Local $iPos = GUICtrlRead(@GUI_CtrlId) / - 10
    For $i = 1 To $aFreq[0]
    If @GUI_CtrlId = $aSlider[$i][0] Then
    _BASS_FXSetParameters($aFX[$i], $BASS_BFX_BQF_PEAKINGEQ & "|" & $aFreq[$i] & "|" & $iPos & "|" & $iBW & "|0|0|" & $BASS_BFX_CHANALL)
    ToolTip($aFreq[$i] & "Hz " & $iPos & "dB")
    Return
    EndIf
    Next
    EndFunc ;==>_SetEQ

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

    Func WM_VSCROLL($hWnd, $Msg, $wParam, $lParam)
    Local $iCode = BitAND($wParam, 0x0000FFFF)
    Local $iPos = BitShift($wParam, 16) / - 10
    Local $iHi, $iLo
    If $iCode = 5 Then
    For $i = 1 To $aFreq[0]
    If $lParam = $aSlider[$i][1] Then
    _BASS_FXSetParameters($aFX[$i], $BASS_BFX_BQF_PEAKINGEQ & "|" & $aFreq[$i] & "|" & $iPos & "|" & $iBW & "|0|0|" & $BASS_BFX_CHANALL)
    ToolTip($aFreq[$i] & "Hz " & $iPos & "dB")
    Return $GUI_RUNDEFMSG
    EndIf
    Next
    EndIf
    Return $GUI_RUNDEFMSG
    EndFunc ;==>WM_VSCROLL

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

    Func _FormatHz($iHz)
    Local $ikHz = Floor($iHz / 1000)
    If $ikHz > 0 Then
    $iHz = Mod($iHz, 1000)
    Return $ikHz & "k" & StringReplace($iHz, "0", "")
    Else
    Return $iHz
    EndIf
    EndFunc ;==>_FormatHz

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

    Func _Exit()
    _BASS_RecordFree()
    _BASS_StreamFree($hStream)
    _GDIPlus_BrushDispose($hBrush)
    _GDIPlus_GraphicsDispose($hGfxBuffer)
    _GDIPlus_BitmapDispose($hBmpBuffer)
    _GDIPlus_GraphicsDispose($hGraphics)
    _GDIPlus_Shutdown()
    Exit
    EndFunc ;==>_Exit

    [/autoit]

    Das Ergebnis klingt jedoch nicht ganz sauber.
    Man müsste einen größeren Buffer verwenden, aber dann steigt die Latenz!
    Oder man verwendet BassAsio - dazu muss die Soundkarte jedoch einen Asiotreiber haben...
    Ein Beispiel zu Asio findest du in der Bass-Hilfe unter "_BASS_ASIO_ChannelEnable" - _BASS_ChannelSetFX kann dort genauso angewendet werden, wie hier.

    E

  • Interessante Sache mit dem Equalizer !

    Wie definiere ich in dem Beispiel von eukalyptus den Ein- und Ausgang ?
    Ich finde einfach keinen Anhaltspunkt.... :(

    Zur Nutzung dieses Forum's, ist ein Übersetzer für folgende Begriffe unerlässlich:

    "On-Bort, weier, verscheiden, schädliges, Butten steyling, näckstet, Parr, Porblem, scripe, Kompletenz, harken, manuel zu extramieren, geckukt, würglich, excell, acces oder Compilevorgeng"