#!/usr/bin/env python # Convert "You Don't Know Jack" sound files to AIFC. # Based on: # http://forum.xentax.com/viewtopic.php?p=17110 # Adam Sampson import sys def to_str(s): return [ord(c) for c in s] def to_uint32(n, le = False): s = [] for i in range(4): if le: s = s + [n & 0xFF] else: s = [n & 0xFF] + s n >>= 8 return s def convert(fn): print >>sys.stderr, fn f = open(fn) data = f.read() f.close() header = data[:84] encoded = data[84:] if data[60:64] == "ima4": ofn = fn + ".aifc" if len(encoded) % 34 != 0: encoded += "\0" * (len(encoded) % 34) total_size = len(encoded) + 70 - 8 num_frames = len(encoded) / 34 data_size = len(encoded) + 8 new_header = to_str("FORM") new_header += to_uint32(total_size) new_header += to_str("AIFCFVER") new_header += [ 0x00, 0x00, 0x00, 0x04, 0xA2, 0x80, 0x51, 0x40, ] new_header += to_str("COMM") new_header += [ 0x00, 0x00, 0x00, 0x16, 0x00, 0x01, ] new_header += to_uint32(num_frames) new_header += [ 0x00, 0x10, 0x40, 0x0D, 0xAF, 0xC8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ] new_header += to_str("ima4SSND") new_header += to_uint32(data_size) new_header += [ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ] else: ofn = fn + ".wav" riff_size = len(encoded) + 44 - 8 data_size = len(encoded) new_header = to_str("RIFF") new_header += to_uint32(riff_size, True) new_header += to_str("WAVEfmt ") new_header += [ 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0xE4, 0x57, 0x00, 0x00, 0xC8, 0xAF, 0x00, 0x00, 0x02, 0x00, 0x10, 0x00, ] new_header += to_str("data") new_header += to_uint32(data_size, True) encoded = "".join([encoded[i + 1] + encoded[i] for i in range(0, len(encoded), 2)]) new_header = "".join(map(chr, new_header)) f = open(ofn, "w") f.write(new_header) f.write(encoded) f.close() if __name__ == "__main__": for fn in sys.argv[1:]: convert(fn)