¡¡¡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
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
chmod +x unxwb
Creamos dos directoris temporales de trabajo
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
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
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
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
chmod +x wavebank.sh
Y lo ejecutamos
./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
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
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
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
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
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
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
cp emptyfiles.sh wavnoheader
cd wavnoheader
chmod +x emptyfiles.sh
./emptyfiles.sh
Movemos los ficheros .dat.cl al directorio inicial
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)
./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
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.
./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
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
./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
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