Autor Tema: Manual para recodificar ficheros de audio xwb  (Leído 1148 veces)

Fl0ppy

  • Administrador
  • Usuario Héroe
  • *****
  • Mensajes: 9628
Manual para recodificar ficheros de audio xwb
« en: 21 de Febrero de 2023, 10:50:38 pm »
Versión 2 del  Manual para recodificar ficheros de audio xwb

Spoiler for Hiden:
Manual para recodificar ficheros de audio xwb

¡¡¡ADVERTENCIA!!!

ESTA GUIA Y EL PAQUETE DE UTILIDADES ES PARA USARSE BAJO GNU/LINUX Y TAMBIEN ES NECESARIO TENER WINE INSTALADO

MAS ABAJO TIENES EL MISMO MANUAL PERO PARA WINDOWS
==================
MANUAL GNU/LINUX
==================
Vamos a poner como ejemplo el juego STARDEW VALLEY, concretamente la versión Linux de GOG

Una vez instalado el juego los datos de audio estan en el directorio Content/XACT


1.4K FarmerSounds.xgs
 29K 'Sound Bank.xsb'
 36M 'Wave Bank(1.4).xwb'
433M 'Wave Bank.xwb'

Nos interesa el fichero de 433 MB

Primero le cambiaremos el nombre a uno más sencillo

Código: [Seleccionar]
mv 'Wave Bank.xwb' wavebank.xwb
Del paquete de utilidades xwb usaremos el unxwb, ya viene una versión que compilé para Linux y lo que haremos es usarlo para extrear los audios

Le damos permisos al unxwb

Código: [Seleccionar]
chmod +x unxwb
Creamos un directorio temporal de trabajo

Código: [Seleccionar]
mkdir wavheader
./unxwb -v -d wavheader wavebank.xwb

Ahora ya tenemos los datos volcados en formato WAV, los convertimos a opus con opusenc

Código: [Seleccionar]
./fd -e wav -x ./ffmpeg -i {} {.}.pcm.wav
./fd -e pcm.wav -x wine opusenc.exe --bitrate 56 {} {}.opus && rm *.wav

Una vez reconvertidos los wav-adpcm a opus el proceso de conversión de wav a opus ya ha finalizado, ahora toca crear el setup para el proceso de recuperación de datos, que tranquilos no es tan largo y complejo como este primero

Creamos un directorio (toreencode) donde pondremos los siguientes ficheros

-Los *.opus
-adpcmencode.exe
-fd
-opusdec.exe
-XWBTool.exe


Código: [Seleccionar]
./fd -e opus -x wine opusdec.exe {} {.}.wav && rm *.opus
find ./ -depth -name "*.pcm.wav.wav" -exec sh -c 'mv "$1" "${1%.pcm.wav.wav}.wav"' _ {} \;
./fd -e wav -x wine adpcmencode.exe {} {.}.adpcm && rm *.wav
wine ../XWBTool.exe -s -o ../Songs.xwb *.adpcm
cd ..
rm -rf wavheader

===================
MANUAL PARA WINDOWS
===================
Vamos a poner como ejemplo el juego STARDEW VALLEY, concretamente la versión Linux de GOG

Una vez instalado el juego los datos de audio estan en el directorio Content/XACT


1.4K FarmerSounds.xgs
 29K 'Sound Bank.xsb'
 36M 'Wave Bank(1.4).xwb'
433M 'Wave Bank.xwb'

Nos interesa el fichero de 433 MB

Primero le cambiaremos el nombre a uno más sencillo

Código: [Seleccionar]
ren 'Wave Bank.xwb' wavebank.xwb
Del paquete de utilidades xwb usaremos el unxwb.exe y lo usaremos para extraer los audios


Creamos un directorio temporal de trabajo

Código: [Seleccionar]
mkdir wavheader
unxwb.exe -v -d wavheader wavebank.xwb

