diff --git a/javascript/examples/HTML5/Audio/blobb/blobb.pde b/javascript/examples/HTML5/Audio/blobb/blobb.pde
new file mode 100644
index 000000000..e01923c61
--- /dev/null
+++ b/javascript/examples/HTML5/Audio/blobb/blobb.pde
@@ -0,0 +1,130 @@
+/**
+ * Blobbbs.
+ *
+ *
+ */
+
+ Ball[] balls;
+ float maxSpeed = 0.5;
+ Audio audio;
+
+ void setup ()
+ {
+ size( 400, 300 );
+ }
+
+ void draw ()
+ {
+ background(75);
+
+ if ( balls != null )
+ {
+ for ( int i = 0; i < balls.length; i++ )
+ {
+ balls[i].update();
+ balls[i].draw();
+ }
+ }
+ }
+
+ void newAudio ( Audio a )
+ {
+ if ( audio == null )
+ {
+ audio = a;
+
+ balls = new Ball[10];
+ for ( int i = 0; i < balls.length; i++ )
+ {
+ balls[i] = new Ball();
+ }
+ }
+ }
+
+ class Ball
+ {
+ float px,py;
+ float dx,dy;
+ float rad;
+ float col;
+ float hitness;
+
+ Ball ()
+ {
+ rad = random(2,20);
+
+ px = rad + random(width-2*rad);
+ py = rad + random(height-2*rad);
+ dx = random(-maxSpeed,maxSpeed);
+ dy = random(-maxSpeed,maxSpeed);
+
+ colorMode(HSB);
+ col = color(random(255),200,150);
+ colorMode(RGB);
+
+ hitness = 50;
+ }
+
+ void update ()
+ {
+ px += dx;
+ py += dy;
+
+ hitness -= hitness/10;
+
+ if ( px-rad <= 0 || px+rad >= width )
+ {
+ dx *= -1;
+ playSound();
+ hitness = 10;
+ }
+ if ( py-rad <= 0 || py+rad >= height )
+ {
+ dy *= -1;
+ playSound();
+ hitness = 10;
+ }
+ }
+
+ void playSound ()
+ {
+ if ( audio != null )
+ {
+ audio.pause();
+ audio.currentTime = 0;
+ audio.play();
+ }
+ }
+
+ void draw ()
+ {
+ strokeWeight( hitness );
+ stroke(200);
+ fill(col);
+ ellipse( px, py, rad*2, rad*2 );
+ }
+ }
+
+ /* let Processing know about the HTMLAudioElement */
+ interface Audio
+ {
+ boolean muted;
+ float volume;
+
+ boolean loop;
+ boolean paused;
+ boolean ended;
+
+ String currentSrc;
+
+ float duration;
+ float currentTime;
+
+ void play();
+ void pause();
+
+ Audio cloneNode( boolean deep ); /*DOM*/
+ }
diff --git a/javascript/examples/HTML5/Audio/blobb/data/BD.mp3 b/javascript/examples/HTML5/Audio/blobb/data/BD.mp3
new file mode 100644
index 000000000..9d1aa49fe
Binary files /dev/null and b/javascript/examples/HTML5/Audio/blobb/data/BD.mp3 differ
diff --git a/javascript/examples/HTML5/Audio/blobb/data/BD.wav b/javascript/examples/HTML5/Audio/blobb/data/BD.wav
new file mode 100644
index 000000000..c8ac8535b
Binary files /dev/null and b/javascript/examples/HTML5/Audio/blobb/data/BD.wav differ
diff --git a/javascript/examples/HTML5/Audio/blobb/snd.js b/javascript/examples/HTML5/Audio/blobb/snd.js
new file mode 100644
index 000000000..4bd5364f2
--- /dev/null
+++ b/javascript/examples/HTML5/Audio/blobb/snd.js
@@ -0,0 +1,41 @@
+
+window.onload = function () {
+ var audioNode = document.getElementsByTagName("audio")[0];
+
+ function tryFindSketch () {
+ var sketch = Processing.instances[0];
+ if ( sketch == undefined )
+ return setTimeout(tryFindSketch,200); // retry
+
+ sketch.newAudio( audioNode );
+ }
+
+ addEvent(audioNode, 'canplaythrough', function () {
+ tryFindSketch();
+ });
+}
+
+// http://html5demos.com/
+var addEvent = (function () {
+ if (document.addEventListener) {
+ return function (el, type, fn) {
+ if (el && el.nodeName || el === window) {
+ el.addEventListener(type, fn, false);
+ } else if (el && el.length) {
+ for (var i = 0; i < el.length; i++) {
+ addEvent(el[i], type, fn);
+ }
+ }
+ };
+ } else {
+ return function (el, type, fn) {
+ if (el && el.nodeName || el === window) {
+ el.attachEvent('on' + type, function () { return fn.call(el, window.event); });
+ } else if (el && el.length) {
+ for (var i = 0; i < el.length; i++) {
+ addEvent(el[i], type, fn);
+ }
+ }
+ };
+ }
+})();