From 116babc38e2e4023eb0b45eabc02050ed433e240 Mon Sep 17 00:00:00 2001 From: Keir Fraser Date: Thu, 4 Jun 2020 10:28:48 +0100 Subject: [PATCH] scripts: Include a helpful MOD analyser script --- scripts/mod_info.py | 48 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 scripts/mod_info.py diff --git a/scripts/mod_info.py b/scripts/mod_info.py new file mode 100644 index 0000000..ed8ddb6 --- /dev/null +++ b/scripts/mod_info.py @@ -0,0 +1,48 @@ +# mod_info.py +# +# Display information about a Protracker module. +# +# Written & released by Keir Fraser +# +# This is free and unencumbered software released into the public domain. +# See the file COPYING for more details, or visit . + +import struct, sys + +with open(sys.argv[1], "rb") as f: + dat = f.read() +dlen = len(dat) + +tname, = struct.unpack("20s", dat[:20]) +print("Name: '%s'" % tname.decode('utf-8')) +dat = dat[20:] +samples_len = 0 +for i in range(31): + name, wordlen, finetune, volume, repstart, replen = struct.unpack( + ">22sH2B2H", dat[:30]) + dat = dat[30:] + if wordlen == 0: + continue + samples_len += wordlen*2 +print("Sample Data: %u" % samples_len) + +songlen, pad = struct.unpack("2B", dat[:2]) +dat = dat[2:] +#assert pad == 127 +assert songlen <= 128 +print("Song Length: %u" % songlen) + +patterns = list(struct.unpack("128B", dat[:128])) +dat = dat[128:] +patterns = patterns[:songlen] +nr_patterns = max(patterns)+1 +print("Nr Patterns: %u (%u bytes)" % (nr_patterns, nr_patterns*1024)) + +mksig, = struct.unpack("4s", dat[:4]) +dat = dat[4:] +assert mksig == b'M.K.' + +totlen = 1084 + nr_patterns*1024 + samples_len +print("Total Bytes: %u (0x%x)" % (totlen, totlen)) +assert totlen <= dlen +