Tanto per riaprire una vecchia ferita, vi comunico che ho una versione 6/8 (sono non funzionanti solo la seconda parte di Sopravvissuti e Ora-Zero) e l'ho mandata a Bubusan.
Per crearla, ho usato una strategia diversa: non più modificare il WAV ma il TAP (cosa che io stesso sconsigliavo...). Dopo aver creato il TAP dal WAV con Audiotap, e aver fatto un piccolo ritocco a mano per il pilot tone di Tarzanino, ho scritto un programma Python che applica la stessa strategia che usavo manualmente col WAV, solo che, essendo un programma e non un essere umano, non si annoia al 274esimo ritocco.
import io
import struct
inputs = io.open('record.tap','rb')
outputs = io.open('newrecord.tap','wb')
bytesin = inputs.read(16)
inputs.seek(4,1)
outputs.write(bytesin)
bytesout=b'\0\0\0\0'
outputs.write(bytesout)
isthereafollowingbyte=False
blockstopass=[ \
#DUELLO BARBARO
[0x14 , 0x23CB2 , "DUELLO BARBARO" ], \
[0x32152 , 0x3AE97 , "'DUELLO BARBARO"], \
#MUTANTI
[0x9868F , 0xA7688 , "MUTANTI" ], \
[0xADDB0 , 0xB6E92 , "'MUTANTI"], \
#SPIE AL POLO
[0x11468A, 0x1239D5, "SPIE AL POLO" ], \
[0x13373D, 0x13C3E3, "'SPIE AL POLO"], \
#ORA-ZERO
[0x199BDB, 0x1A998A, "ORA-ZERO"], \
#SOPRAVVISSUTI
[0x204292, 0x2139CB, "SOPRAVVISSUTI" ], \
[0x21F8B3, 0x228A28, "'SOPRAVVISSUTI"], \
#TARZANINO
[0x28621F, 0x295477, "TARZANINO" ], \
[0x2A77FF, 0x2B0272, "'TARZANINO"], \
#VENDICARE
[0x30DA6B, 0x31DCD3, "VENDICARE" ], \
[0x3303AB, 0x338E64, "'VENDICARE"], \
#RIMBALZO
[0x396664, 0x3A6050, "RIMBALZO"], \
[0x3ECE28, 0x3FBD4B, "fine"]
]
block=0
while True:
if inputs.tell()==blockstopass[block][0]:
thisbyte=inputs.read(blockstopass[block][1]-blockstopass[block][0])
outputs.write(thisbyte)
block=block+1
print('block '+str(block)+' '+blockstopass[block-1][2])
if block==len(blockstopass):
break
continue
breakingthisbyte=False
if not isthereafollowingbyte:
thisbyte=inputs.read(1)
if len(thisbyte)==0:
break
if thisbyte[0]==0x35:
print('found '+hex(thisbyte[0])+' at '+str(inputs.tell())+' breaking it at '+str(outputs.tell()))
breakingthisbyte=True
thisbyte=[0x11]
nextbyte=[0x24]
else:
thisbyte=nextbyte
if thisbyte[0]==0:
nextbytes=inputs.read(3)
outputs.write(thisbyte)
outputs.write(nextbytes)
isthereafollowingbyte=False
continue
if not breakingthisbyte:
nextbyte=inputs.read(1)
isthereafollowingbyte=len(nextbyte)>0
if isthereafollowingbyte and nextbyte[0]!=0:
if thisbyte[0]+nextbyte[0] <= 0x25:
isthereafollowingbyte=False
newbyte=thisbyte[0]+nextbyte[0]
newbyte=min(0x20, newbyte)
thisbyte=[newbyte]
elif thisbyte[0] <= 0x0f:
newnextbyte=thisbyte[0]+nextbyte[0]-0x11
thisbyte=[0x11]
nextbyte=[newnextbyte]
elif nextbyte[0]==0x22:
if thisbyte[0] <= 0x18 or thisbyte[0]==0x2a:
print('found '+hex(thisbyte[0])+' '+hex(nextbyte[0])+' at '+str(inputs.tell())+' shortening it at '+str(outputs.tell()))
thisbyte=[thisbyte[0]+nextbyte[0]-0x1d]
nextbyte=[0x1d]
else:
print('found '+hex(thisbyte[0])+' '+hex(nextbyte[0])+' at '+str(inputs.tell())+' keeping it at '+str(outputs.tell()))
elif thisbyte[0]>=0x38:
print('found '+hex(thisbyte[0])+' at '+str(inputs.tell())+' splittng it at '+str(outputs.tell()))
outputs.write([0x11])
newthisbyte=thisbyte[0]-0x11
thisbyte=[newthisbyte]
outputs.write(thisbyte)
outsize=outputs.tell()-20
outputs.seek(16)
bytesout=struct.pack('<L',outsize)
outputs.write(bytesout)
Il programma legge record.tap (creato con Audiotap) e crea newrecord.tap. I byte di inizio e fine di ciascun programma sono hard-coded, quindi il programma non è molto flessibile, però fa il suo dovere.