123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105 |
- #!/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 <stdint.h>
- #include <gbdk/platform.h>
- BANKREF({:s})
- """
-
- hGBDK = """//AUTOGENERATED FILE FROM cvtsample
- #ifndef WAVE_SOUND_{:s}_H
- #define WAVE_SOUND_{:s}_H
- #include <stdint.h>
- #include <gbdk/platform.h>
-
- #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()
|