Vielleicht ist "herausfiltern" etwas irreführend, es soll natürlich herauslöschen heißen ![]()
Beiträge von eukalyptus
-
-
Hi
Auf manchen CD-Playern gibt es eine Karaoke Funktion, welche die Stimme aus einem Lied herausfiltern soll.
Das Geheimnis dahinter ist, daß einfach der linke Kanal phasengedreht zum rechten Kanal gemischt wird.
Somit löschen sich alle Anteile der Musik aus, die genau in der Mitte liegen, also im rechten und linken Kanal genau gleich sind - und das ist in der Regel die Stimme.Dieses Beispielscript zeigt, wie man das mit der Bass.dll machen kann:
Der Inhalt kann nicht angezeigt werden, da er nicht mehr verfügbar ist. Diese Methode funktioniert natürlich nicht bei jedem Musikstück gleich gut und bei Mono-Files kommt nur Stille raus
Ich hab ein kurzes Musikstück dazugepackt, wo es eigentlich ganz gut klappt...viel Spaß
-
So sollte es funktionieren:
[autoit]Global $iPid = 0
[/autoit][autoit][/autoit][autoit]While 1
[/autoit]
If Not $iPid Or Not ProcessExists($iPid) Then
$iPid = Run("notepad.exe")
ProcessWait($iPid)
EndIf
Sleep(100)
WEndAllerdings muß das entsprechende Programm das erste mal auch von diesem Script aus gestartet werden...
mfgE
-
Neue Version
Nun geht auch das Versenden von DllStructs.
Bisher wurde nur der Pointer verschickt.
Nun werden alle benötigten Daten (PID, Pointer, Structtype) verschickt und im Empfängerscript eine equivalente DllStruct erstellt.
Die in der Struct enthaltene Datenmenge spielt dabei keine Rolle.E
-
Mit dieser UDF kann man ganz einfach Variablen zwischen mehreren verschiedenen Autoitprogrammen austauschen.
Die Beispiele sind hoffentlich selbsterklärend und ich spare mir jetzt mal eine Beschreibung...
Am besten als EXE kompilieren und beide Scripte eines Beispiels starten.Ich konnte das bisher nur auf einem Rechner mit Win_XP testen - hoffentlich funktioniert das auch auf anderen Systemen.
Verbesserungen, Einwände, Praxistauglichkeitsfeedbacks oder sonstige Kommentare sind natürlich herzlich Willkommen.
E
EDIT:
Nun kann man auch DllStructs verschicken.Die Variablen werden zunächst in Strings umgewandelt, dann verschickt und im Empfängerscript wieder zurückverwandelt.
Da dies bei großen Datenmengen (sehr lange Strings/Binaries oder große Arrays) natürlich Zeit beansprucht, ist die beste Variante das Versenden von DLLStructs.
Bei DLLStructs werden nur PID,Pointer & StructType verschickt und dann ausgelesen, dabei ist es egal wie groß die enthaltene Datenmenge ist.
Siehe Beispiel 3 -
Wie tausche ich Variablen / Strings zwischen 2 Scripten aus
Da die Frage immer wieder mal gestellt wird, hab ich mal 2 Beispiele geschrieben
Beispiel 1
Hier wird vom Hauptscript ein zweites Script (EXE) gestartet und dann via StdIn / StdOut Daten ausgetauscht.Vorteile:
Benötigt kein GUI.
Zielscript kann quasi nicht verwechselt werden (siehe Nachteile Beispiel 2)Nachteile:
Empfänger muß ständig auf neue Daten prüfen.
Script2.exe MUSS von Script1 aus via Run gestartet werden.Script_1.au3:
Spoiler anzeigen
[autoit]#include <Constants.au3>
[/autoit] [autoit][/autoit] [autoit]
#include <GUIConstantsEx.au3>Global $hPid = 0, $sStdOut = ""
[/autoit] [autoit][/autoit] [autoit]$hGui = GUICreate("Script 1", 200, 225, @DesktopWidth / 2 - 250, @DesktopHeight / 2 - 112)
[/autoit] [autoit][/autoit] [autoit]
$hEdit = GUICtrlCreateEdit("Script 1 Test Text", 10, 10, 180, 150)
$hButtonStart = GUICtrlCreateButton("Start Script 2", 10, 170, 85, 20)
$hButtonStop = GUICtrlCreateButton("Stop Script 2", 105, 170, 85, 20)
$hButtonSend = GUICtrlCreateButton("Send Edit to Script 2", 10, 195, 180, 20)
GUISetState()While 1
[/autoit]
$msg = GUIGetMsg()
Switch $msg
Case $GUI_EVENT_CLOSE
If $hPid Then ProcessClose($hPid)
Exit
Case $hButtonStart
$hPid = Run(@ScriptDir & "\Script_2.exe", @ScriptDir, @SW_SHOW, BitOR($STDIN_CHILD, $STDOUT_CHILD))
Case $hButtonStop
ProcessClose($hPid)
$hPid = 0
Case $hButtonSend
StdinWrite($hPid, GUICtrlRead($hEdit))
EndSwitch
If $hPid Then
$sStdOut = StdoutRead($hPid)
If @error Then $hPid = 0
If $sStdOut Then GUICtrlSetData($hEdit, $sStdOut)
EndIf
WEndScript_2.au3:
Spoiler anzeigen
[autoit]#include <GUIConstantsEx.au3>
[/autoit] [autoit][/autoit] [autoit]Global $sStdIn = ""
[/autoit] [autoit][/autoit] [autoit]$hGui = GUICreate("Script 2", 200, 225, @DesktopWidth / 2 + 50, @DesktopHeight / 2 - 112)
[/autoit] [autoit][/autoit] [autoit]
$hEdit = GUICtrlCreateEdit("Script 2 Test Text", 10, 10, 180, 175)
$hButtonSend = GUICtrlCreateButton("Send Edit to Script 1", 10, 195, 180, 20)
GUISetState()While 1
[/autoit]
$msg = GUIGetMsg()
Switch $msg
Case $GUI_EVENT_CLOSE
Exit
Case $hButtonSend
ConsoleWrite(GUICtrlRead($hEdit))
EndSwitch
$sStdIn = ConsoleRead()
If $sStdIn Then GUICtrlSetData($hEdit, $sStdIn)
WEndBeispiel 2
Datenaustausch via SendMessageVorteile:
Der Empfänger muß nicht ständig auf neue Daten überprüfen.
Die Scripte können unabhängig voneinader gestartet werden.Nachteile:
Setzt ein GUI voraus.
Das Zielscript wird über WinTitle definiert, d.h. wenn mehrere Fenster mit dem gleichen Title existieren, dann kann es zu Verwechsulngen kommen. (Also eindeutige Fentertitel wählen)Script_1.au3:
Spoiler anzeigen
[autoit]#include <GUIConstantsEx.au3>
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
#include <WindowsConstants.au3>$hGui = GUICreate("Script 1", 200, 225, @DesktopWidth / 2 - 250, @DesktopHeight / 2 - 112)
[/autoit] [autoit][/autoit] [autoit]
$hEdit = GUICtrlCreateEdit("Script 1 Test Text", 10, 10, 180, 175)
$hButtonSend = GUICtrlCreateButton("Send Edit to Script 2", 10, 195, 180, 20)
GUISetState()GUIRegisterMsg($WM_COPYDATA, '_MY_WM_COPYDATA')
[/autoit] [autoit][/autoit] [autoit]While 1
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
$msg = GUIGetMsg()
Switch $msg
Case $GUI_EVENT_CLOSE
Exit
Case $hButtonSend
_SendCopyDataString($hGui, WinGetHandle("Script 2"), GUICtrlRead($hEdit))
EndSwitch
WEndFunc _SendCopyDataString($My_Hwnd, $Scite_hwnd, $sCmd) ; by Prog@ndy
[/autoit] [autoit][/autoit] [autoit]
Local $CmdStruct = DllStructCreate('Char[' & StringLen($sCmd) + 1 & ']')
DllStructSetData($CmdStruct, 1, $sCmd)
Local $COPYDATA = DllStructCreate('Ptr;DWord;Ptr')
DllStructSetData($COPYDATA, 1, 1)
DllStructSetData($COPYDATA, 2, StringLen($sCmd) + 1)
DllStructSetData($COPYDATA, 3, DllStructGetPtr($CmdStruct))
DllCall('User32.dll', 'None', 'SendMessage', 'HWnd', $Scite_hwnd, 'Int', $WM_COPYDATA, 'HWnd', $My_Hwnd, 'Ptr', DllStructGetPtr($COPYDATA))
EndFunc ;==>_SendCopyDataStringFunc _MY_WM_COPYDATA($hWnd, $msg, $wParam, $lParam) ; by Prog@ndy
[/autoit]
Local $Temp = ""
Local $COPYDATA = DllStructCreate('Ptr;DWord;Ptr', $lParam)
Local $COPYDATA_StringLen = DllStructGetData($COPYDATA, 2)
Local $CmdStruct = DllStructCreate('Char[' & $COPYDATA_StringLen & ']', DllStructGetData($COPYDATA, 3))
$COPYDATA_String = StringLeft(DllStructGetData($CmdStruct, 1), $COPYDATA_StringLen)
GUICtrlSetData($hEdit, $COPYDATA_String)
EndFunc ;==>_MY_WM_COPYDATAScript_2.au3:
Spoiler anzeigen
[autoit]#include <GUIConstantsEx.au3>
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
#include <WindowsConstants.au3>$hGui = GUICreate("Script 2", 200, 225, @DesktopWidth / 2 + 50, @DesktopHeight / 2 - 112)
[/autoit] [autoit][/autoit] [autoit]
$hEdit = GUICtrlCreateEdit("Script 2 Test Text", 10, 10, 180, 175)
$hButtonSend = GUICtrlCreateButton("Send Edit to Script 1", 10, 195, 180, 20)
GUISetState()GUIRegisterMsg($WM_COPYDATA, '_MY_WM_COPYDATA')
[/autoit] [autoit][/autoit] [autoit]While 1
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
$msg = GUIGetMsg()
Switch $msg
Case $GUI_EVENT_CLOSE
Exit
Case $hButtonSend
_SendCopyDataString($hGui, WinGetHandle("Script 1"), GUICtrlRead($hEdit))
EndSwitch
WEndFunc _SendCopyDataString($My_Hwnd, $Scite_hwnd, $sCmd) ; by Prog@ndy
[/autoit] [autoit][/autoit] [autoit]
Local $CmdStruct = DllStructCreate('Char[' & StringLen($sCmd) + 1 & ']')
DllStructSetData($CmdStruct, 1, $sCmd)
Local $COPYDATA = DllStructCreate('Ptr;DWord;Ptr')
DllStructSetData($COPYDATA, 1, 1)
DllStructSetData($COPYDATA, 2, StringLen($sCmd) + 1)
DllStructSetData($COPYDATA, 3, DllStructGetPtr($CmdStruct))
DllCall('User32.dll', 'None', 'SendMessage', 'HWnd', $Scite_hwnd, 'Int', $WM_COPYDATA, 'HWnd', $My_Hwnd, 'Ptr', DllStructGetPtr($COPYDATA))
EndFunc ;==>_SendCopyDataStringFunc _MY_WM_COPYDATA($hWnd, $msg, $wParam, $lParam) ; by Prog@ndy
[/autoit]
Local $Temp = ""
Local $COPYDATA = DllStructCreate('Ptr;DWord;Ptr', $lParam)
Local $COPYDATA_StringLen = DllStructGetData($COPYDATA, 2)
Local $CmdStruct = DllStructCreate('Char[' & $COPYDATA_StringLen & ']', DllStructGetData($COPYDATA, 3))
$COPYDATA_String = StringLeft(DllStructGetData($CmdStruct, 1), $COPYDATA_StringLen)
GUICtrlSetData($hEdit, $COPYDATA_String)
EndFunc ;==>_MY_WM_COPYDATAEigentlich werden bei beiden Beispielen nur Strings übertragen.
Um nun tatsächlich Variablen zu senden, könnte man mit DllStructCreate ein Struct erstellen und den Pointer mit oben genannten Methoden verschicken...
Bei Bedarf kann ich auch hierfür ein Beispielscript schreiben!Viel Erfolg
E -
Hmm - Welches Betriebssystem hast du?
-
Schau dir mal StdOutRead & Co an:
[ offen ] consolewrite and read -
Erstmal Danke für die Lorbeeren!
Wie ich bereits sagte ist das Script noch nicht spielbar.
Z.B. darf der Spieler die Z-Achse nicht beeinflussen; - Der Stein fällt von selber nach hinten.
Damit erübrigt sich dann auch das Problem, daß man die Steine ineinanderpacken kann.
Beim Rotieren fehlt noch die Kollisionsabfrage mit anderen Steinen...usw.Schwierigkeitsgrade werden so aussehen:
Man kann einstellen, wie groß das SPielfeld sein soll ( 3x3x6 -7x7x18 )
Es gibt 3 unterschiedliche Steinmodi (Flat, Basic, Extended)
Je höher das Level, desto schneller fällt der Stein
schwierigere Levels starten schon mit einer zufälligen Anordnung von SteinenIm Prinzip genauso wie das herkömmliche Tetris.
Die Jüngeren kennen wahrscheinlich das Original aus dem Jahre 1989 nicht.
Hier ein Screenshot:
Der Inhalt kann nicht angezeigt werden, da er nicht mehr verfügbar ist. E
-
Vielleicht hilft dir _WinAPI_SetLayeredWindowAttributes weiter.
-
Hi
Mit den GDI+ Path Funktionen kann man ein paar ganz tolle Sachen machen.
Und da mich der 3D-Tunnel (GDI+ 3D-Tunnel) an Blockout erinnert hat, habe ich mal versucht das umzusetzen.Ist NICHT wirklich spielbar, da fehlt noch einiges...
Mit den Cursortasten bewegt man den Stein in X/Y-Richtung
Mit Enter und Backspace in Z-Richtung
Die Tasten QAWSED lassen den Stein rotieren
Und mit der Leertaste lässt man ihn nach hinten fallenDer Inhalt kann nicht angezeigt werden, da er nicht mehr verfügbar ist. folgende Includes werden benötigt:
Der Inhalt kann nicht angezeigt werden, da er nicht mehr verfügbar ist.
Der Inhalt kann nicht angezeigt werden, da er nicht mehr verfügbar ist. Mal sehen, ob ich irgendwann mal Lust habe ein fertiges Spiel daraus zu machen
viel Spaß
E
-
Falls es nur um 1D-Arrays geht und auch kein Index benötigt wird (also $aArray[0]=Anzahl der Einträge)
[autoit]
dann ist folgendes am schnellsten:Func _ArrayUnique_($aA)
[/autoit]
Local $aR, $oD = ObjCreate('Scripting.Dictionary')
For $i = 0 To UBound($aA) - 1
If Not $oD.Exists($aA[$i]) Then $oD.Add($aA[$i], 0)
Next
$aR = $oD.Keys()
Return $aR
EndFunc -
Yeeaahh!
Gefällt mir sehr gut! -
Hab das Script komplett überarbeitet.
Geschwindigkeit kann mit dem Mausrad geregelt werden und es gibt zusätzlich Würfel, die auf einen zufliegen.
Dafür hab ich momentan die Farbänderung herausgenommen...E
-
Hi
Eine weitere GDI+ Spielerei von mir:
Der Inhalt kann nicht angezeigt werden, da er nicht mehr verfügbar ist. Das Tunnelende kann mit der Maus bewegt werden.
Und die Geschwindigkeit wird mit dem Mousewheel geregelt.folgende Includes werden benötigt:
Der Inhalt kann nicht angezeigt werden, da er nicht mehr verfügbar ist.
Der Inhalt kann nicht angezeigt werden, da er nicht mehr verfügbar ist. Viel Spaß
-
Hi
Viell. hilft dir das: http://web.slzm.de/blog/programmi…uch-episode-ii/
und auch das: http://translation.autoit.de/autoitinfo/hil…nd-24_03_10.zipDes weiteren ist es sehr hilfreich die "große" Version von Scite zu installieren: http://www.autoitscript.com/cgi-bin/getfil…iTE4AutoIt3.exe
mfgE
-
Du wirst doch wohl irgendwo eine CD herumliegen haben

