Estou trabalhando neste arquivo grande ( DATA.DAT , ~900MB) que contém vários outros arquivos. É de um jogo de PS2.
Amostras de som (que estão no formato .AIFF ), exatamente o que procuro, compõem a maior parte de seu tamanho.
Depois de pesquisar na web por extratores .DAT do PS2 , descobri que eles dependem basicamente do desenvolvedor e, como esse jogo/ferramenta é bastante obscuro e não encontro muito sobre ele online, pensei em automatizar o processo sozinho.
Inspecionando o arquivo em um editor hexadecimal, encontrei alguns cabeçalhos .AIFF , clonei os pedaços para novos arquivos .AIFF e, sem nenhum trabalho adicional, eles podiam ser reproduzidos.
Depois de passar um tempo tirando a ferrugem do meu conhecimento MUITO limitado de bash e lendo perguntas semelhantes aqui, criei esta expressão:
gcsplit -f "sample-" -b "%04d.aif" DATA.DAT /FORM/ '{*}'
(Estou no OSX usando coreutils, daí o prefixo g- no csplit)
Dado que os arquivos .AIFF começam com a string "FORM" e dado que basicamente todas as amostras no arquivo estão próximas umas das outras (espaçadas por quantidades desprezíveis de dados que não irão gerar ruído final indesejado nas amostras), pensei que o regexp
/FORM/
bastaria dividir os arquivos.
No entanto, cada arquivo dividido está sendo gerado com dados inúteis que ficam entre as amostras de som antes do cabeçalho .AIFF , tornando-o impossível de reproduzir.
Capturas de tela dos dados hexadecimais de uma amostra de som dividida abaixo:
Esta amostra real começa aproximadamente na marca de 1500 bytes:
O que está fazendo essa expressão dividir os arquivos com um deslocamento?