GameBoy (Color) port of the GTA San Andreas arcade game Duality
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

cvtsample.py 3.2KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. #!/usr/bin/env python3
  2. # based on the cvtsample.py included in the GBDK example:
  3. # https://github.com/gbdk-2020/gbdk-2020/blob/develop/gbdk-lib/examples/gb/wav_sample/utils/cvtsample.py
  4. import sys
  5. import wave
  6. import os
  7. sGBDK = """//AUTOGENERATED FILE FROM cvtsample
  8. #include <stdint.h>
  9. #include <gbdk/platform.h>
  10. BANKREF({:s})
  11. """
  12. hGBDK = """//AUTOGENERATED FILE FROM cvtsample
  13. #ifndef WAVE_SOUND_{:s}_H
  14. #define WAVE_SOUND_{:s}_H
  15. #include <stdint.h>
  16. #include <gbdk/platform.h>
  17. #define {:s}_SIZE 0x{:x}
  18. extern const uint8_t {:s}[];
  19. BANKREF_EXTERN({:s})
  20. #endif
  21. """
  22. def main(argv=None):
  23. argv = argv or sys.argv
  24. if len(argv) < 2:
  25. sys.stderr.write("cvtsample.py: no filename; try cvtsample.py --help\n")
  26. sys.exit(1)
  27. infilename = argv[1]
  28. ident = argv[2] if len(argv) > 2 else None
  29. fmt = argv[3].upper() if len(argv) > 3 else "C"
  30. outdir = argv[4] if len(argv) > 4 else os.getcwd()
  31. if infilename in ('--help', '-h'):
  32. print("usage: cvtsample.py SOURCE [IDENTIFIER] [FMT] [OUTDIR]")
  33. return
  34. if ident == "(None)":
  35. ident = None
  36. if ident == None:
  37. ident = os.path.splitext(os.path.basename(infilename))[0]
  38. if fmt == "C":
  39. sHDR = "const UINT8 {:s}[] = {{\n"
  40. sFOOT = "};\n"
  41. sEMIT = "0x{:x}"
  42. sNEW = ",\n"
  43. sNONEW = ","
  44. elif fmt == "GBDK":
  45. outheader = os.path.join(outdir, f"{ident}.h")
  46. outsource = os.path.join(outdir, f"{ident}.c")
  47. sHDR = "const uint8_t {:s}[] = {{\n"
  48. sFOOT = "};\n"
  49. sEMIT = "0x{:x}"
  50. sNEW = ",\n"
  51. sNONEW = ","
  52. elif fmt == "ASM":
  53. sHDR = "{:s}::"
  54. sFOOT = ""
  55. sEMIT = "${:x}"
  56. sNEW = "\n"
  57. sNONEW = ","
  58. with wave.open(infilename, mode="rb") as f:
  59. p = f.getparams()
  60. if (p.nchannels == 1) and (p.sampwidth == 1) and (p.framerate >= 8000) and (p.framerate <= 8192) and (p.comptype == 'NONE'):
  61. data = f.readframes(p.nframes)
  62. c = 0
  63. cnt = 0;
  64. flag = False
  65. s = sHDR.format(ident)
  66. for i in range(len(data) - len(data) % 32):
  67. c = ((c << 4) | (data[i] >> 4)) & 0xFF
  68. if flag:
  69. s += sEMIT.format(c)
  70. cnt += 1
  71. s += sNEW if (cnt % 16 == 0) else sNONEW
  72. flag = not flag
  73. s += sFOOT
  74. if fmt == "GBDK":
  75. with open(outsource, "w") as o:
  76. o.write(sGBDK.format(ident))
  77. o.write(s)
  78. with open(outheader, "w") as o:
  79. o.write(hGBDK.format(ident, ident, ident, cnt, ident, ident))
  80. else:
  81. sys.stdout.write(s)
  82. sys.stdout.flush()
  83. else:
  84. sys.stderr.write("ERROR: Invalid wav file format\n")
  85. sys.stderr.write("Requires - nChannels: 1, sampWidth: 1, rate: 8000 - 8192, compType: NONE\n")
  86. sys.stderr.write("Found - nChannels: %d, sampWidth: %d, rate: %d, compType: %s\n" % (p.nchannels, p.sampwidth, p.framerate, p.comptype))
  87. sys.stderr.flush()
  88. if __name__=='__main__':
  89. main()