Ahora ya tenemos los datos volcados en formato WAV, los convertimos a opus con opusenc

Código: [Seleccionar]
fd.exe -e wav -x ffmpeg.exe -i {} {.}.pcm.wav
fd.exe -e pcm.wav -x wine opusenc.exe --bitrate 56 {} {}.opus && del *.wav

Una vez reconvertidos los wav-adpcm a opus el proceso de conversión de wav a opus ya ha finalizado, ahora toca crear el setup para el proceso de recuperación de datos, que tranquilos no es tan largo y complejo como este primero

Creamos un directorio (toreencode) donde pondremos los siguientes ficheros

-Los *.opus
-adpcmencode.exe
-fd.exe
-opusdec.exe
-XWBTool.exe


Código: [Seleccionar]
fd.exe -e opus -x opusdec.exe {} {.}.wav && del *.opus
ren "*.pcm.wav.wav" "*.wav"
fd.exe -e wav -x adpcmencode.exe {} {.}.adpcm && del *.wav
..\XWBTool.exe -s -o ..\wavebank.xwb *.adpcm
cd ..
ren wavebank.xwb 'Wave Bank.xwb'
rd /s /q wavheader

Versión 1 del  Manual para recodificar ficheros de audio xwb

Spoiler for Hiden:
¡¡¡ADVERTENCIA!!!

ESTA GUIA Y EL PAQUETE DE UTILIDADES ES PARA USARSE BAJO GNU/LINUX Y TAMBIEN ES NECESARIO TENER WINE INSTALADO
==================
Vamos a poner como ejemplo el juego STARDEW VALLEY, concretamente la versión Linux de GOG

Una vez instalado el juego los datos de audio estan en el directorio Content/XACT


1.4K FarmerSounds.xgs
 29K 'Sound Bank.xsb'
 36M 'Wave Bank(1.4).xwb'
433M 'Wave Bank.xwb'

Nos interesa el fichero de 433 MB

Primero le cambiaremos el nombre a uno más sencillo

Código: [Seleccionar]
mv 'Wave Bank.xwb' wavebank.xwb
Del paquete de utilidades xwb usaremos el unxwb, ya viene una versión que compilé para Linux y lo que haremos es crear dos logs diferentes

Le damos permisos al unxwb

Código: [Seleccionar]
chmod +x unxwb
Creamos dos directoris temporales de trabajo

Código: [Seleccionar]
mkdir wavnoheader
mkdir wavheader

./unxwb -v -R -d wavnoheader wavebank.xwb >wavnoheader.txt
./unxwb -v -d wavheader wavebank.xwb >wavheader.txt

Para saber si los audios estan comprimidos hacemos

Código: [Seleccionar]
cat wavheader.txt | grep ADP
Si salen resultados quiere decir que estan comprimidos con el ms-adpcm de XWB

Ahora ya tenemos los datos volcados en formato RAW, WAV, dos logs y sabemos que estan con ADPCM, toca convertir los log a un formato más "limpio"

Primero procesamos el fichero wavnoheader.txt creando el fichero test.txt

Código: [Seleccionar]
cat wavnoheader.txt |awk '{ print $1 }'|grep 0x | sed 's/0x/wavebank.xwb_/' | awk '{print $1"_12345678.dat"}' >test.txt
Ahora procesamos los ficheros wav dentro del directorio wavheader

Código: [Seleccionar]
cd wavheader
ls *.wav |awk '{print "\"mv\"",$0}' - |sed 's/"mv"/mv/' | paste - ../test.txt > wavebank.sh

Le damos permisos al fichero que se ha creado

Código: [Seleccionar]
chmod +x wavebank.sh
Y lo ejecutamos

Código: [Seleccionar]
./wavebank.sh
cd ..

Ahora ya tenemos los nombres de los ficheros (en formato wav) a punto y podemos borrar el fichero wavebank.sh

