#!/usr/bin/python2
book = """Let the Priests of the Raven of dawn,
no longer in deadly black, with hoarse note
curse the sons of joy. Nor his accepted
brethren, whom, tyrant, he calls free lay the
bound or build the roof. Nor pale religious
letchery call that virginity, that wishes
but acts not.
For every thing that lives is Holy."""
craw = [
'a;43_24',
'b;44_24',
'c;46_24',
'd;48_24',
'e;49_24',
'f;51_24',
'g;53_24',
'h;55_24',
'i;43_96',
'j;44_96',
'k;46_96',
'l;48_96',
'm;49_96',
'n;51_96',
'o;53_96',
'p;55_96',
'q;43_192',
'r;44_192',
's;46_192',
't;48_192',
'u;49_192',
'v;51_192',
'w;53_192',
'x;55_192',
'y;43_384',
'z;44_384',
' ;-12_24',
', ;-12_240',
'\n;-12_384',
':\n;-12_768',
'. ;-12_960']
chars = {}
for cline in craw:
char = cline.split(';')
chars[char[1]] = char[0]
import string, sys
book = string.replace(book, ' ', '')
book = string.replace(book, '\n', '')
f = open(sys.argv[1], 'r')
tracks = {}
while 1:
line = f.readline()
if not line:
break
line = line.strip('\n').split(', ')
try:
tracks[int(line[0])]
except KeyError:
tracks[int(line[0])] = []
tracks[int(line[0])].append(line[1:])
#print tracks
notes = {}
for tid in tracks.keys():
track = tracks[tid]
notelist = []
lasttime = 0
for event in track:
# print event
note = None
if event[1] == 'Note_on_c':
if int(event[0]) != lasttime:
#there was a delay
d = int(event[0])-lasttime
note = 0
elif event[1] == 'Note_off_c':
d = int(event[0]) - lasttime
note = int(event[3])
if note != None:
d = d
#num = note+d
#print 'Note:\t%d\tDur:\t%d\tNum:\t%d' % (note, d, num)
notelist.append([lasttime, note, d])
lasttime = int(event[0])
notes[tid] = notelist
message = ''
for notenum in range(len(notes[2])):
note = notes[2][notenum]
key = str(note[1]-12)+'_'+str(note[2])
try:
message += chars[key]
except KeyError:
message += key
#print "oops: "+key
# try:
# message += book[num]
# except IndexError:
# message += '_'
print message
#print len(book)
IyEvdXNyL2Jpbi9weXRob24yCmJvb2sgPSAiIiJMZXQgdGhlIFByaWVzdHMgb2YgdGhlIFJhdmVuIG9mIGRhd24sIApubyBsb25nZXIgaW4gZGVhZGx5IGJsYWNrLCB3aXRoIGhvYXJzZSBub3RlIApjdXJzZSB0aGUgc29ucyBvZiBqb3kuIE5vciBoaXMgYWNjZXB0ZWQgCmJyZXRocmVuLCB3aG9tLCB0eXJhbnQsIGhlIGNhbGxzIGZyZWUgbGF5IHRoZSAKYm91bmQgb3IgYnVpbGQgdGhlIHJvb2YuIE5vciBwYWxlIHJlbGlnaW91cyAKbGV0Y2hlcnkgY2FsbCB0aGF0IHZpcmdpbml0eSwgdGhhdCB3aXNoZXMgCmJ1dCBhY3RzIG5vdC4gCgpGb3IgZXZlcnkgdGhpbmcgdGhhdCBsaXZlcyBpcyBIb2x5LiIiIgoKY3JhdyA9IFsKICAgICdhOzQzXzI0JywKICAgICdiOzQ0XzI0JywKICAgICdjOzQ2XzI0JywKICAgICdkOzQ4XzI0JywKICAgICdlOzQ5XzI0JywKICAgICdmOzUxXzI0JywKICAgICdnOzUzXzI0JywKICAgICdoOzU1XzI0JywKICAgICdpOzQzXzk2JywKICAgICdqOzQ0Xzk2JywKICAgICdrOzQ2Xzk2JywKICAgICdsOzQ4Xzk2JywKICAgICdtOzQ5Xzk2JywKICAgICduOzUxXzk2JywKICAgICdvOzUzXzk2JywKICAgICdwOzU1Xzk2JywKICAgICdxOzQzXzE5MicsCiAgICAncjs0NF8xOTInLAogICAgJ3M7NDZfMTkyJywKICAgICd0OzQ4XzE5MicsCiAgICAndTs0OV8xOTInLAogICAgJ3Y7NTFfMTkyJywKICAgICd3OzUzXzE5MicsCiAgICAneDs1NV8xOTInLAogICAgJ3k7NDNfMzg0JywKICAgICd6OzQ0XzM4NCcsCiAgICAnIDstMTJfMjQnLAogICAgJywgOy0xMl8yNDAnLAogICAgJ1xuOy0xMl8zODQnLAogICAgJzpcbjstMTJfNzY4JywKICAgICcuIDstMTJfOTYwJ10KY2hhcnMgPSB7fQpmb3IgY2xpbmUgaW4gY3JhdzoKICAgIGNoYXIgPSBjbGluZS5zcGxpdCgnOycpCiAgICBjaGFyc1tjaGFyWzFdXSA9IGNoYXJbMF0KCmltcG9ydCBzdHJpbmcsIHN5cwpib29rID0gc3RyaW5nLnJlcGxhY2UoYm9vaywgJyAnLCAnJykKYm9vayA9IHN0cmluZy5yZXBsYWNlKGJvb2ssICdcbicsICcnKQoKZiA9IG9wZW4oc3lzLmFyZ3ZbMV0sICdyJykKCnRyYWNrcyA9IHt9Cgp3aGlsZSAxOgoJbGluZSA9IGYucmVhZGxpbmUoKQoJaWYgbm90IGxpbmU6CgkJYnJlYWsKCWxpbmUgPSBsaW5lLnN0cmlwKCdcbicpLnNwbGl0KCcsICcpCgl0cnk6CgkJdHJhY2tzW2ludChsaW5lWzBdKV0KCWV4Y2VwdCBLZXlFcnJvcjoKCQl0cmFja3NbaW50KGxpbmVbMF0pXSA9IFtdCgl0cmFja3NbaW50KGxpbmVbMF0pXS5hcHBlbmQobGluZVsxOl0pCgojcHJpbnQgdHJhY2tzCgoKbm90ZXMgPSB7fQpmb3IgdGlkIGluIHRyYWNrcy5rZXlzKCk6CiAgICB0cmFjayA9IHRyYWNrc1t0aWRdCiAgICBub3RlbGlzdCA9IFtdCiAgICBsYXN0dGltZSA9IDAKICAgIGZvciBldmVudCBpbiB0cmFjazoKICAgICMgICAgcHJpbnQgZXZlbnQKICAgICAgICBub3RlID0gTm9uZQogICAgICAgIGlmIGV2ZW50WzFdID09ICdOb3RlX29uX2MnOgogICAgICAgICAgICBpZiBpbnQoZXZlbnRbMF0pICE9IGxhc3R0aW1lOgogICAgICAgICAgICAgICAgI3RoZXJlIHdhcyBhIGRlbGF5CiAgICAgICAgICAgICAgICBkID0gaW50KGV2ZW50WzBdKS1sYXN0dGltZQogICAgICAgICAgICAgICAgbm90ZSA9IDAKICAgICAgICBlbGlmIGV2ZW50WzFdID09ICdOb3RlX29mZl9jJzoKICAgICAgICAgICAgZCA9IGludChldmVudFswXSkgLSBsYXN0dGltZQogICAgICAgICAgICBub3RlID0gaW50KGV2ZW50WzNdKQogICAgICAgIGlmIG5vdGUgIT0gTm9uZToKICAgICAgICAgICAgZCA9IGQKICAgICAgICAgICAgI251bSA9IG5vdGUrZAogICAgICAgICAgICAjcHJpbnQgJ05vdGU6XHQlZFx0RHVyOlx0JWRcdE51bTpcdCVkJyAlIChub3RlLCBkLCBudW0pCiAgICAgICAgICAgIG5vdGVsaXN0LmFwcGVuZChbbGFzdHRpbWUsIG5vdGUsIGRdKQogICAgICAgIGxhc3R0aW1lID0gaW50KGV2ZW50WzBdKSAgCiAgICBub3Rlc1t0aWRdID0gbm90ZWxpc3QKCm1lc3NhZ2UgPSAnJwoKZm9yIG5vdGVudW0gaW4gcmFuZ2UobGVuKG5vdGVzWzJdKSk6CiAgICBub3RlID0gbm90ZXNbMl1bbm90ZW51bV0KICAgIGtleSA9IHN0cihub3RlWzFdLTEyKSsnXycrc3RyKG5vdGVbMl0pCiAgICB0cnk6CiAgICAgICAgbWVzc2FnZSArPSBjaGFyc1trZXldCiAgICBleGNlcHQgS2V5RXJyb3I6CiAgICAgICAgbWVzc2FnZSArPSBrZXkKICAgICAgICAgICAgI3ByaW50ICJvb3BzOiAiK2tleQojICAgIHRyeToKIyAgICAgICAgbWVzc2FnZSArPSBib29rW251bV0KIyAgICBleGNlcHQgSW5kZXhFcnJvcjoKIyAgICAgICAgbWVzc2FnZSArPSAnXycKCnByaW50IG1lc3NhZ2UKCiNwcmludCBsZW4oYm9vaykK