Web page (840/796 characters)
>>> Start playing (Internet Explorer is not supported for multiple reasons; Google Chrome and Opera work best.)
I probably could make this a bit shorter, yet it is a good start. The lower score is after replacing all occurrences of
with the character itself and removing the keyword new
, the latter change breaking Google Chrome compatibility.
<style>table{border-collapse:collapse;border-width:1 0;border-style:solid;font-size:64;line-height:2}td{border-style:solid;border-width:0 1}</style><table><td colspan=3 title=0> <td bgcolor=black colspan=2 title=1> <td colspan=2 title=2> <td bgcolor=black colspan=2 title=3> <td colspan=3 title=4> <tr><td colspan=4 title=0> <td colspan=4 title=2> <td colspan=4 title=4> </table><script>for(A=[y=5];y--;){for(s=x=64e3;x--;)s+="~ "[x*(268+17*y)>>13&1];A[y]=new Audio("data:audio/wav;base64,UklGRiXuAgBXQVZFZm10IBAAAAABAAEAQB8AAEAfAAABAAgAZGF0YQHuAgCA"+btoa(s))}setInterval("for(y=5;y--;)with(A[y])volume=volume&&Math.exp(-currentTime)",99);onmousedown=function(e){if(z=e.target.title)with(A[z])play(currentTime=0,volume=1)};onmouseup=function(e){if(z=e.target.title)with(A[z])pause(volume=0)}</script>
Save this code as a text file with a name ending in .htm or .html and open it in Chrome or Opera (Safari might also work), or just open the solution's JSBin page to start playing. I reused the WAV file header from my solution to the Twinkle Twinkle Little Star code golf problem.
An important feature is that the sound diminishes as time passes. To observe this behavior, try holding down a key for a few seconds and listening to what happens.
Here is a more readable version of the code:
<style>
table {
border-collapse: collapse;
border-width: 1 0;
border-style: solid;
font-size: 64;
line-height: 2;
}
td {
border-style: solid;
border-width: 0 1;
}
</style>
<table>
<td colspan=3 title=0>
<td bgcolor=black colspan=2 title=1>
<td colspan=2 title=2>
<td bgcolor=black colspan=2 title=3>
<td colspan=3 title=4>
<tr>
<td colspan=4 title=0>
<td colspan=4 title=2>
<td colspan=4 title=4>
</table>
<script>
for (A = [y = 5]; y--;) {
for (s = x = 64e3; x--;)
s += "~ "[x * (268 + 17 * y) >> 13 & 1];
A[y] = new Audio("data:audio/wav;base64,UklGRiXuAgBXQVZFZm10IBAAAAABAAEAQB8AAEAfAAABAAgAZGF0YQHuAgCA" + btoa(s));
}
setInterval(function() {
for (y = 5; y--;)
with (A[y])
volume = volume && Math.exp(-currentTime);
}, 99);
onmousedown = function(e) {
if (z = e.target.title)
with (A[z])
play(currentTime = 0, volume = 1);
};
onmouseup = function(e) {
if (z = e.target.title)
with (A[z])
pause(volume = 0);
};
</script>