Hacemos el mismo proceso pero con los audio raw, pero variando el .wav por el .dat

Código: [Seleccionar]
cd wavnoheader
ls *.dat |awk '{print "\"mv\"",$0}' - |sed 's/"mv"/mv/' | paste - ../test.txt > wavebank.sh
chmod +x wavebank.sh
./wavebank.sh

Ahora esos .dat les ponemos el tamaño que tiene en el nombre del fichero, para ello copia del paquete el fichero update_size.pl a ese directorio dale permisos y ejecutalo

Código: [Seleccionar]
cp ../update_size.pl .
chmod +x update_size.pl
./update_size.pl

Ahora ya tenemos los ficheros originales en formato raw con el tamaño especificado, toca renombrar los .wav con el mismo nombre que los .dat

Salimos del directorio wavnoheader y ejecutamos estos comandos

Código: [Seleccionar]
cd ..
ls wavnoheader/*.dat | sed 's/^wavnoheader\///;s/\// /g'>noheader.txt
ls wavheader/*.dat | sed 's/^wavheader\///;s/\// /g'>header.txt


Continuamos con el proceso de renombrar los .wav

Código: [Seleccionar]
paste header.txt noheader.txt >test3.txt
cat test3.txt |awk '{print "\"mv\"",$0}' - |sed 's/"mv"/mv/' >test2.sh

Le damos permisos y lo ejecutamos DENTRO del directorio wavheader

Código: [Seleccionar]
chmod +x test2.sh
cp test2.sh wavheader
cd wavheader
./test2.sh
rm test2.sh
cd ..

En este punto vamos a eliminar ficheros menores de 100kb en ambos directorios de trabajo, para evitar conflictos en la recodificación

Copiamos el fichero delsize.sh en ambos directorios, le damos permisos y lo ejecutamos

Código: [Seleccionar]
cp delsize.sh wavheader
cp delsize.sh wavnoheader

cd wavheader
./delsize.sh
rm delsize.sh
cd ..

cd wavnoheader
./delsize.sh
rm delsize.sh
cd ..

Si todo ha ido bien en ambos directorios habran 159 ficheros

Ahora ya tenemos a punto los fichero dat y wav para procesarlos e inyectarlos

Comenzamos por vaciar el fichero "grande", el wavebank.xwb

Copiamos el script emptyfile.sh en el directorio wavnoheader

Código: [Seleccionar]
cp emptyfiles.sh wavnoheader
cd wavnoheader
chmod +x emptyfiles.sh
./emptyfiles.sh

Movemos los ficheros .dat.cl al directorio inicial

Código: [Seleccionar]
mv *.cl ..
cd ..

Y los inyectamos al fichero wavebank.xwb con el inyector de kps (que esta dentro del paquete de utilidades xwb), recuerda de hacer una copia de seguridad por si acaso del fichero (cp wavebank.xwb wavebank.xwb.ori)

Código: [Seleccionar]
./injector wavebank.xwb
rm *.cl

Ahora ya tenemos el fichero de audios vacio y vamos a recodificar los ms-adpcm a opus con un bitrate de 56 usando un ffmpeg especial que he compilado (que está dentro del paquete de utilidades de xwb)

Copiamos ese ffmpeg y el opusenc.exe (el porque uso una aplicacińo nativa de linux con otra de windows es porque ffmpeg tiene en modo experimental el opus y haciendolo de esta manera los tamaños coinciden, el directorio wavheader, le damos permisos y ejecutamos esta linea

Código: [Seleccionar]
cd wavheader
cp ../fd .
cp ../ffmpeg .
cp ../opusenc.exe .
./fd -e dat -x ./ffmpeg -i {} {.}.wav && rm *.dat
./fd -e wav -x wine opusenc.exe --bitrate 56 {} {.}.opus && rm *.wav

Una vez reconvertidos los wav-adpcm a opus el proceso de conversión de wav a opus ya ha finalizado, ahora toca crear el setup para el proceso de recuperación de datos, que tranquilos no es tan largo y complejo como este primero

Creamos un directorio (toreencode) donde pondremos los siguientes ficheros

-Los *.opus
-adpcmencode.exe
-fd
-injector
-opusdec.exe


Entramos en el directorio que hemos puesto todo eso y ejecutamos, el adpcmencode.exe, que tiene valores que van de 32 a 512 por defecto se usa el 128, en otros juegos pueden variar, si usas esta guia en diferentes juegos y los audio suenan mal prueba otros valores, has de ir probando, pero en este caso vas sobre seguro, ya que está más testado.

Código: [Seleccionar]
./fd -e opus -x wine opusdec.exe {} {.}.wav && rm *.opus
./fd -e wav -x wine adpcmencode.exe -b 128 {} {.}.adpcm && rm *.wav
for i in *.adpcm;do tail -c +79 $i >$i.wav;done && rm *.adpcm
cp  *.wav ..
cd ..
./injector wavebank.xwb
rm injector fd adpcmencode.exe ffmpeg *.wav

En este caso concreto hubo dos ficheros que dieron error de tamaño, el inyector avisa de ese fallo

Código: [Seleccionar]
rm wavebank.xwb_08c2eba0_000B6304.adpcm.wav 
rm wavebank.xwb_0da4832c_0008978C.adpcm.wav

cd wavnoheader
cp wavebank.xwb_08c2eba0_000B6304* ..
cp wavebank.xwb_0da4832c_0008978C* ..
cd ..

Y lo volvemos inyectar
Código: [Seleccionar]
./injector wavebank.xwb
En tal caso lo que se haria es inyectar los .dat originales y eliminar los .opus del proceso de instalación y dejar el fichero wavebank.xwb "preparado".

Pero en caso de que no te quieras complicar la vida con el proceso de recuperación de datos simplmente ejecuta el programa opus2wxb con el parámetro "bloque" ex: "opux2xwb.exe 128" y el ya hará los procesos pertinentes de control de tamaños

Una vez finalizado volvemos a poner el nombre original

Código: [Seleccionar]
mv wavebank.xwb 'Wave Bank.xwb'
Y ponemos ese fichero donde está el juego y si todo ha ido bien sonará la música correctamente
Siempre que pasa igual sucede lo mismo



Fl0ppy

  • Administrador
  • Usuario Héroe
  • *****
  • Mensajes: 9628
Re:Manual para recodificar ficheros de audio xwb
« Respuesta #1 en: 22 de Febrero de 2023, 03:39:31 pm »
Por si algun tiene curiosidad pongo como compilar (bajo ubuntu/mint) la utilidad (que viene el códig fuente y un binario pero de windows) para Linux de manera estática (sin dependéncias) y con musl-gcc

Quote (selected)
sudo apt-install musl-gcc

mkdir unxwb_src
cd unxwb_src
wget http://aluigi.altervista.org/papers/unxwb.zip
unzip unxwb.zip

wget https://zlib.net/zlib-1.2.13.tar.gz
tar xvfa zlib-1.2.13.tar.gz
cd zlib-1.2.13
./configure
make -j4
cd ..
musl-gcc -O2 unxwb.c -I$PWD/zlib-1.2.13 -L$PWD/zlib-1.2.13 -lz -static -o unxwb
strip unxwb

¡Y ya está!  :D
Siempre que pasa igual sucede lo mismo



Fl0ppy

  • Administrador
  • Usuario Héroe
  • *****
  • Mensajes: 9628
Re:Manual para recodificar ficheros de audio xwb
« Respuesta #2 en: 23 de Febrero de 2023, 10:50:11 pm »
Creada versión 2 del manual, muchisimo más simple y para GNU/Linux y Windows, también actualizado el paquete de las utilidades
Siempre que pasa igual sucede lo mismo