Generating Random Chiptunes on Linux


I like to listen to music while I work. I find - especially in an open plan office - that it is an essential aid to concentration.

That said, I find music with lyrics particularly problematic as my brain prefers to concentrate on the words rather than the task in hand.

On long flights, I often use a white noise generator to drown out sound.

I've recently started listening to random music. A simple command line script to generate a highly synthetic / chiptune / glitchnoise neverending piece of music.

This code is shamelessly ripped off from Robert Elder's blog post and the subsequent HackerNews discussion

cat /dev/urandom | \
   hexdump -v -e '/1 "%u\n"' | \
   awk '{ split("0,3,5,6,7,10,12",a,","); \
   for (i = 0; i < 1; i+= 0.0001) \
   printf("%08X\n", 100*sin(1382*exp((a[$1 % 8]/12)*log(2))*i)) }' | \
   xxd -r -p | \
   aplay -c 2 -f S32_LE -r 24000

Copy & paste that into your Ubuntu terminal and it should sound something like this:

I don't know enough music theory or maths to determine what will sound pleasant and what won't. But a little bit of fiddling got me this jaunty little number:

cat /dev/urandom | \
   hexdump -v -e '/1 "%u\n"' | \
   awk '{ split("0,1,2,4,8",a,","); \
   for (i = 0; i < 1; i+= 0.0001) \
   printf("%08X\n", 100*sin(1382*exp((a[$1 % 8]/12)*log(2))*i)) }' | \
   xxd -r -p | \
   aplay -c 2 -f S32_LE -r 30000

It's not quite up to the standards of Daft Punk - but it covers up the noise of the office and allows me to concentrate without (audible) distraction.


Share this post on…

  • Mastodon
  • Facebook
  • LinkedIn
  • BlueSky
  • Threads
  • Reddit
  • HackerNews
  • Lobsters
  • WhatsApp
  • Telegram

What are your reckons?

All comments are moderated and may not be published immediately. Your email address will not be published.

Allowed HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> <p> <pre> <br> <img src="" alt="" title="" srcset="">