#!/usr/bin/env python3 # based on the cvtsample.py included in the GBDK example: # https://github.com/gbdk-2020/gbdk-2020/blob/develop/gbdk-lib/examples/gb/wav_sample/utils/cvtsample.py import sys import wave import os sGBDK = """//AUTOGENERATED FILE FROM cvtsample #include #include BANKREF({:s}) """ hGBDK = """//AUTOGENERATED FILE FROM cvtsample #ifndef WAVE_SOUND_{:s}_H #define WAVE_SOUND_{:s}_H #include #include #define {:s}_SIZE 0x{:x} extern const uint8_t {:s}[]; BANKREF_EXTERN({:s}) #endif """ def main(argv=None): argv = argv or sys.argv if len(argv) < 2: sys.stderr.write("cvtsample.py: no filename; try cvtsample.py --help\n") sys.exit(1) infilename = argv[1] ident = argv[2] if len(argv) > 2 else None fmt = argv[3].upper() if len(argv) > 3 else "C" outdir = argv[4] if len(argv) > 4 else os.getcwd() if infilename in ('--help', '-h'): print("usage: cvtsample.py SOURCE [IDENTIFIER] [FMT] [OUTDIR]") return if ident == "(None)": ident = None if ident == None: ident = os.path.splitext(os.path.basename(infilename))[0] if fmt == "C": sHDR = "const UINT8 {:s}[] = {{\n" sFOOT = "};\n" sEMIT = "0x{:x}" sNEW = ",\n" sNONEW = "," elif fmt == "GBDK": outheader = os.path.join(outdir, f"{ident}.h") outsource = os.path.join(outdir, f"{ident}.c") sHDR = "const uint8_t {:s}[] = {{\n" sFOOT = "};\n" sEMIT = "0x{:x}" sNEW = ",\n" sNONEW = "," elif fmt == "ASM": sHDR = "{:s}::" sFOOT = "" sEMIT = "${:x}" sNEW = "\n" sNONEW = "," with wave.open(infilename, mode="rb") as f: p = f.getparams() if (p.nchannels == 1) and (p.sampwidth == 1) and (p.framerate >= 8000) and (p.framerate <= 8192) and (p.comptype == 'NONE'): data = f.readframes(p.nframes) c = 0 cnt = 0; flag = False s = sHDR.format(ident) for i in range(len(data) - len(data) % 32): c = ((c << 4) | (data[i] >> 4)) & 0xFF if flag: s += sEMIT.format(c) cnt += 1 s += sNEW if (cnt % 16 == 0) else sNONEW flag = not flag s += sFOOT if fmt == "GBDK": with open(outsource, "w") as o: o.write(sGBDK.format(ident)) o.write(s) with open(outheader, "w") as o: o.write(hGBDK.format(ident, ident, ident, cnt, ident, ident)) else: sys.stdout.write(s) sys.stdout.flush() else: sys.stderr.write("ERROR: Invalid wav file format\n") sys.stderr.write("Requires - nChannels: 1, sampWidth: 1, rate: 8000 - 8192, compType: NONE\n") sys.stderr.write("Found - nChannels: %d, sampWidth: %d, rate: %d, compType: %s\n" % (p.nchannels, p.sampwidth, p.framerate, p.comptype)) sys.stderr.flush() if __name__=='__main__': main()