325 words ~ 2-3 minsMathieu 'p01' Henri on September 14th, 2013

Javascript is jarig

Javascript is 18 years old! Let's celebrate with a nice little tune.

HETE DANS ACTIE, Javascript is jarig!

<body onload="for(r=q='data:audio/wav;base64,UklGRiQAAABXQVZFZm10IBAAAAABAAEA5h0AAOYdAAABAAgA',f=t=0;t++<6e5;q+=f&9)f+='G    G                    UZZUUZUZ5    5                    5    5                    P    P            PL        G            GC5    5(/(@5                                '.charCodeAt(t/1441%64)/500;new Audio(r+btoa(q)).play()">JS is jarig \o/

Our friends from Dead Horse JS, submitted this homage to JavaScript and Rob is Jarig in the 256 bytes intro competition at Function 2013 in Budapest, Hungary on September 14th, 2013.

A serious joke ?

This little production is quite interesting technically. It borrows the WAVE PCM setup from the 140b Music SoftSynth and HYPERSONIC MANDELBULB.

Melody Time

The catchy melody originally spans accross 3 patterns of 64 measures, including a "repeat" pattern at a different octave.

All the notes but one, are played on an even measure, and clearly there is no way to store 192 measures into 256 bytes. Exit odd note. Down to 96 measures. Still too much for 256 bytes. Exit repeat pattern. The 2 distinct patterns made it into a 64 bytes long string, and the smae oscillator is reused throughout the whole music.

Instead of using the character codes as MIDI note and compute the exact frequency as:

var note = melody.charCodeAt(t/tempo);
var freq = 440*Math.pow(2,note/12);
osc += freq;

This would have been sweet because it turned the melody into this string:

var melody = "V V     YZZYYZYZQ Q     Q Q     X X   XW  V   VUQ QLOLTQ        ";
// LOL!

But this approach leaves no room for visuals or even a title. Looking at the frequency of the notes used, shows that the was a relatively small margin of error by skipping the MIDI encoding and using the raw character codes as increment for the oscillator. This change saved a good 15 bytes!

var melody = "G    G     UZZUUZUZ5 5     5 5     P P   PL  G   GC5 5(/(@5        ";

var note = melody.charCodeAt(t/tempo);
var freq = note/500;
osc += freq;


Of course Javascript is jarig is available on