Add tool for converting 5bpp wvfm to 4bpp

This commit is contained in:
Wenting Zhang 2025-02-22 10:09:35 +08:00
parent 1742a77511
commit 51c6e84ec9

View file

@ -0,0 +1,87 @@
import configparser
import argparse
import csv
import os
def process_table(fn, newfn):
table = {}
with open(fn, newline='') as csvfile:
csvreader = csv.reader(csvfile, delimiter=',')
for row in csvreader:
src = row[0]
dst = row[1]
seq = row[2:-1]
table[f'{src}_{dst}'] = seq
newtable = {}
# We drop all odd numbered entries
for src in range(16):
for dst in range(16):
seq = table[f'{src*2}_{dst*2}']
newtable[f'{src}_{dst}'] = seq
with open(newfn, 'w') as csvfile:
for src in range(16):
for dst in range(16):
csvfile.write(f'{src},{dst},{','.join(newtable[f'{src}_{dst}'])}\n')
def main():
parser = argparse.ArgumentParser(prog='wvfm_converter')
parser.add_argument('filename')
args = parser.parse_args()
config = configparser.ConfigParser()
config.read(args.filename)
#print(config.sections())
version = config['WAVEFORM']['VERSION']
if version != '2.0':
raise Exception("Unsupported")
prefix = config['WAVEFORM']['PREFIX']
# name = config['WAVEFORM']['NAME']
bpp = int(config['WAVEFORM']['BPP'])
if bpp != 5:
raise Exception("Input needs to be an 5bpp waveform")
modes = int(config['WAVEFORM']['MODES'])
temps = int(config['WAVEFORM']['TEMPS'])
tables = int(config['WAVEFORM']['TABLES'])
# Get all framecounts
# fc = []
# for i in range(tables):
# fc.append(config['WAVEFORM'][f'TB{i}FC'])
# trange = []
# for i in range(temps):
# trange.append(config['WAVEFORM'][f'T{i}RANGE'])
dirname = os.path.dirname(os.path.abspath(args.filename))
for i in range(tables):
oldname = f'{prefix}_TB{i}.csv'
newname = f'{prefix}_4bpp_TB{i}.csv'
process_table(os.path.join(dirname, oldname),
os.path.join(dirname, newname))
with open(os.path.join(dirname, f'{prefix}_4bpp_desc.iwf'), 'w') as fp:
fp.write('[WAVEFORM]\n')
fp.write('VERSION = 2.0\n')
fp.write(f'PREFIX = {prefix}_4bpp\n')
fp.write(f'NAME = {config['WAVEFORM']['NAME']}\n')
fp.write(f'BPP = 4\n')
fp.write(f'MODES = {modes}\n')
fp.write(f'TEMPS = {temps}\n')
fp.write(f'TABLES = {tables}\n')
fp.write('\n')
for i in range(temps):
fp.write(f'T{i}RANGE = {config['WAVEFORM'][f'T{i}RANGE']}\n')
fp.write('\n')
for i in range(tables):
fp.write(f'TB{i}FC = {config['WAVEFORM'][f'TB{i}FC']}\n')
fp.write('\n')
for i in range(modes):
fp.write(f'[MODE{i}]\n')
fp.write(f'NAME = {config[f'MODE{i}']['NAME']}\n')
for j in range(temps):
fp.write(f'T{j}TABLE = {config[f'MODE{i}'][f'T{j}TABLE']}\n')
fp.write('\n')
if __name__ == "__main__":
main()