ACM Multimedia 2010 – Shawbak

Full title: Natural Interaction for Cultural Heritage: the archaeological site of Shawbak

Abstract: One of the most interesting issues in the field of cultural heritage is the adoption of multimedia systems for the visualization and organization of information. In this paper we present a natural interaction based system designed to represent multimedia contents related to the archaeological site of Shawbak, situated in the Petra region of Jordan. Contents are composed of texts, images and videos showing and explaining the archeological site areas and the history of the castle. This system was installed at the Limonaia di Palazzo Pitti (Italy) for the archeological exhibition called "From Petra to Shawbak".

Link to ACM portal reference.

AIS & ONAV Wine tasting application for Android - ALPHA

I started a personal project months ago, aimed at realizing a web and mobile infrastructure for wine tasting notes. During the same period I quit my old job, moved from my old flat in Florence to my wife's in London, found a new flat and a new job, moved again to the new flat, changed computer (the old one being back to the lab where I used to work) and started a couple of new projects, quoted in my previous posts.

I think it's enough to justify that my original project - for which I found what I think a cute name: "Cellarium" - is currently in stand by. Still I think it's a real shame, mainly for two reasons:

  1. there are not official AIS and/or ONAV wine tasting applications for mobiles in the cloud (or at least I didn't found them)
  2. being now in London, I must say that Italian wines are under estimated and are really hard to find (no, I'm not talking about the crap you usually pick up around)

I decided thus to put everything under github, and if a brave volunteer fancies a contribution, can easily download the source code here: http://github.com/grudelsud/com.londondroids.cellarium

If you are brave enough to read through the rest of the post, you will discover the following:

  • code is completely undocumented, shame on me, but I didn't have the time to do anything else, it's just there and you can use it at your own risk;
  • wines and wine tasting notes are stored in a sqlite database (stored in the mobile device) and I don't even remember its structure, the only way to retrieve how things are done is to take a look at the two inner classes defined inside CellariumProvider.java
  • saving and updating wines work fine, while wine notes still need a lot of coding, both from a data persistence perspective and interface implementation.

The application is intended to help while writing down wine tasting notes for both AIS and ONAV standards, as depicted in the following.

I'd be happy to help/contribute and finish the application, volunteers appreciated. If no one interested in this, I'll probably finish it when I'll retire, using Android v.714.23 on a nuclear-powered-artificial-intelligence-smartphone produced in Mars by Cyberdyne systems.

My first interactive banner was the #nikefuture 40m wide display in Johannesburg

After a month, a little bit more probably, of sufferings and efforts, we have press releases, thanks to @WKAmsterdam and their immense work. The first review I am reading is published on Cool Hunting, and it is pretty amazing to see some official pictures of our little preciousss.

Nike Life Center Johannesburg

I was involved in the Nike Life Center as project manager for the digital production, while freelancing with my funky buddies at The Rumpus Room. Our team was:

  1. Joel Baumann, Lead Creative Technologist
  2. Steve Wyles, Executive Producer
  3. Thomas Alisi, Project Manager
  4. Gerard Delmas, Software Developer

From a technical point of view, this huge display is rather simple, still interesting in some specific issues. Animations were developed in Flash using a heavily overrode Flint particle system. Headlines are pulled daily from a moderated feed and animated in 4 steps to create a full resolution portrait, the feed is UTF-8 encoded and the animation fully supports 16 languages. The moderation tool was developed by Deeplocal, Pittsburgh while the massive LED columns were installed by Spectrum, Johannesburg. Both the teams were super sharp and even if we worked with different timeshifts, and tons of emails, almost everything ran like a charme (er... last minute panic is always part of the game).

A super special thank and appreciation goes to Ross Plummer, mighty producer at Wieden+Kennedy Amsterdam, who has been enviably calm and steady even during the few panic attacks that sometimes could rise here and there across the world. The result is super cool, published tonight through Wieden's official press release.

Flux of MEME wins a research grant at Working Capital Bologna

It was the last of a sequence: the project was briefed, submitted for an elevator pitch, then checked in a couple of meetings, refined, presented again, and at the end it won. The project will be funded by Telecom Italia @workingcapital and was presented during the last Working Capital event in Bologna, June 9th 2010.

[youtube=http://www.youtube.com/watch?v=vR55dY8O1wU]

Goal of this project is to create a semantic web application capable of predicting the future through the analysis and clustering of concepts.

Memes flow through the social networks and can be paired with their geo-reference information to understand how they move in physical space. Terms used in a single meme describe its semantic domain and images, when present, can enrich their interpretation.

Now the research begins. Part of the semantic engine for term extraction and expansion is already working. From my personal point of view I think that two outcomes will be really important:

  • applying results on mobile devices - contexts still have to be defined, but mobile networks and entertainment is an immediate transfer for this project;
  • data visualization - huge amounts of data are useless if not digested and visualized in a simple and attractive way; at the moment I am exploring Processing, as it appears a good desktop environment, and this is the reason why I cited blprnt.com in my presentation.

Any suggestion and comment greatly appreciated.

Particle Animations with Flint

In the last few week I have been working on a project that involved the development of a particle animation system. The project is still under development and we are working under NDA: for this reason unfortunately I still cannot post any details about it, even though I will post details as soon as it goes live.

What I can definitely do is show the tests I had to develop using Flint particle animation system, developed by @Richard_Lord and give a brief explanation of the code, since I saw that a lot of people are having troubles with, to say the less, a little bit sparse documentation.

Let's show the results first, it is a tweaking of the logo tweener example found on the website.

[swf src="http://tom.londondroids.com/wp-content/uploads/2010/05/ParticleTest.swf" width=400 height=400 version=10]

It was not rocket science at all, since it was only matter of tweaking an already made example, still I noticed from the forum that loads of people got stuck while introducing some changes, and I had to go more in depth of some aspects related to EmitterEvents, ParticleEvents and Easing.

I wanted to use extensively the TweenToZone effect for a series of bitmaps which had to be displayed in the .swf, for this reason I decided it was better to create a class and reuse it when needed. The emitter can also reuse existing particles instead of blasting a complete new set of them, the code is the following.

public class Tweener extends Emitter2D
{
	public function Tweener( init:Boolean, bitmapFrom:Bitmap, bitmapTo:Bitmap, particles:uint, lifetime:uint, color1:uint, color2:uint )
	{
		if( init ) {
			counter = new Blast( particles );
			addInitializer( new ColorInit( color1, color2 ) );
			addInitializer( new Position( new BitmapDataZone( bitmapFrom.bitmapData, 0, 0 ) ) );
		}

		addInitializer( new Lifetime( lifetime ) );
		addAction( new Age( Elastic.easeInOut ) );
		addAction( new TweenToZone( new BitmapDataZone( bitmapTo.bitmapData, 0, 0 ) ) );
	}
}

Be aware of the fact that the Age initializer is using the easing function Elastic.easeInOut, and it is working properly if, and only if, the imported package is org.flintparticles.common.energyEasing.*

Another tricky problem was to create a loop of tweens without necessarily creating a listener function for each emitter, like the example shown in the website. And moreover, I did not figure out an elegant method to retrieve the instance of the emitter which was calling the ParticleDead event. For this reason, I decided to use the EmitterEvent EmitterEmpty and tweak the listener in order to restart the correct emitter as soon as its execution ends. The code is thus easily extendable, using arrays, to an indefinite amount of emitters and related events.

public function ParticleTest()
{
	stage.scaleMode = StageScaleMode.NO_SCALE;
	stage.align = StageAlign.TOP_LEFT;

	super();

	_renderer = new PixelRenderer( new Rectangle( 0, 0, 400, 400 ) );
	_renderer.addFilter( new ColorMatrixFilter( [ 1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0.92,0 ] ) );
	addChild( _renderer );

	runParticleDemo();
}

private function runParticleDemo() : void {

	var textBmp:Bitmap = new text();
	var imageBmp:Bitmap = new image();

	_loop = 0;

	_emitterLoop0 = new Tweener(true, textBmp, imageBmp, 8000, 9, 0xffff0098, 0xffffffff);
	_emitterLoop1 = new Tweener(true, imageBmp, textBmp, 8000, 9, 0xffff0098, 0xffffffff);

	_renderer.addEmitter( _emitterLoop0 );
	_renderer.addEmitter( _emitterLoop1 );

	_emitterLoop0.addEventListener( EmitterEvent.EMITTER_EMPTY, loopParticleEv );
	_emitterLoop0.start( );
}

public function loopParticleEv( ev:EmitterEvent ): void
{
	switch( _loop % 2 ) {
	case 0:
		_emitterLoop0.removeEventListener( EmitterEvent.EMITTER_EMPTY, loopParticleEv );
		_emitterLoop0.stop();
		_emitterLoop1.addEventListener( EmitterEvent.EMITTER_EMPTY, loopParticleEv );
		_emitterLoop1.start();
		break;
	case 1:
		_emitterLoop1.removeEventListener( EmitterEvent.EMITTER_EMPTY, loopParticleEv );
		_emitterLoop1.stop();
		_emitterLoop0.addEventListener( EmitterEvent.EMITTER_EMPTY, loopParticleEv );
		_emitterLoop0.start();
		break;
	}
	_loop++;
}

As should be clear enough from the code, listeners are removed from the emitter that has ended its execution and subsequently added to the emitter that is going to start. A global variable named _loop take care of switching to the proper emitter initialization function.