-
Ich hab für einen Freund ein kurzes Script erstellt, welches eine Wav-Datei mit verschiedenen Encodern (Fraunhofer, Lame, Blade, Xing und Gogo) in MP3s (96,128,320 kbit/s) umwandelt .
Und das will ich auch euch nicht vorenthalten:Spoiler anzeigen
[autoit]$sFile = FileOpenDialog("Wähle .wav-Datei", @ScriptDir, "(*.wav)")
[/autoit] [autoit][/autoit] [autoit]
If @error Or Not $sFile Or Not FileExists($sFile) Then
MsgBox(0, "ERROR", ".Wav-Datei nicht gefunden!")
Exit
EndIf_Encode("Encoder: Gogo - 96 kBit/s", @ScriptDir & '\Encoders\gogo.exe -b 96 -m j "' & $sFile & '" "' & @ScriptDir & '\96_gogo.mp3"')
[/autoit] [autoit][/autoit] [autoit]
_Encode("Encoder: Gogo - 128 kBit/s", @ScriptDir & '\Encoders\gogo.exe -b 128 -m j "' & $sFile & '" "' & @ScriptDir & '\128_gogo.mp3"')
_Encode("Encoder: Gogo - 320 kBit/s", @ScriptDir & '\Encoders\gogo.exe -b 320 -m j "' & $sFile & '" "' & @ScriptDir & '\320_gogo.mp3"')_Encode("Encoder: Lame - 96 kBit/s", @ScriptDir & '\Encoders\lame.exe -mj -q0 --cbr -b96 "' & $sFile & '" "' & @ScriptDir & '\96_lame.mp3"')
[/autoit] [autoit][/autoit] [autoit]
_Encode("Encoder: Lame - 128 kBit/s", @ScriptDir & '\Encoders\lame.exe -mj -q0 --cbr -b128 "' & $sFile & '" "' & @ScriptDir & '\128_lame.mp3"')
_Encode("Encoder: Lame - 320 kBit/s", @ScriptDir & '\Encoders\lame.exe -mj -q0 --cbr -b320 "' & $sFile & '" "' & @ScriptDir & '\320_lame.mp3"')_Encode("Encoder: Blade - 96 kBit/s", @ScriptDir & '\Encoders\blade.exe -br 96 -q "' & $sFile & '" "' & @ScriptDir & '\96_blade.mp3"')
[/autoit] [autoit][/autoit] [autoit]
_Encode("Encoder: Blade - 128 kBit/s", @ScriptDir & '\Encoders\blade.exe -br 128 -q "' & $sFile & '" "' & @ScriptDir & '\128_blade.mp3"')
_Encode("Encoder: Blade - 320 kBit/s", @ScriptDir & '\Encoders\blade.exe -br 320 -q "' & $sFile & '" "' & @ScriptDir & '\320_blade.mp3"')_Encode("Encoder: Xing - 96 kBit/s", @ScriptDir & '\Encoders\xing.exe "' & $sFile & '" "' & @ScriptDir & '\96_xing.mp3" -b48')
[/autoit] [autoit][/autoit] [autoit]
_Encode("Encoder: Xing - 128 kBit/s", @ScriptDir & '\Encoders\xing.exe "' & $sFile & '" "' & @ScriptDir & '\128_xing.mp3" -b64')
_Encode("Encoder: Xing - 320 kBit/s", @ScriptDir & '\Encoders\xing.exe "' & $sFile & '" "' & @ScriptDir & '\320_xing.mp3" -b160')_Encode("Encoder: Fraunhofer - 96 kBit/s", @ScriptDir & '\Encoders\fhg.exe "' & $sFile & '" "' & @ScriptDir & '\96_fraunhofer.mp3" -br 96000 -hq')
[/autoit] [autoit][/autoit] [autoit]
_Encode("Encoder: Fraunhofer - 128 kBit/s", @ScriptDir & '\Encoders\fhg.exe "' & $sFile & '" "' & @ScriptDir & '\128_fraunhofer.mp3" -br 128000 -hq')
_Encode("Encoder: Fraunhofer - 320 kBit/s", @ScriptDir & '\Encoders\fhg.exe "' & $sFile & '" "' & @ScriptDir & '\320_fraunhofer.mp3" -br 320000 -hq')Func _Encode($sTitle, $sCmd)
[/autoit]
Local $iTimer = TimerInit()
Local $aRegExp = StringRegExp($sCmd, '"[^"]*"', 3)
If IsArray($aRegExp) And UBound($aRegExp) > 1 Then
$aRegExp = $aRegExp[1]
Else
$aRegExp = ""
EndIf
ProgressOn("Encoding to MP3", $sTitle, $aRegExp)
Local $foo = Run($sCmd, @SystemDir, @SW_HIDE, 0x8)
Local $line
While 1
$line = StdoutRead($foo)
If @error Then ExitLoop
$aRegExp = StringRegExp($line, "([0-9.]+)\h*%", 3)
If IsArray($aRegExp) Then ProgressSet($aRegExp[UBound($aRegExp) - 1])
WEnd
ConsoleWrite($sTitle & " Time: " & Round(TimerDiff($iTimer), 1) & "ms" & @LF)
Sleep(200)
ProgressOff()
EndFunc ;==>_EncodeEs ging darum zu zeigen, daß MP3 nicht gleich MP3 ist, sondern das Ergebnis sehr stark vom Encoder abhängt.
Man sieht auch schon an der Geschwindikeit, daß die Encoder unterschiedlich genau arbeiten.E
-
Hi
Sollte so funktionieren:
[autoit]_BASS_ChannelSetAttribute($hMusic, $BASS_ATTRIB_PAN, -1)
[/autoit][autoit][/autoit][autoit]
_BASS_ChannelPlay($hMusic, 1)While _BASS_ChannelIsActive($hMusic) = $BASS_ACTIVE_PLAYING
[/autoit][autoit][/autoit][autoit]
$iFreqOut = _GetFreq($hMusic)
$iFreqIn = _GetFreq($hRecord)
ToolTip("Frequenz Out: " & $iFreqOut & @LF & "Frequenz In: " & $iFreqIn)
Sleep(100)
WEnd_BASS_ChannelSetAttribute($hMusic, $BASS_ATTRIB_PAN, 1)
[/autoit][autoit][/autoit][autoit]
_BASS_ChannelPlay($hMusic, 1)While _BASS_ChannelIsActive($hMusic) = $BASS_ACTIVE_PLAYING
[/autoit]
$iFreqOut = _GetFreq($hMusic)
$iFreqIn = _GetFreq($hRecord)
ToolTip("Frequenz Out: " & $iFreqOut & @LF & "Frequenz In: " & $iFreqIn)
Sleep(100)
WEndmfgE
-
$CmdLine wird bereits berücksichtigt, aber $CmdLineRaw noch nicht...