Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ; Extracts .wav files that Microvolts embedded into a 3D modeling file
- ; By: Chdata
- ; 8/23/2015
- ; Massive help from a few stock functions made by various members of the ahk community
- ; No help from ahk's horrid syntax
- #NoEnv
- #SingleInstance, force
- global pointer
- FileRead, binary, Model.nif
- if not ErrorLevel ; Successfully loaded.
- {
- offset := &binary
- offset += 0x220f*2 ; filenames
- offset2 := &binary
- offset2 += 0x12f69*2 ; wavdata
- ;MsgBox, % ExtractName()
- Loop
- {
- if (offset == -1000)
- {
- Break
- }
- TheFileName := ExtractName()
- ;MsgBox, % "Extracting """ . TheFileName . """"
- FileDelete, .\save\%TheFileName%
- TheFileData := ExtractWav()
- ;FileAppend, %TheFileData%, .\save\%TheFileName%
- }
- }
- ExitApp
- ExtractName()
- {
- global offset
- nulls = 0
- eofs = 0
- Loop
- {
- pointer := ( offset+((A_Index-1)*2) )
- Asc := *( pointer )
- IfEqual, Asc, 0
- {
- if (++nulls >= 3)
- {
- StringTrimRight, String, String, 1
- Break
- }
- }
- Else IfEqual, Asc, 255
- {
- if (++eofs >= 4)
- {
- StringTrimRight, String, String, 1
- MsgBox % "Files Done."
- offset = -1000
- Break
- }
- }
- else
- {
- if (nulls > 0)
- {
- nulls--
- }
- if (eofs > 0)
- {
- eofs--
- }
- String .= Chr(Asc)
- }
- }
- if (offset != -1000)
- offset := pointer
- Return String
- }
- ExtractWav()
- {
- global offset2
- global TheFileName
- Loop
- {
- pointer := ( offset2+((A_Index-1)*2) )
- Asc := Chr(*( pointer ))
- NextAsc2 := Chr(*( pointer+2 ))
- NextAsc4 := Chr(*( pointer+4 ))
- NextAsc6 := Chr(*( pointer+6 ))
- if (Asc == "R" && NextAsc2 == "I" && NextAsc4 == "F" && NextAsc6 == "F")
- {
- offset2 := pointer + 8
- ;MsgBox % "Found RIFF"
- ;String .= "RIFF"
- FileAppend, RIFF, .\save\%TheFileName%
- Loop
- {
- pointer2 := ( offset2+((A_Index-1)*2) )
- Asc := *( pointer2 )
- Hex := NumToHex(Asc)
- FullFilePath := ".\save\" . TheFileName
- BinAppend(FullFilePath, Hex)
- ;FileAppend, %Asc%, .\save\%TheFileName%
- NextAsc2 := Chr(*( pointer2+2 ))
- NextAsc4 := Chr(*( pointer2+4 ))
- NextAsc6 := Chr(*( pointer2+6 ))
- NextAsc8 := Chr(*( pointer2+8 ))
- NextAsc10 := Chr(*( pointer2+10 ))
- NextAsc12 := Chr(*( pointer2+12 ))
- NextAsc14 := Chr(*( pointer2+14 ))
- NextAsc16 := Chr(*( pointer2+16 ))
- NextAsc18 := Chr(*( pointer2+18 ))
- NextAsc20 := Chr(*( pointer2+20 ))
- NextAsc22 := Chr(*( pointer2+22 ))
- NextAsc24 := Chr(*( pointer2+24 ))
- NextAsc26 := Chr(*( pointer2+26 ))
- NextAsc28 := Chr(*( pointer2+28 ))
- NextAsc30 := Chr(*( pointer2+30 ))
- NextAsc32 := Chr(*( pointer2+32 ))
- NextAsc34 := Chr(*( pointer2+34 ))
- NextAsc36 := Chr(*( pointer2+36 ))
- NextAsc38 := Chr(*( pointer2+38 ))
- ;MsgBox % Asc . NextAsc2 . NextAsc4 . NextAsc6 . NextAsc8 . NextAsc10 . NextAsc12 . NextAsc14 . NextAsc16 . NextAsc18 . NextAsc20
- if (NextAsc2 == "<" && NextAsc4 == "?" && NextAsc6 == "x" && NextAsc8 == "p" && NextAsc10 == "a" && NextAsc12 == "c" && NextAsc14 == "k" && NextAsc16 == "e" && NextAsc18 == "t" && NextAsc20 == " " && NextAsc22 == "e" && NextAsc24 == "n" && NextAsc26 == "d" && NextAsc28 == "=" && NextAsc30 == """" && NextAsc32 == "w" && NextAsc34 == """" && NextAsc36 == "?" && NextAsc38 == ">")
- {
- pointer2 := offset2 + 40
- ;MsgBox % "Found <?xpacket end=""w""?>"
- FileAppend, <?xpacket end="w"?>, .\save\%TheFileName%
- ;String .= "<?xpacket end=""w""?>"
- offset2 := pointer2
- Return
- }
- }
- }
- }
- offset2 := pointer2
- ;Return String
- Return
- }
- BinAppend(file, data)
- {
- FileGetSize iSize, .\save\%TheFileName%
- BinWrite(file, data, 0, iSize)
- }
- /* ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; BinWrite ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- | - Open binary file
- | - (Over)Write n bytes (n = 0: all)
- | - From offset (offset < 0: counted from end)
- | - Close file
- | data -> file[offset + 0..n-1], rest of file unchanged
- | Return #bytes actually written
- */ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- BinWrite(file, data, n=0, offset=0)
- {
- ; Open file for WRITE (0x40..), OPEN_ALWAYS (4): creates only if it does not exists
- h := DllCall("CreateFile","str",file,"Uint",0x40000000,"Uint",0,"UInt",0,"UInt",4,"Uint",0,"UInt",0)
- IfEqual h,-1, SetEnv, ErrorLevel, -1
- IfNotEqual ErrorLevel,0,Return,0 ; couldn't create the file
- m = 0 ; seek to offset
- IfLess offset,0, SetEnv,m,2
- r := DllCall("SetFilePointerEx","Uint",h,"Int64",offset,"UInt *",p,"Int",m)
- IfEqual r,0, SetEnv, ErrorLevel, -3
- IfNotEqual ErrorLevel,0, {
- t = %ErrorLevel% ; save ErrorLevel to be returned
- DllCall("CloseHandle", "Uint", h)
- ErrorLevel = %t% ; return seek error
- Return 0
- }
- TotalWritten = 0
- m := Ceil(StrLen(data)/2)
- If (n <= 0 or n > m)
- n := m
- Loop %n%
- {
- StringLeft c, data, 2 ; extract next byte
- StringTrimLeft data, data, 2 ; remove used byte
- c = 0x%c% ; make it number
- result := DllCall("WriteFile","UInt",h,"UChar *",c,"UInt",1,"UInt *",Written,"UInt",0)
- TotalWritten += Written ; count written
- if (!result or Written < 1 or ErrorLevel)
- break
- }
- IfNotEqual ErrorLevel,0, SetEnv,t,%ErrorLevel%
- h := DllCall("CloseHandle", "Uint", h)
- IfEqual h,-1, SetEnv, ErrorLevel, -2
- IfNotEqual t,,SetEnv, ErrorLevel, %t%
- Return TotalWritten
- }
- ; format is ##
- NumToHex(num)
- {
- div = -1
- while (div != 0)
- {
- div := floor(num / 16)
- rmn := mod(num, 16)
- if (rmn == "10")
- {
- rmn := "a"
- }
- if (rmn == "11")
- {
- rmn := "b"
- }
- if (rmn == "12")
- {
- rmn := "c"
- }
- if (rmn == "13")
- {
- rmn := "d"
- }
- if (rmn == "14")
- {
- rmn := "e"
- }
- if (rmn == "15")
- {
- rmn := "f"
- }
- num := div
- hex .= rmn
- }
- hex := Flip(hex)
- if (StrLen(hex) == 1)
- {
- hex := "0" . hex
- }
- Return hex
- }
- Flip(Str)
- {
- Loop, Parse, Str
- nStr=%A_LoopField%%nStr%
- Return nStr
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement