Hallo!
Ich habe mir in den letzten Tagen erfolgreich ein USB2DMX-Interface gebaut (Arduino ftw). Das funktioniert soweit auch, sogar über ein offenes Protokoll (miniDMX). So lässt sich mein Interface auch mit DMXControl oder Freestyler nutzen. Nur gefallen mir die dortigen Umsetzungen des Sound2Light-Modus nicht. Daher dachte ich: Okay, COM-UDF und Bass.au3, alles selber schreiben. Der Teil AutoIt -> DMX funktioniert auch, ich kann über die COM-UDF mein Interface einwandfrei ansprechen usw... Nur bei der Beat-Erkennung durch die Bass-UDF hapert es ein wenig. Um keine unnötige Abhängigkeit zu einem bestimmten Player zu erzeugen, wollte ich über _BASS_Record... die aktuelle Ausgabe abfangen. Bei Realtek-Chips gibt es dafür ja das "Stereomix-Aufnahmegerät". In einem anderen Projekt hat die Echtzeit-Darstellung der Wellenform mittels _BASS_EXT_ChannelGetWaveformEx auch schon einwandfrei geklappt. Auch die Beat-Erkennung mittels _BASS_FX_BPM_BeatCallbackSet funktioniert, wenn ich zuvor einen Stream aus einer Datei erstelle.
Jetzt kommt das Problem: In Kombination, also _BASS_Record... und _BASS_FX_BPM_BeatCallbackSet, geht leider überhaupt nichts mehr. Die Bass-Funktionen schmeißen zwar keinen Fehler, aber Beats werden auch nicht mehr erkannt. Entweder habe ich ein gewaltiges Brett vor'm Kopf oder irgendwas anderes stimmt hier nicht. Vielleicht erkennt ja einer von euch den Fehler im untenstehenden Testskript... Oder kennt womöglich noch eine alternative Lösung für mein Anliegen.
#AutoIt3Wrapper_UseX64=n
#include "Bass.au3"
#include "BassFX.au3"
;~ $ghGDIPDLL = $__g_hGDIPDLL
OnAutoItExitRegister("_FreeBass")
[/autoit][autoit][/autoit][autoit]HotKeySet("{ESC}", "_Exit")
[/autoit][autoit][/autoit][autoit][/autoit][autoit]_BASS_Startup()
___DeBug(@error, "load bass.dll")
_BASS_FX_Startup()
___DeBug(@error, "load bassfx.dll")
_BASS_Init(0)
___DeBug(@error, "bass init")
;~ $sFile = FileOpenDialog("Open...", "..\audiofiles", "playable formats (*.MP3;*.MP2;*.MP1;*.OGG;*.WAV;*.AIFF;*.AIF)")
;~ ___Debug($sFile = "", $sFile)
;~ $hStream = _BASS_StreamCreateFile(False, $sFile, 0, 0, 0)
_BASS_RecordInit(0)
$hStream = _BASS_RecordStart(44100, 2, 0);, $BASS_EXT_RecordProc)
___DeBug(@error, "create file stream")
[/autoit][autoit][/autoit][autoit][/autoit][autoit]_BASS_FX_BPM_BeatCallbackSet($hStream, "_BPMBEATPROC", 0)
;~ ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : _BASS_FX_BPM_BeatCallbackSet($hStream, "_BPMBEATPROC", 0) = ' & _BASS_FX_BPM_BeatCallbackSet($hStream, "_BPMBEATPROC", 0) & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console
___DeBug(@error, "set BPM Beat callback")
_BASS_ChannelPlay($hStream, True)
[/autoit][autoit][/autoit][autoit]While _BASS_ChannelIsActive($hStream)
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)
___DeBug(@error, "free stream")
_BASS_Free()
___DeBug(@error, "free bass")
EndFunc ;==>_FreeBass
Func ___DeBug($iError, $sAction)
Switch $iError
Case -1
ConsoleWrite(@CRLF & "-" & $sAction & @CRLF)
Case -2
ConsoleWrite(@CRLF & ">" & $sAction & @CRLF)
Case 0
ConsoleWrite(@CRLF & "+" & $sAction & " - OK" & @CRLF)
Case Else
ConsoleWrite(@CRLF & "!" & $sAction & " - FAILED, @error: " & $iError & @CRLF)
Exit
EndSwitch
EndFunc ;==>___DeBug
Es handelt sich hier um eine Modifikation von "_BASS_FX_BPM_BeatCallbackSet.au3" aus dem Beispielverzeichnis der Bass-UDF.
Ggf. muss in Zeile 25 das Aufnahmegerät angepasst werden, die Bass-UDF wird ja hoffentlich vorhanden sein.
Lieben Gruß
chess