She started dancing almost a quarter century ago ! Tribute to a demo that redefined the Amiga scene back then.
H=":X.%/P3C0/3**.'*6 38@FGK!]+q0m4N.FGNaXPIl>Y-&,X4C1.$.)%&'4 07AGP$T)p;l>]8M.FDL]XP;T3h:W-m-$%l4=-.' #(!$#.#+29CB$K(ZQXTH5ECH]WP>Z-m,$%k3H-0%)-%!-%+-7A@$G&QAUURVH>EFKeWN>_:Z";for(_='&255)_XSN^W;)(ter](inBch]="fyrgbJSX*Math.64harCodeJSc[c.";);c.AA0, s/XNXnHeight/127for(W)+,W*8, 7stroke()}.cAt(W++";=30;--{baarc( c)c[W[0]+[W[6]]]=W;B="RIFFAVEfmt "+atob("EAEQAcRwHEcAEACABkYXRh"=t=e=0;4e5>{s=((u=W&4095)&(u+1<<18+(W>>10&6))/u_/(u>>8)&112;e+=~~">]cXNX^c^^XJNJ">>11)/;B+=Strg.fromC((s+e|3*e)_}new Audio("data:audio/wav;base,"+btoa(B)).play(tanWidth/2,0scale(,ld]=4;setIntval(function(){gCsource-ova( "+&32?.05:1)+")fc-20 40 127("+8*++&31)+", 0)ba=e=56*[ 1,2,3,2,1,0][>>2)%7];56+e>l(H)-)*[1,-1][1&t/28],H)fill(gClightsS#0c0cos/16),39sS#808,4016},32';G=/[-^_]/.exec(_);)with(_.split(G))_=join(shift());eval(_)
SD0iOlgufyV/L1AzQzAvGDMOKhMqGy4nKjYgMxc4D0AORhNHGkshXStxMG00Ti5GR05hWH9Qf0lsPlktfyZ/LFg0QzEuJC4YKRIWFhYdJSYnNCAwFjcOQQ9HHVAkVClwO2w+XThNLkZETF1Yf1B/O1QzaDpXLW0tfyR/JWw0PS0uHScZICMLKAwhHiQjLiMrGDITORJDG0IkSyhaUVhUSDVFQ0hdV39Qfz5aLW0sfyR/JWszSC0wHiUdHykOLRAlIS0lKx0tFzcTQRxAJEcmUUFVVVJWSD5FRktlV39Ofz5fOloiO2ZvcihfPScmMjU1KV9YAVMBTl5XOykfKHQeZXIdXSgcaW4bAQEaQhpjGmgaGV09IhhmeRhyZ2IXAUoaUxpYFipNYXRoLhU2NBRoYXJDb2RlExYaARISSgFTARFjW2MuECI7EA8pOw4OYy4MQUELMCwJFXMbHi8IGQFYAU4BWAEHG24dSGVpZ2h0LzEyNwZmb3IoVwUpKxQsVyo4LAk3DHN0cm9rZSgpfQQuYxNBdChXKysDIjsFPTMwOy0tH3sQYmEcDGFyYygUAgUgGyBjKWNbV1swXStbV1s2XV1dPVc7Qj0iUklGRgVBVkVmbXQgIithdG9iKCJFCwtBRQtRQWNSdwtIRWMLQUVBQ0FCa1lYUmgiDgU9dD1lPTA7NGU1Ph97cz0oKHU9VyY0MDk1KSYodSsxPDwxOCsoVz4+MTAmNikpL3VfLyh1Pj44KSYxMTI7ZSs9fn4iBxkaGhoBBz4aXRpjGhoaGhFYEU4RWBJeFgFjAV4SXhFYAUoaThpKIgM+PjExKS8UO0IrPVN0chtnLmZyb21DEygocytlfDMqZSlffW5ldyBBdWRpbygiZGF0YTphdWRpby93YXY7YmFzZRQsIitidG9hKEIpKS5wbGF5KA4QdGEcG24dV2lkdGgvMiwwDHNjYWxlKAYsBg4QbGRdPTQ7c2V0SW50HXZhbChmdW5jdGlvbigpexBnQxhzb3VyY2Utb3YdDxdhKAkJCSIrHiYzMj8uMDU6MSkrIikPZmMcLTIwCQk0MAkxMjcOEBcoIis4Kh4rKyYzMSkrIiwJMCkPYmEcDgU9ZT01NipbCTEsMiwzLDIsMSwwXVsePj4yKSU3XTs1NitlPh8QbBwoSAMpLRQpKlsxLC0xXVsxJnQvMjhdLEgDKQxmaWxsKA4QZ0MYbGlnaHQdD3NTGCMwYzACFWNvcx4vMTYpLBQIMzkEEHNTGCM4MDgCLDQwCDE2BH0sMzIOJztHPS9bAi0fXl9dLy5leGVjKF8pOyl3aXRoKF8uc3BsaXQoRykpXz1qb2luKHNoaWZ0KCkpO2V2YWwoXyk=
// 28 points (x,y) for each silhouette
// H = [58,88,46,127,37,127,47,80,51,67,48,47,24,51,13,42,19,42,27,46,39,42,54,32,51,23,56,15,64,14,70,19,71,26,75,33,93,43,113,48,109,52,78,46,70,71,78,97,88,127,80,127,73,108,62,89,45,127,38,127,44,88,52,67,49,46,36,46,24,41,18,22,22,22,29,37,38,39,52,32,48,22,55,13,65,15,71,29,80,36,84,41,112,59,108,62,93,56,77,46,70,68,76,93,88,127,80,127,59,84,51,104,58,87,45,109,45,127,36,127,37,108,52,61,45,46,29,39,25,32,34,11,40,12,33,30,36,35,46,35,43,24,50,19,57,18,67,27,66,36,75,40,90,81,88,84,72,53,69,67,72,92,87,127,80,127,62,90,45,109,44,127,36,127,37,107,51,72,45,48,30,37,29,31,41,13,45,16,37,33,45,37,43,29,45,23,55,19,65,28,64,36,71,38,81,65,85,85,82,86,72,62,69,70,75,101,87,127,78,127,62,95,58,90]
H=":X.%/P3C0/3**.'*6 38@FGK!]+q0m4N.FGNaXPIl>Y-&,X4C1.$.)%&'4 07AGP$T)p;l>]8M.FDL]XP;T3h:W-m-$%l4=-.' #(!$#.#+29CB$K(ZQXTH5ECH]WP>Z-m,$%k3H-0%)-%!-%+-7A@$G&QAUURVH>EFKeWN>_:Z";
/////////////// SFX ///////////////
B="RIFFfor(WAVEfmt "+atob("EAAAAAEAAQAcRwAAHEcAAAEACABkYXRh"); // 18204 Hz, 8-bit single channel
// to match original tempo and have a
for(W=t=e=0;4e5>W;) { // power of 2 as the base note length
s = ((u=W&4095)&(u+1<<18+(W>>10&6))/u&255)/(u>>8)&112; // Drumloop derived from work by mu6k
// see http://www.pouet.net/topic.php?which=8357&page=19
// Oscillator for sawtooth lead instrument
// When iterating beyond the array bounds, ~~ coerces NaN to 0
e+=~~"BchXNXBchBchXNX>]cJSXJSXJSXJSNJSXJSXJSXXSNJSXcXSNJSXXSNJSXJSXJNJ".charCodeAt(W++>>11)/64;
B+=String.fromCharCode((s+e|3*e)&255); // Combine drumloop and lead, | with 3*e adds depth
}
new Audio("data:audio/wav;base64,"+btoa(B)).play(); // Wish there was a way to get rid of base64 here
// Move (0,0) to top center and scale so that the screen is 127 units high, keeping constant pixel ratio
c.translate(innerWidth/2,0);
c.scale(innerHeight/127, innerHeight/127);
c.lineWidth=4;
setInterval( function(){
c.globalCompositeOperation="source-over";
c.fillStyle="rgba(0,0,0,"+(t&32?.05:1)+")"; // Clear screen, or apply only a shade of dark
c.fillRect(-200,0,400,127); // Fullscreen at most screen resolutions
c.fillStyle="rgb("+8*(t++&31)+",0,0)"; // Drawing color for silhouette
c.beginPath();
// 28 points, 1 character for X, 1 character for Y
// 4 images in the same array, starting every 56 elements
// back-and forth animation of 4 images into 7 frames
// + mirror effect for the next 7 frames
for (W=e=56*[0,1,2,3,2,1,0][(t>>2)%7];56+e>W;)
c.lineTo((H.charCodeAt(W++)-64)*[1,-1][1&t/28], H.charCodeAt(W++));
c.fill();
c.globalCompositeOperation="lighter"; // Fake bitplanes effect using composite operation
c.strokeStyle="#0c0"; // First hypnotic pattern, medium green
for (W=30; --W;) {
c.beginPath();
c.arc(64*Math.cos(t/16),64*Math.sin(t/39)+64,W*8,0,7);
c.stroke();
}
c.strokeStyle="#808"; // Second hypnotic pattern, dark purple
for (W=30; --W;) {
c.beginPath();
c.arc(64,40*Math.sin(t/16)+64,W*8,0,7);
c.stroke();
}
}, 32); // Speed set to sync animation with sfx