FileForums

FileForums (https://fileforums.com/index.php)
-   Conversion Tutorials (https://fileforums.com/forumdisplay.php?f=55)
-   -   How to correctly process WWise Vorbis Audio | Guide + WemTool (https://fileforums.com/showthread.php?t=104859)

Masquerade 30-12-2021 11:22

How to correctly process WWise Vorbis Audio | Guide + WemTool
 
1 Attachment(s)
How to correctly process WWise Vorbis Audio | Guide + WemTool

Good evening everybody,

I am sure we have all seen audio in *.wem format before. This is a very common type of audio in games and is made by WWise sound engine. The audio in the .WEM format can either be Vorbis (you may know this as *.OGG) or WAVE audio (*.WAV).

Wems that contain WAV audio can be already compressed by ProFrager's Media Streams Compressor just fine and is not the focus of this guide.

Instead, I would like to explain the best way to compress the Vorbis wems. For normal vorbis audio, we would use ProFrager's OGGRE compressor however ProFrager also made a separate version of OGGRE for WWise vorbis. In order to gain the benefits of this tool, you could follow these steps:
  1. Use WW2OGG on your wem file to convert the *.wem file to an *.ogg file.
  2. Compress this *.ogg file with the WWise OGGRE encoder.
  3. Decompress the compressed file with the WWise OGGRE decoder
  4. Patch the decompressed output to the original *.wem file using your patch engine of choice. I like to use HDiffZ since it makes the smallest patches, however XDelta will be sufficient here.

This is a very basic process. However, from reading the above steps - you wil be thinking - how on Earth am I meant to use OGGRE (WWise version) with FreeArc?

The answer is, we don't. Because Oggre WWise can only proccess one file at once and not many files. FreeArc would bundle all of your *.oggs together in $$arcdatafile$$.tmp. Because we cannot use FreeArc for this (it would crash because the decoded output of the compressed *.ogg file DOES NOT MATCH the input file to the encoder), we have to go down a different route. Attempting to individually compress each *.wem file in a game where there could be thousands of wems is a nonsense task, so instead I simplified it.

I would like to introduce WemTool - a wrapper for several tools which will parallel process all of your wem files.
Code:

WemTool [For Vorbis WWise Audio]

 Available Options:

 -e : encode wems
 -d : decode wems

 Example Usage:

 WemTool.exe -e
 WemTool.exe -d

Please note that this is a very simple program and WemTool.exe contains the following tools:

- WW2OGG by hcs64
- MParallel by LoRd_MuldeR
- Oggre WWise by ProFrager
- HDiffZ by sisong

In order to use it, simply drop WemTool.exe into the root of the game folder that contains *.wem files and run it from command line with either encode or decode option. WemTool will compress all the *.wem files possible (it runs recursive) and then delete the successfully compressed wems, leaving a *.ww file and a *.DIFFZ file which then can be decoded by WemTool back into a *.wem. All CPU threads are used. If any *.wem files are left after WemTool has run, it means that they contain Wave audio and you should compress them with MSC instead.

To demonstrate on a sample of *.wem files from the game "Old World":
https://i.ibb.co/Jxyq1KN/ex-comparison.png

My apologies for the long read. I hope you understand what has just been explained, but this is certainly a lot more wordy than I would have desired.

Please note that I did little to no coding here, it's Bat2Exe + all aforementioned tools, so all credits here go to ProFrager, LoRd_MuldeR, hcs64 and sisong for their tools which all are used by this program.

L33THAK0R 01-01-2022 00:18

Quite an interesting read, well done putting this all together in such a cohesive post!

Masquerade 15-01-2022 13:53

WemTool v2
  • Moved from MTP to MParallel - increased console output, but everything seems to be working just fine now. Test on a sample before your game.

Snake288 15-01-2022 15:47

hello, if I may, the voice of God *.wem would like to ask your support on how to reduce the size of wem files the sample video can be a very understandable training video.

fabrieunko 15-01-2022 23:26

Hello, thank you works well on Gow on the other hand how to use it with an installer? is there one that supports it or do you have to do a .bat? who would run the -d function after decompressing the .bin?

Masquerade 16-01-2022 00:07

Quote:

Originally Posted by fabrieunko (Post 495439)
Hello, thank you works well on Gow on the other hand how to use it with an installer? is there one that supports it or do you have to do a .bat? who would run the -d function after decompressing the .bin?

Put this after your archive extraction via ISDone:
Code:

Exec2(ExpandConstant('{app}\WemTool.exe'), '-d')

fabrieunko 16-01-2022 03:23

Thank you, can you help me? I use

Windows Phone Installer (DSG)

I have identified the ISdone line which I think is the correct one and the line Exec2

Code:

function ISArcExtract(CurComponent: Cardinal; PctOfTotal: Double; InName, OutPath, ExtractedPath: AnsiString; DeleteInFile: Boolean; Password, CfgFile, WorkPath: AnsiString; ExtractPCF: Boolean): Boolean; external '[email protected]{tmp}\ISDone.dll stdcall delayload';
function IS7ZipExtract(CurComponent: Cardinal; PctOfTotal: Double; InName, OutPath: AnsiString; DeleteInFile: Boolean; Password: AnsiString): Boolean; external '[email protected]{tmp}\ISDone.dll stdcall delayload';
function ISRarExtract(CurComponent: Cardinal; PctOfTotal: Double; InName, OutPath: AnsiString; DeleteInFile: Boolean; Password: AnsiString): Boolean; external '[email protected]{tmp}\ISDone.dll stdcall delayload';
function ISPrecompExtract(CurComponent: Cardinal; PctOfTotal: Double; InName, OutFile: AnsiString; DeleteInFile: Boolean): Boolean; external '[email protected]{tmp}\ISDone.dll stdcall delayload';
function ISSRepExtract(CurComponent: Cardinal; PctOfTotal: Double; InName, OutFile: AnsiString; DeleteInFile: Boolean): Boolean; external '[email protected]{tmp}\ISDone.dll stdcall delayload';
function ISxDeltaExtract(CurComponent: Cardinal; PctOfTotal: Double; MinRAM, MaxRAM: Integer; InName, DiffFile, OutFile: AnsiString; DeleteInFile, DeleteDiffFile: Boolean): Boolean; external '[email protected]{tmp}\ISDone.dll stdcall delayload';
function ISPackZIP(CurComponent: Cardinal; PctOfTotal: Double; InName, OutFile: AnsiString; ComprLvl: Integer; DeleteInFile: Boolean): Boolean; external '[email protected]{tmp}\ISDone.dll stdcall delayload';
function ShowChangeDiskWindow(Text, DefaultPath, SearchFile: AnsiString): Boolean; external '[email protected]{tmp}\ISDone.dll stdcall delayload';

function Exec2 (FileName, Param: PAnsiChar;Show: Boolean): Boolean; external '[email protected]{tmp}\ISDone.dll stdcall delayload';

should I replace the line (just above) with this one?

Code:

Exec2(ExpandConstant('{app}\WemTool.exe'), '-d')

:( Sad8669 16-01-2022 03:41

An alternative way is to execute a bat file through Inno Setup.

Code:

[Run]
Filename: "{app}\your bat.bat"; Parameters: "install"; Flags: runhidden

where the bat contains commands to run WemTool.exe.

KaktoR 16-01-2022 03:43

Quote:

Originally Posted by fabrieunko (Post 495443)
Thank you, can you help me? I use

Windows Phone Installer (DSG)

I have identified the ISdone line which I think is the correct one and the line Exec2

Code:

function ISArcExtract(CurComponent: Cardinal; PctOfTotal: Double; InName, OutPath, ExtractedPath: AnsiString; DeleteInFile: Boolean; Password, CfgFile, WorkPath: AnsiString; ExtractPCF: Boolean): Boolean; external '[email protected]{tmp}\ISDone.dll stdcall delayload';
function IS7ZipExtract(CurComponent: Cardinal; PctOfTotal: Double; InName, OutPath: AnsiString; DeleteInFile: Boolean; Password: AnsiString): Boolean; external '[email protected]{tmp}\ISDone.dll stdcall delayload';
function ISRarExtract(CurComponent: Cardinal; PctOfTotal: Double; InName, OutPath: AnsiString; DeleteInFile: Boolean; Password: AnsiString): Boolean; external '[email protected]{tmp}\ISDone.dll stdcall delayload';
function ISPrecompExtract(CurComponent: Cardinal; PctOfTotal: Double; InName, OutFile: AnsiString; DeleteInFile: Boolean): Boolean; external '[email protected]{tmp}\ISDone.dll stdcall delayload';
function ISSRepExtract(CurComponent: Cardinal; PctOfTotal: Double; InName, OutFile: AnsiString; DeleteInFile: Boolean): Boolean; external '[email protected]{tmp}\ISDone.dll stdcall delayload';
function ISxDeltaExtract(CurComponent: Cardinal; PctOfTotal: Double; MinRAM, MaxRAM: Integer; InName, DiffFile, OutFile: AnsiString; DeleteInFile, DeleteDiffFile: Boolean): Boolean; external '[email protected]{tmp}\ISDone.dll stdcall delayload';
function ISPackZIP(CurComponent: Cardinal; PctOfTotal: Double; InName, OutFile: AnsiString; ComprLvl: Integer; DeleteInFile: Boolean): Boolean; external '[email protected]{tmp}\ISDone.dll stdcall delayload';
function ShowChangeDiskWindow(Text, DefaultPath, SearchFile: AnsiString): Boolean; external '[email protected]{tmp}\ISDone.dll stdcall delayload';

function Exec2 (FileName, Param: PAnsiChar;Show: Boolean): Boolean; external '[email protected]{tmp}\ISDone.dll stdcall delayload';

should I replace the line (just above) with this one?

Code:

Exec2(ExpandConstant('{app}\WemTool.exe'), '-d')

No!

Use it in "procedure CurStepChanged" CurStep = ssPostInstall

I don't know this script, but it should look something like this
Code:

procedure CurStepChanged
...
..
if (CurStep = ssPostInstall) then begin
...
Exec2(ExpandConstant('{app}\WemTool.exe'), '-d')
..


fabrieunko 16-01-2022 03:53

Thanks Kaktor, do you think this is good?

Code:

procedure CurStepChanged(CurStep: TSetupStep);
var
  ResultCode: Integer;
begin
  if CurStep = ssInstall then
  begin
    CreateDir(ExpandConstant('{app}\Uninstall'));
    FileCopy(ExpandConstant('{tmp}\botva2.dll'),ExpandConstant('{app}\Uninstall\botva2.dll'),True);
    FileCopy(ExpandConstant('{tmp}\dark.png'),ExpandConstant('{app}\Uninstall\dark.png'),True);
    FileCopy(ExpandConstant('{tmp}\light.png'),ExpandConstant('{app}\Uninstall\light.png'),True);
    FileCopy(ExpandConstant('{tmp}\Setup1.jpg'),ExpandConstant('{app}\Uninstall\Setup1.jpg'),True);
    FileCopy(ExpandConstant('{tmp}\Symbol Font.ttf'),ExpandConstant('{app}\Uninstall\Symbol Font.ttf'),True);
    FileCopy(ExpandConstant('{tmp}\bahnschrift.ttf'),ExpandConstant('{app}\Uninstall\bahnschrift.ttf'),True);
    Unpack_Process(not RamLimitChk.IsChecked);
  end;
  if (CurStep = ssPostInstall) and ISDoneError then
  begin
    SetTaskBarProgressValue(100);
    SetTaskBarProgressState(TBPF_ERROR);
    Exec(ExpandConstant('{uninstallexe}'), '/VerySilent','', sw_Hide, ewWaitUntilTerminated, ResultCode);

  end;
  if (CurStep = ssPostInstall) and not ISDoneError then
  begin
    Exec2(ExpandConstant('{app}\WemTool.exe'), '-d')
  #ifdef Redist1


KaktoR 16-01-2022 04:16

Should be fine

fabrieunko 16-01-2022 04:22

Thank you very much for your help, I appreciate helping beginners like me. I have a last question about the executable Wemtool.exe where should I put it? next to my installer.ISS?

KaktoR 16-01-2022 04:34

You can either include it into your installer ([Files] section, DestDir: "{app}") or directly include it into game folder before compression.

Snake288 16-01-2022 05:18

WemTool help with usage
information about the way it is used as a video or image
The God of War (*.wem) How can I compress multiple files? and how to restore compressed files

KaktoR 16-01-2022 05:30

Quote:

Originally Posted by Snake288 (Post 495451)
WemTool help with usage
information about the way it is used as a video or image
The God of War (*.wem) How can I compress multiple files? and how to restore compressed files

Make backup of all *.wem files first.

Put WemTool.exe in GodofWar game folder
Create a batch file in same folder
Code:

"E:\Games\GodofWar\WemTool.exe" -e
Execute the batch file and wait for finish

Compress the game

After installing/unpacking with your installer, let the installer run WemTool.exe with -d parameter (explained a few posts above).

Finish


All times are GMT -7. The time now is 10:12.

Powered by vBulletin® Version 3.8.11
Copyright ©2000 - 2022, vBulletin Solutions Inc.
Copyright 2000-2020, FileForums @ https://fileforums.com