=============
== Maok.us ==
=============
​
QOTD,
dd/mm/yyyy00/00/0000:

"The javascript isn't working!!"

Ableton Wav Export Easter Egg

misc

Discovery

While developing the the Wavetable of Life app and experimenting how far I could push the WAV file format before it died, I happened across a funky little message in my hex editor.

00000000: 5249 4646 3a8f af02 5741 5645 4a55 4e4b  RIFF:...WAVEJUNK
00000010: 1c00 0000 5768 7920 7220 7520 7573 696e  ....Why r u usin
00000020: 6720 6120 6865 7820 6564 6974 6f72 3f20  g a hex editor? 
00000030: 666d 7420 1000 0000 0100 0200 44ac 0000  fmt ........D...

“Hah!” I thought. Its a pretty fun use of some otherwise useless bytes, but I didn’t think much of it. A few days later, when the app was done, I decided to show off this little easter egg as a party trick. So I booted Ableton, rendered a wav file and…

00000000: 5249 4646 baab 9600 5741 5645 4a55 4e4b  RIFF....WAVEJUNK
00000010: 1c00 0000 5468 6520 736c 6565 7065 7220  ....The sleeper 
00000020: 6d75 7374 2061 7761 6b65 6e20 2020 2020  must awaken     
00000030: 666d 7420 1000 0000 0100 0200 80bb 0000  fmt ............

HUH?

So as it turns out, when you export a wav file from ableton, it puts a fun little message into the junk chunk.

The natural next question to ask is “What other messages are there?” So I coded a little script that went through my music directory and read all the junk chunks. It’s probably not the most elegant code, but it works.

import os

directory = "~/Desktop/Music"
musicFiles = os.listdir(directory)
maxRead = 100

wavFiles=list(filter(lambda x: x[-4:]==".wav", musicFiles))

junkStrings = []

for file in wavFiles:
	with open(directory+"/"+file, "rb") as f:
		openingBytes = f.read(maxRead)
		junkLoc = openingBytes.find(b"JUNK")
		if(junkLoc==-1):
			pass
		else:
			junkLength = int.from_bytes(openingBytes[junkLoc+4:junkLoc+8],"little");
			junkString = openingBytes[junkLoc+8:junkLoc+junkLength+8]
			if junkString not in junkStrings:
				junkStrings.append(junkString)

for js in junkStrings:
	print(js)
b"Life isn't a problem 2 solve"
b"This is the woman's century "
b'The future is female        '
b'Ozymandias, King of Kings   '
b'The sleeper must awaken     '
b'Hope clouds observation     '
b'Why r u using a hex editor? '
b'What r men 2 rocks n mountns'
b'Fear is the mind-killer     '
b'Angry ppl r not always wise '
b'The cyborg is our ontology  '
b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
b'We are the dreamers o dreams'

And thats all!

Other maybe easter eggs

I went looking for other easter eggs but I didn’t find any other super interesting ones.

The first 4 bytes of the Live binary are cafebabe but that might well be because its made in java. Theres also a function called rc2_magic_to_meth but I think it might just be weird terminology for the authentication system. Its pretty disappointing that this is the only easter egg I could find in the whole system.