|
from zipfile import ZipFile |
|
|
|
import os, re, yaml |
|
|
|
Exceptions=yaml.safe_load(""" |
|
complex: "Complex Waveforms" |
|
ib: "IB Magnetic Saturation" |
|
device: "Devine" |
|
raitis: "DJ Raitis Vinyl Cuts" |
|
""") |
|
|
|
def filter_blocks(buf): |
|
def format_block(block): |
|
tokens=block.split(b"data") |
|
name=tokens[0][1:-1] |
|
data=(b"data".join(tokens[1:])) |
|
offset=data.index(b"RIFF") |
|
return (name, data[offset:]) |
|
return [format_block(block.split(b"<?xpacket begin")[0]) |
|
for block in buf.split(b"\202\244name")[1:]] |
|
|
|
def format_dirname(name): |
|
def format_token(token, exceptions=Exceptions): |
|
return exceptions[token] if token in exceptions else token.lower().capitalize() |
|
tokens=name.split(".")[0].split("_") |
|
return " ".join([format_token(token) |
|
for token in tokens[2:-1]]) |
|
|
|
def format_filename(name): |
|
tokens=[tok for tok in re.split("\\W", name) |
|
if tok!=''] |
|
return "%s.%s" % (" ".join(tokens[:-1]), |
|
tokens[-1]) |
|
|
|
if __name__=="__main__": |
|
try: |
|
with ZipFile("tmp/pico-drum.zip", 'w') as zf: |
|
for filename in os.listdir("tmp"): |
|
if not filename.endswith(".bin"): |
|
continue |
|
buf=open("tmp/%s" % filename, 'rb').read() |
|
for name, data in filter_blocks(buf): |
|
cleanname=name.decode("utf-8") |
|
wavdirname=format_dirname(filename) |
|
wavfilename=format_filename(cleanname) |
|
wavabspath="%s/%s" % (wavdirname, |
|
wavfilename) |
|
print (wavabspath) |
|
zf.writestr(wavabspath, data) |
|
except RuntimeError as error: |
|
print ("Error: %s" % str(error)) |