10 PRINT THEREMIN AT WEB REBELS

303 words ~ 2-3 minsMathieu 'p01' Henri on June 2nd, 2016

10 PRINT THEREMIN at WEB REBELS

A lighting talk about labyrinth generation and theremin instrument using the Web Audio API in 219 bytes presented at Web Rebels 2016.

Web Rebels

Web Rebels is dear to my heart as it was the home of my first conference talk in 2012. They always have a great lineup and impressive organisation. I had the chance to attend again this year and present a lighting talks about labyrinth generation and the Theremin in a handful of bytes.

You can skip through the slides and demos

The labyrinth

We already talked about the famous 10 PRINT CHR$(205.5+RND(1)); : GOTO 10 in thread.js where we reached 64 bytes with the following program and the full width diagonal UNICODE charaters and the ZERO WIDTH SPACE:

<p onmousemove=b.innerHTML+='​╱╲'[event.screenX%3] id=b>Hi

However it is possible to reach 56 bytes and catch the mousemove event on the whole page:

<html onmousemove=innerHTML+="​╱╲"[event.pageX%3]>

You can try it LIVE.

Theremin and Web Audio API

The theremin is the Hello World of audio synthesis. This intstrument was invented around 1920 by Leon Theremin and uses two antenas to detect the distance of the hands of the player to adjust the picth and volume of a simple oscillator.

Using the Web Audio API, makes this trivial. We need an AudioContext, a GainNode and an OscillatorNode, connect them all together and map the volume and frequency to the mousemove event. Combined with the labyrinth generation above, we get the following 219bytes

<html onmousemove='if(h)with(new AudioContext)o=createOscillator(),o.connect(g=createGain()),g.connect(destination),h=o.start();with(event)innerHTML+="​╱╲"[g.gain.value=pageY/999,(o.frequency.value=pageX)%3]'id=h>

You can try if LIVE.

Closing words

Starting this little project I was confident to reach 256 bytes but didn't expect to go as low as 219 bytes. By experience I am sure other code golfers could save a couple of bytes.