Wednesday, August 8, 2012

Why Microsoft's default Do Not Track setting is bad

This is a cross-post from the Simplare website.

There has recently been much debate over the tracking of users browsing the Internet. Many advertisement platforms such as Google's AdSense track users across multiple websites in order to customize the ads shown to the user. By learning more about the behavior of users it is possible to show ads that the user will more likely be interested in and thus more likely click on.

There are however a large group of users who does not like to be tracked and would prefer more generic ads. Their only way of preventing advertisers to track them has so far been to install software such as AdBlock, NoScript and FlashBlock. These solutions will remove ads entirely which is why advertisers are looking for a better solution which can cater to the privacy minded minority while still serving up ads for most of them (some will of course still remove ads altogether).

Enter, Do Not Track (DNT). This is a new header that the browsers can send to the websites, telling them to not track the user. The websites (and advertisement platforms) then need to look for this header and honor it. Since the system has so far been opt-in (you need to activate it yourself) most advertisers has decided to actually honor the setting.

But now Microsoft has decided to make the Internet Explorer 10 browser send out the DNT value of 1 (meaning users should not be tracked) by default. This is bad. Mostly because it will make it tougher for advertisers. But also for me.

On the Stoffi website I have put in place a few lines of code which looks for the DNT header and if the value exist and is set to 1 it will not include the Google Analytics code. I use Google Analytics to know how many people visit the website, where they go, which browsers they use, how they found us, etc. This information is very valuable to me as it helps me know how to best improve the website. I can easily find pages where users get stuck. I can see when someone wrote about us and starts to send us users, thus allowing me to visit that website and perhaps engage in a conversation by leaving a comment. I could see which languages we should focus on, and so on.

But if the majority of users will have the DNT header turned on I might be forced to ignore it as I will no longer be getting information about what is going on on my own website. I still can't track individual users, I can't follow a single person around on the website. However I felt that honoring the DNT header by removing the Analytics code was a great feature. I would love for Microsoft to reconsider and have the setting be opt-in, but it's starting to look doubtful.

Also, most advertisers will probably also start to ignore the header, thus defeating the whole purpose and rendering the effort moot.

Wednesday, August 1, 2012

Beta update: SoundCloud, radio, more cloud


Yesterday I handed in my thesis report to my supervisor. So now I have finally found the time to wrap up all the changes and new stuff in the alpha channel and moved it into the beta channel for testing.


This is quite a big change coming. First and foremost I've added support for SoundCloud streaming. It works just as you'd expect: there's a new SoundCloud item in the navigation tree and when you select it you get a list of the currently hottest videos. Type in a search in the search bar and you'll get the 50 most relevant results directly from SoundCloud. You can mix and match local files, YouTube videos and SoundCloud tracks in playlists and the queue.

Internet Radio

There's more streaming! I have also added Internet Radio to Stoffi. You can add radio stations by typing in the URL in the "Add URL" dialog. All radio stations will show up in the new Radio item in the navigation tree. Naturally, you can mix in radio stations in your playlists or queue. Note though that Internet Radio is eternal, so it will never reach the end. But that doesn't mean it's never a good idea to mix it in your queue or playlist. You can queue some local files, some YouTube videos and a pair of SoundCloud track, just to finish off with your favorite radio station at the end.

Playlist synchronization

The new cloud service that got started in a few months back is continuing. I have added playlist synchronization. So now you can setup Stoffi to synchronize all your playlists across computers. Stoffi will automatically add local files if they exist on two computers. For example if you have Bob Marley's One Love on your hard drive and add it to your Reggae playlist, it will show up on all other computers that also have the One Love file. Stoffi looks at the filename and length of the song. So even if the file is located in a different folder Stoffi will find it and add it to the playlist.

File and protocol associations

File associations have finally been properly taken care of in Stoffi. We previously used the built in stuff in Visual Studio's Setup project type. But the problem here was that if the file type was already "taken", Stoffi didn't get a hold of it. So if you had any other application registered for handling .mp3 files, then Stoffi could not associate itself with .mp3 files. Now, Stoffi will present a Windows 7 Task Dialog when you first start it and ask if you want to associate it with all supported file types. You can either accept, skip, or select which associations should be applied.

One of the coolest things with this new association code is that it will also associate Stoffi with some new URL protocols. This means Stoffi can now open some special links on the Internet. So on the website you can now see links to play songs or playlists in Stoffi. I will fully document how Stoffi expects these URLs to look so that other applications or websites can use them.


Thanks to Carl Carenvall we have a new and awesome plugin system in Stoffi. This was part of the 2011 Hackathon during last fall but wasn't finished and stable enough until now. But it was worth the wait. We have two plugins already: a basic visualizer which will show a spectrum line, and a Kinect plugin (this was actually my thesis project) which will connect the volume to the amount of dance in the room, so the more you dance, the higher the volume.

The plugin system will be expanded even further in the future. More filter operations will be added, a distribution and upgrade system for plugins will be created, and more documentation will be added like tutorials and example code, so that anyone can get started building plugins.

So get ready for even more plugin goodness in coming updates.

...and even more

I have also fixed a few bugs, added some minor enhancements, and tweaked some stuff. You can now have Stoffi pause at the end of each song, open files in Windows Explorer, and the details pane will now show information when you select navigation items.

The website has also gotten a minor face lift. It has a gray background with white behind the content which should make it easier to focus on the text. The blue and gold has been refined. The gradients are gone and typography is used more around the design. I really like the new design and hope you will too.

I have also added more third party services. You can now login with Windows Live,, Weibo, vKontakte, Yahoo, and MySpace.

Test it out

You can download the beta on the website. I have already started to deploy this upgrade to all people running the Stoffi beta so you may have gotten it already. Be sure to test it out, focus on the new stuff, and report all bugs you find as usual.


Monday, July 23, 2012

Project Dance Controller: Report 8

This post is part of Project Dance Controller.

It's a bachelor thesis project with the aim of letting the quantity of dance movements in the room control the volume level using the Kinect for Windows hardware.

You can read all reports here.

Last week

Nothing but report writing. I have managed to get the first three chapters done:

  1. Introduction
    1. Background
    2. Problem description
    3. Related research
  2. Application Programming Interface
  3. Implementation
    1. Device detection
    2. Depth data
    3. Motion analysis
Left now is the chapters that describe integration with Stoffi, results and conclusions.

I have also added some more references, now up to 15 papers, articles and books.


Finding time and usual but getting the correct wording is hard. I will iterate over the text when it's done and try to improve on some areas where the phrasing might be a bit too informal. It's always good to look at something twice.

This week

I will have the report finished by Friday and use the weekend to polish everything up a bit.


Time, time and time. But lack of that hasn't stopped me before. :)

Monday, July 16, 2012

Project Dance Controller: Report 7

This post is part of Project Dance Controller.

It's a bachelor thesis project with the aim of letting the quantity of dance movements in the room control the volume level using the Kinect for Windows hardware.

You can read all reports here.

Last week

Last week I was on a trip to southern Sweden. So that's why there was no report last Monday. This report will thus be about the week before that.

I managed to get the plugin ready and connected to the volume of Stoffi. I have tested the plugin with 1-5 people and it is working pretty well. There's an issue when the computer goes into hibernation and comes back. This will for some reason cause the volume to stagnate around 4 (of max 10). I have no idea why and will not dive into investigating this issue before I hand in the work.

I did not fully implement the new "Filter" type plugin. I have created hooks to allow the plugin to specify various distortions and manipulations such as echo, pitch, etc. I have, however, not connected these hooks to the audio stream.


I must admit that I am a bit chocked that the work has progressed so smoothly so far. When the plugin system was extended to allow plugins to alter the volume I could create a plugin and use the DanceAnalyzer library in one day. The majority of the time was spent trying to find good default value for sensitivity and viscosity (resistance to change).

This week

I will now start to write the report. This is what will happen both this week and the next. I aim at having a least more than half but preferably all of the report done by Sunday. That way I can spend most of next week polishing the report, tying up all the documentation, and package the library.


Same as always: trying to find enough time. Having a 5 month child is a lot of work but I remain optimistic. I have two weeks left, the report has already been started and I have weekly reports which I can use.

Monday, July 2, 2012

Project Dance Controller: Report 6

This post is part of Project Dance Controller.

It's a bachelor thesis project with the aim of letting the quantity of dance movements in the room control the volume level using the Kinect for Windows hardware.

You can read all reports here.

Last week

I have now extended the plugin platform of Stoffi to allow for a new kind of plugins called "Filters" which essentially are allowed to control and modify various aspects of the audio stream. I have specified the plugin base so it can add various distortions and manipulations but only implemented the actual volume modification into the audio stream itself.

I have added plugin labels so this plugin can show the status of the Kinect device. I also added a new type of setting: slider. It is created by adding a double or integer setting and setting a maximum value. I use this setting to allow the user to specify between which levels of volume that the plugin should operate.

Oh, and I have named the plugin "Shake It!".

Here's a screenshot of the new plugin management panel along with my current skeleton Shake It! plugin (named "Skaka Rumpa!" in Swedish).

I have pushed the documentation writing into next week. I will go on a trip to Skåne then and the car ride will be about 10 hours so writing documentation and the report will be the perfect activity in the car.


As usual the biggest challenge has been finding time. The technical part has been flowing very efficiently and great. Not a lot of problems actually.

This week

I will do my best to finish the plugin and incorporate the dance analyzer library into the plugin this week. When that is done all that is left is writing the report and filling out some of the documentation on the wiki.


Time, as usual. But I am actually doing pretty well and haven't fallen behind schedule yet so getting these last four weeks together will hopefully not be much of a problem.

Saturday, June 30, 2012

Alpha update: file associations, plugin management and SoundCloud

Time for yet another update to the alpha channel. This one contains some really major cool stuff.

File assocations

Stoffi will now show a task dialog when you run it the first time. It will let you either set Stoffi as your default music player (associating Stoffi with all extensions and URL protocols it can handle), choose yourself which associations you want to do, or skip the step entirely.

Quickly make Stoffi your default music player.

In addition to the usual file extensions such as mp3 and ogg Stoffi will now also register itself for some URL protocols. These includes playlist://, soundcloud:// and youtube://. This will allow us to post links and share music online and have it play in Stoffi with just a click.

Plugin management

Manage and configure plugins.

Plugin management has been improved with a dedicate page on the control panel where you can see all installed plugins, install new plugins or uninstall them. Plugins can now also define some settings which will be displayed when the plugin is selected in the list.


Stream music from SoundCloud.

You can now stream SoundCloud music directly in Stoffi! This one is really awesome and has made me discover SoundCloud for the first time. There's some really cool indie music there that I think a lot of you will enjoy. It works pretty much the same as our existing YouTube streaming instead it won't show a video. 

Radio stations

Listen to Internet radio.

I also added Internet radio streaming. You can add radio stations by pasting the URL. I plan on adding some stations which will ship with Stoffi so you can get access to some fine music streaming directly out of the box.

Other noteworthy stuff

What's the average size of my music files?

A pretty nice feature is that you can now check out the average length of the tracks in your Party playlist, or check out the total size of your music files. The details pane has been improved to show details for all items in the navigation pane.

Wednesday, June 27, 2012

Project Dance Controller: Report 5

This post is part of Project Dance Controller.

It's a bachelor thesis project with the aim of letting the quantity of dance movements in the room control the volume level using the Kinect for Windows hardware.

You can read all reports here.

My Internet connection was down so I didn't post on Monday as usual, that's why this post is a little late.

Last week

Last week I finished up the quantification of the movements in the depth frame. I've had the opportunity to test it out with three people and calibrate it to give some nice values.

The number is first derived from the depth frame by looking at each pixel and counting those where the depth differs by a certain amount, ignoring pixels with a value of -1 which indicates an unknown depth (due to problems with the surface and the IR laser). That gave me the percentage of pixels of the frame where movement had occurred.


I first tried to achieve some sort of S-shaped graph using the cubic root of the above value. This would mean that small movements didn't give too much effect and after a certain threshold the graph would slowly approach 10. But I never got it quiet right.

I also tried using a fraction graph leaving the independent variable as the denominator but that gave smaller movements to much effect, while using an exponential graph made it hard to have any effect while dancing alone.

So in the end I ended up with a simple, linear graph.

There was also the problem of the value changing very fast. I decided that the best approach would be the same one that TCP uses when it estimates the RTT value, namely using the formula old * a + new * (1-a) where a is a value between 0 and 1. The higher the value of a the slower the value will change, making it more resistant to temporary spikes and fluctuations (just as in the case of TCP and RTT). This worked really great.

This week

I will continue to further test out the stuff with different amount of people and distances. I will also add some of these calibration values as properties so they can be configured by the developer. I will also try to get some more documentation done and write a little on the report.

If there's time I will try to start adapting the plugin system in Stoffi so it can handle plugins which manipulate the volume.


The biggest challenge right now is finding time. But that's expected when you have a 5 month daughter, it's summer, I have two weddings to attend to and a trip to Skåne. But I'll do my best. The focus will be on writing on the report as well as improving the calibration and documentation of the library.

Update: cloud services, social sharing, donations and much more

Finally! It's here!

Yesterday I pushed out the new website and just a few minutes ago I released the latest upgrade of Stoffi. It contains mostly under-the-hood changes but there are some pretty neat features worth highlighting. Here's my favorites:

Cloud services

The biggest change has been on the website. It is now possible to register an account either by filling out a form or by logging in with either Facebook, Twitter, Google, SoundCloud, Vimeo or LinkedIn. The registration is very simple and easy. There's no confirmation step, no gender, no address, no security questions; if you use the form you only need to provide an email and choose a password. I've also kept security as a main focus when designing the account system.

The website has also gained the ability to have other websites or applications connect to it. For example in Stoffi Music Player you can now login to your account on and access that data. This opens up some really cool new stuff. For one you can now synchronize some settings between different Stoffi Music Players like your shuffle and repeat state or the volume. You can also login to the website and remotely control all players which are hooked up to the synchronization. This let's you see what song is currently playing, increase the volume, pause or skip to the next track.

The plan is to further expand the settings that can be synchronized. My goal is to have playlists, queue and history in the next version. Then expand further in the future with shortcut settings, equalizer, list configurations (sorting, columns, search, selection). The remote control will also be enhanced so you can browse your music and select which to play or queue, create playlists, etc.

Social network integration

If you have created an account and connected it to Stoffi and either Facebook or Twitter you can now share YouTube tracks with your friends. Just right-click the song and there will be a "Share" item.

In your account settings (accessible both via the website and inside Stoffi) you can choose where your share will appear (Facebook and/or Twitter).

This feature is pretty basic and I plan on adding the ability to attach messages to the sharing and select on a share-by-share basis on which services the song will appear.

Donation service

My favorite new feature is a new donation service where you can send money to support any artist you want. This cuts out most of the usual middle men and gives the artist the biggest share of the cake. The share of the artist is by default set to 80% but you can set it to anything you want. We also, by default, set aside a 10% share for charity.

The system uses PayPal and we don't save any sensitive information at all. 

Other noteworthy improvements

I have also added search indicators which show you where a search is currently active. This helps you spot why you're for example only seeing Eminem music in your collection of over 4,000 tracks. It also further illustrates how our three different search policies work.

By popular demand I've also added a playlist generator which let's you generate a list of songs by choosing randomly a given number of tracks from a larger set. This is very useful if you want to create a playlist to export to your MP3 player or burn to a CD for you care. In the next version I will add the ability to have the limit set in total size or total length instead of just number of tracks.

I am also very proud to announce a new language of Stoffi: German (thanks to Tom). There's some other minor enhancement, a ton of bug fixes and some improvements to stability and performance.

Sunday, June 24, 2012

We support Do Not Track

Good news, everyone!

I have just added a few lines of code to our upcoming website which will turn off our Google Analytics tracking if your browser sends out the DNT (Do Not Track) header. For more information on this feature and how to enable it in your browser you can checkout the DNT website.

Monday, June 18, 2012

Project Dance Controller: Report 4

This post is part of Project Dance Controller.

It's a bachelor thesis project with the aim of letting the quantity of dance movements in the room control the volume level using the Kinect for Windows hardware.

You can read all reports here.

Last week

The last days I have been busy trying to smooth out and fix the depth image that I get from the IR sensor. I have successfully interpolated missing pixels and applied a bitmask to isolate only bits indicating the distance to the object.

As a start here's a picture which has been shifted three bits. I have also translated the various depths into the colors blue (far away), green (middle) and red (near). Black areas are missing pixels. This is where the IR laser isn't able to determine the distance due to the material absorbing, refracting or diffracting the light, preventing it from reflecting back to the sensor. I also encoded pixels which have a higher depth than the max depth into white. There are no such pixels on this picture but they appear if I aim the Kinect toward something that's farther away than 4 meters.

A raw depth image.

Removing white pixels is very easy. All I do is set them to the max depth (4000) and they will appear blue. The black pixels however are more difficult. Here I decided to use the nearest neighbor interpolation algorithm to determine the value for each black pixel. What I do is that I start by looking around the pixel for any non-black pixel. I extend my search farther and farther out from the pixel until I find a pixel with a correct value. When I do I just give my black pixel that value.

An interpolated depth image.

This produces some artifacts since the scanning is linear (left-to-right top-down). The result is a lot of blocking and this actually creates more "noise movement" than the original depth image.

The interpolation plus bit shifting is done in 8-9 milliseconds (ms) which is pretty fast and allows me to process images at a rate of over 100 frames per second (fps).

I also tried to apply a mean filter after the interpolation to smooth out the blocking without removing edges but that cost some serious amount of CPU cycles and increased the time to over 30 ms giving me less than a 30 fps rate.


The biggest issue here is that the interpolation may remove "pixel noise" (pixels with unknown depth) but introduces more "movement noise" (the interpolation algorithm switches some blocks of pixels from green (around 2 meters) to red (around 30 centimeters). That's a lot of movement that does not actually occur.

So as much as it hurts I may have to skip the interpolation and mean filter all together and declare this week a week I just learned why certain techniques does not fit the purpose of my code. I should not see this as a failure, instead this week was the week I did interpolation and mean filtering for the first time, learning new and well-known algorithms in the field of image processing. However, neither of those algorithms works for me so I will just use the raw depth image when I move onto the next step: analyzing difference between two frames.

This week

So this week I will try to actually get a value between 0 and 10 out of the images. Even without interpolation there's still some noise movement so I need a way to remove that. I was thinking of dividing the image up in squares and analyse each square separately. To remove noise movement I will take 3-5 frames and calculate the average movement between the frames, then compare it to the average movement of the next 3-5 frames. This should keep my algorithm fast enough while still smoothing out movements caused by missing pixels.


The biggest challenge will be to account for the false movement of the missing pixels while still being able to do the processing fast enough for it to both feel responsive for the user and properly detect real movement in the picture.

If I have time and ability I should try to make the algorithm not give false positives when the camera is moved but I consider that low priority right now.

Saturday, June 16, 2012

Beta update: minor stability fixes

Time for yet another update to the beta. This time I've fixed a number of smaller bugs that have been found in the beta. Most notable is an added buffer to the synchronization which increases performance and stability in the sync system.

There's also some improvements to the volume slider which can now be used easier with the arrow keys. A rare crash during YouTube search has also been fixed as well as a crash when a library was changed outside Stoffi and for some reason Windows wasn't able to determine the library's type.

I've also fixed a crash which occurred if you dropped a bunch of files into Stoffi from the Explorer window when there was a scan already in progress.

Most of these bugs are small and/or rare which is a clear indication that the beta is becoming stable. Hopefully we can release all these new changes into the stable channel very soon. Please help us test out the new stuff, especially the new cloud stuff: sync, remote control, login, registration, facebook/twitter/google linking, etc.

I am also preparing a new update of the alpha version of Stoffi which will introduce quite a lot of new, fun stuff for you. Stay tuned!

Monday, June 11, 2012

Project Dance Controller: Report 3

This post is part of Project Dance Controller.

It's a bachelor thesis project with the aim of letting the quantity of dance movements in the room control the volume level using the Kinect for Windows hardware.

You can read all reports here.

Last week

I have successfully detected the presence of the Kinect device. My events Connected and Disconnected fire when the device is plugged or unplugged respectively. I also managed to get in some code to control the motor and retrieve the depth image from the sensor.

Regarding the exposure of the raw data there is a sensor class which I can just forward in a property to any caller so they can manipulate the sensor directly. I have not yet added that code but aim to do so this week.


I did not really have any problems, even though I was pretty sure last week there would be some. It's a really nice surprise when stuff actually just work out great.

This week

This week I will start to actually analyze the depth image. The data is a simple array of shorts. The array is of length FrameWidth x FrameHeight (640x800). There's several things I need to do before I can even start with the analysis. First of all the 16 bit shorts have three bits which is used to identify "layers" where players are detected. This detection is not very good and mostly only work in ideal conditions. So I will need to discard those bits by shifting the short three bits. The remaining 13 bits is the distance to the point in millimeters.

Next there's a lot of "holes" in the depth image due to the infrared laser not being able to detect certain surfaces. My coffee table, my hair, glass bottles and my shelf are some of the things which create these holes. However, these holes don't have a very clear border or edge, they kind of flicker. This creates "movement" in the image even though nothing is actually moving. I need a way to remove that "noise movement" from the image.


This preprocessing will create some overhead in my calculations for each frame. After reading up on the previous research done with Kinect depth images it seems that it will be hard to actually be able to process around 30 frames per second if I intend to continue on and detect heads as well. As an example one of my references which detects heads and then continue in that layer to extract the body (with mixed results) runs in over 27 seconds for each frame. That is totally unacceptable for me. My analysis can not take more than 60 milliseconds.

So the solution will be to again revise the plan. Instead of detecting heads I will just process the depth image this week and prepare it for next week when I will detect movements using two images. I believe that if I relate the movement to the distance I don't need to know the number of people in the room.

This should also help me get the whole analysis done in a fairly fast manner and let me keep a high bitrate from the sensor.

Friday, June 8, 2012

LinkedIn and eHarmony: good password security is not that hard

In light of the recent breaches of the two very popular websites LinkedIn and eHarmony, and investigating a password leak as well, I want to remind everyone to practice good password security. I also want to extend a small question to LinkedIn and eHarmony regarding their security practices: WTF?!

Tips for users

First of all, if there's only a single lesson that any user should take from all this mess it's this: never use the same password on two websites. If one of those websites is compromised your account on the other will easily be broken into as well.

Of course it's not very easy to remember a lot of passwords. You can either use a password locker like 1Password or divide websites into classes where you have different passwords for "important" websites like Google, your bank, Facebook, etc and then share a password on less important websites like forums you rarely visit. The former is of course more secure but it makes it a lot harder for you to quickly log into websites from a new computer.

Incompetent developers are dangerous

Now, when we've covered good password policy for users it's time to move over to the actual website operators responsibility. How can eHarmony talk about "robust security measures". First of all they did not salt their passwords. If you do not salt the passwords when you hash them you are doing the equivalent of putting duct tape around the door instead of locking it. With rainbow tables it's extremely easy to crack non-salted password hashes.

I would also want to know why eHarmony considers a load balancer a robust security measure. It's very apparent that these engineers are not very knowledgeable when it comes to Internet security.

But salting password hashes is not enough. One needs to use a strong hashing algorithm. eHarmony used MD5 which is old and dated. LinkedIn used SHA1 which is more secure. But even if you use a good algorithm and salt the hashes there's still room for improvement.

We take security seriously

As I've discussed before our upcoming account system uses a number of measures to further increase security. First of all we hash the passwords before they are sent to the server using the SHA256 algorithm and salting with the user's email. When the hashed password reaches the server it is again hashed using the SHA1 algorithm. This time we salt both with a random string which we store in the database but also with a random string which is stored outside the database. The reason we use a salt stored outside the database is because most password leaks only involve the attacker gaining access to the database, not the file system.

Furthermore the server side hashing is done several time over, not just once. This will increase the time it will take to crack the passwords by several orders of magnitude. Rendering virtually impossible to crack them.

Using all these things is not very hard. It takes less than a day to implement and should be considered common sense when it comes to security practices. Apparently there's lot of million and billion dollar companies out there that don't have the skill to properly secure their systems. Heck, Sony even stored their passwords and credit card numbers in plain text. That's beyond incompetent, that's dangerous!

But it can get even better

As a last note I want to mention two-factor authentication. Usually you need access to something you know in order to login to a website: your password. To get into your car or house you need something you have such as a key. Security measures could also include something you are (fingerprint, voice, retina scan). Two-factor authentication means you need two of these things. For example ATMs use two-factor auth since they both require something you have (card) and something you know (pin).

Website can use two-factor auth by requiring a password (something you know) and access to your cellphone (something you have) by sending you an SMS with a code to enter everytime you log into your account from a new computer. I would love to do this at Stoffi but sending text messages isn't free so for now we'll have to skip that. However, I recommend everyone to use it where it's possible, for example Facebook and Google.

Monday, June 4, 2012

Project Dance Controller: Report 2

This post is part of Project Dance Controller.

It's a bachelor thesis project with the aim of letting the quantity of dance movements in the room control the volume level using the Kinect for Windows hardware.

You can read all reports here.

Last week

I have created a skeleton library with some API calls which I have documented in code. I will use the generator from the Stoffi project to convert the specification comments into wiki pages so it can be read directly on the wiki. The code is available on GitHub.

I have also started to look through some of the code examples for dealing with the Kinect for Windows device in C#. It seems pretty straight forward to get the raw data. The tricky part will be to do something useful with it.

I've also uploaded the report as I promised in the last report. It's in docx format since it's a work in progress. I will create a PDF version when it's finished.


There were no problems with the code but I did find some problems with the plan to quantify movements according to fine movements in POIs.

Since I studied the reference material I mentioned in the last report I've come to the conclusion that I should use the depth image for analysis. It provides better means of finding edges (and thus humans) than the visible light camera since it can handle strange backgrounds, weird colors and bad or non-existent lightning. The skeleton tracking is a total no-go as it can only track to people at a time and it's very much hit and miss unless the person is positioned right in front of the camera with all limbs visible, facing forward.

So I have revised some of the plans a little bit. I will not try to filter out movement such as walking or going from sitting to standing. Instead I will do my analysis in two stages: first I will detect heads and count the number of people in the room. I will then quantify the total amount of movement, normalize it to scale, and balance it toward the number of people in the room. The backside will be that funny hats or other stuff touching the head will create a false negative but since the number of heads is only to better interpret the meaning of total movement it will not affect the outcome too much.

This means that two weeks will change. Instead of identifying POIs (head, hands, etc) I will detect heads and the week after I will quantify all movements in the depth image and relate that to the number of people detected. I have updated the schedule accordingly.

This week

Today I will start working on detecting the presence of a Kinect device and try to control its motor as well as getting the depth image from it. I will finally start to get acquainted with the Kinect SDK and really get to know the device. Most probably, I will learn some stuff which will force me to rethink the API or at least extend it a little bit. That's why I've kept the API very simple and basic.


The biggest problem I anticipate will be getting the device and my code to work together. It's the first time I've ever controlled an external device from code (never even read stuff from a webcam or microphone before) so there's a lot which can prove challenging. Hopefully though there's plenty of resources to guide me if I ever get stuck.

Monday, May 28, 2012

Project Dance Controller: Report 1

This post is part of Project Dance Controller.

It's a bachelor thesis project with the aim of letting the quantity of dance movements in the room control the volume level using the Kinect for Windows hardware.

You can read all reports here.

Last week

The last week I have been going through some previous research on the area of crowd analysis and human detection. I think that the best approach for me is to use the depth image that I get from the IR sensor. This makes it easier to detect humans against cluttered backgrounds or when occlusion occurs.

The skeleton tracking only allows for tracking of two persons at the time and puts some serious restraints on poses and positions making it unusable for my scenario.

I read a research report Ikemura and Fujiyoshi where they used a depth image from an flight-of-time (FOT) camera to detect humans in real time. They used a window based approach and were able to get the detection calculations down to 100 ms on an Intel 3 Ghz CPU. Their approach was not very robust against certain poses and positions, though. It also wasn't able to handle occlusions very well.

The work of Xia, Chen and Aggarwal from the University of Texas presented a different approach to detecting humans from depth images. They used the Kinect for Xbox360 device for retrieving the depth array and detected humans in three steps. First they narrowed down all areas where a human head may be using 2D chamfer distance matching. They then confirmed all heads by fitting a 3D model onto the area. Lastly, they expanded the section from the head to include the rest of the visible body of the human. This method improves on the window based method by Ikemura and Fujiyoshi but it still suffers from some limiations. It won't work very well if the person is wearing a hat or if part of the head is hidden.

In addition to reading up on some previous research I was also able to install my newly arrived Kinect for Windows device and write a skeleton report which I will be uploading to the repository on Wednesday when I get back home again.


I anticipated that it would be difficult to pick out good reference material and I still think I need to find more. But the 4 reports I've read so far have given me some very important insight into just was kind of methods may work and which won't.

This week

This week I will start to implement a skeleton library and document the API calls. This will help me get the API structure ready so I can early on see what works and what does not. The most basic things that my API should provide are some rudimentary detection of whether or not a Kinect device is connected to the computer or not. It should also provide some raw data from the depth sensor (possibly all raw data) so that the caller can get fine grained control if needed. That way if someone wants to use my dance quantifier in their own Kinect code they can piggy back my initialization and sensor detection.


I think the hardest part this week will be to find a good balance on the API between full coverage and simplicity. I need to both make it very easy to use but also provide full control of the device for advanced developers who want to make their own Kinect code work with mine.

Monday, May 21, 2012

Project Dance Controller: Report 0

This post is part of Project Dance Controller.

It's a bachelor thesis project with the aim of letting the quantity of dance movements in the room control the volume level using the Kinect for Windows hardware.

You can read all reports here.

This week

Still in its packaging.

It's the first week - the first day, even - of my bachelor thesis project. I got my Kinect for Windows unit a couple of days ago. Have been setting it up and trying it out. Not gone into any coding yet, though.

Time to get hacking!

This week I will mainly focus on planning the report. Before the week is over I will have written down a skeleton report which I can then continuously fill during the course. I will also have found all reference material I need for the report. Lastly, I will have created the structure of the API.

As of right now I have a rudimentary skeleton report with some background filled in. I am currently going through some previous research in the field of human-computer interaction and gesture based input.

I have found a few sources which I will use as references in my report. The first is the book "Designing Interactive Systems" written by David Benyon. This is where I learned most of the principles I used when designing the user experience of Stoffi. This project should continue to build upon those principles and strive after simplicity and being intuitive. The second source is a paper by Ernesto L. Andrade and Robert B. Fisher titled "Simulation of Crowd Problems for Computer Vision". I have only read the abstract yet but I hope it contains some valuable information on how to deal with modelling crowds. The third source is titled "Human Detection Using Depth Information by Kinect" written by Lu Xia, Chia-Chih Chen and J. K. Aggarwal. I will read it and explore the suitability of the depth map for solving my particular problem.

At the wiki I have started to draw up a rudimentary API. I will probably add some way of accessing the raw data to allow the caller to piggy back on my device initialization and management if they need their own fine grained analysis.


The biggest challenge will be to pick out the best reference material. There's tonnes of stuff out there and I need to find previous work which is as similar as possible to my project.

Sunday, May 13, 2012

Beta update: bug fixes and one intelligent queue

It's time for yet another beta upgrade. Stoffi got heavily tested by our dear beta tester Hylton a couple of days ago and I've finally been able to fix them all. A whopping 35 bugs has been squashed along with some minor tweaks to make the interface a bit more consistent and responsive (especially in the new cloud department).

I know that this is beta, but when I got this awesome feature request I just couldn't resist. I had to implement it.

Now, when you queue stuff, Stoffi will know in which order you selected the tracks and put them in the queue in that order. So if you hold down the Shift key and select some four tracks in random order, then right-click and select Queue, the tracks will be in the queue with the track you selected first in the top spot and the track you selected last in the last spot. No matter the order of the tracks in the actual list. Pretty awesome.

This is the forth beta of our upcoming new version of Stoffi and I will continue to hope (as I always do) that it will be the last before we can go stable. But if you find any bugs or problems, report them and I'll fix them. Stable should mean something. :)


(Oh, and as always, Stoffi will upgrade itself automatically if you're on the beta channel, otherwise you can get Stoffi Beta here.)

Thursday, May 10, 2012

Project Dance Controller: Introduction

It's another great moment for Stoffi. I have once again been able to combine my love for this music player with my studies. This semester is the last one before I get my bachelor degree in computer science here at Uppsala University and my thesis will be to bring some really kick-ass awesomeness to Stoffi: I will make to increase the volume the more you dance for it!

My thesis is being done under the department of human-computer interaction and I will use the Kinect for Windows hardware from Microsoft. Unsurprisingly the SDK is only available for Windows but there are some third party stuff out there which mean I can bring this to more platforms in the future if there's time and a desire for it. Always good to know.

The work will be going on for about ten weeks and I am starting on May 21st with two weeks of structuring and planning. This will be followed by three weeks of designing and implementing a library. If there's time I will integrate this into Stoffi, but I am prioritizing down this since the main goal will be to create the actual cool algorithms which will analyse your movements. I can always integrate it with Stoffi later if I need to.

This means that I will extend our existing plugin platform to allow for a new class of plugins: manipulation plugins. I thought stuff like this (volume manipulation), pitching, auto-tune, and so on could go into that category.

Just as with our Hackathon in 2011 there will be a report each week were I will summarize the work done, any challenges I encountered and also give a prognosis of how the coming week will go.

Sunday, May 6, 2012

Internet radio streaming

Just got some very cool new feature implemented in Stoffi: Internet Radio Streaming.

This feature was requested about a year ago but I've finally found the time to get around fixing it. The result is pretty neat.

First of all there's a new navigation item on the left hand called "Radio" where all your radio stations will appear. We plan on adding some preloaded stations later on but now you'll have to add each station manually. You do this by clicking on "Add" and then choose "Radio station".

A dialog will appear where you can enter the URL for the radio station. Stoffi will take either the direct URL to the stream, or the URL to a playlist (such as .pls or .m3u) which contains the streaming URL. If you keep the dialog open it will show the title of the radio station once it has loaded. If you close it by clicking Add before the station has been fully loaded (it may take a while depending on your Internet connection), the mouse cursor will change to indicate that it's loading and once finished the new station (or stations, if the playlist contains multiple stations) will appear in the list.

This is pretty basic stuff. What you expect from a music player able to stream Internet radio. But things get pretty cool when you combine this with the awesome power of Stoffi. One example is that you can create a fairly mixed queue with local files, YouTube tracks and a radio station.

This should arrive in the alpha channel pretty soon. I will probably release it some time after I release some beta stuff.

In the meantime you can help me by suggesting some radio stations we should ship with Stoffi. The more stations we have the better. What station do you want to see preloaded in Stoffi?


Thursday, April 19, 2012

Beta update: fixed serious crash and playback stutter

Time for a new beta release.

Had to rush this one out since the last beta release contained some really nasty bugs. First of all there was a bug causing a crash whenever a song ended and a new one was supposed to be played. Secondly, there was some serious stutter in the playback whenever the UI was under heavy load. Lastly, there was a bug causing the playlists not to appear when they were selected.

All of these were pretty serious (there's also to bug fixes regarding the context menu of tracks and one fixing missing search indicators on playlists, but they were pretty minor) so I just had to push out a fix before the end of the day.

A big hat tip to our wonderful beta tester Hylton for quickly finding these bugs and reporting them. The upgrade has been pushed out and should arrive on your computers the next time you start Stoffi.

Monday, April 16, 2012

Beta update: search indicators, copy and move operations, laptop shortcut profile


It was a while ago we had a release. My baby girl, now 10 weeks old, takes up most of my time.

However, thanks to my wonderful girlfriend I've had time to do some fixes and improvements on Stoffi between diaper changes. So here is a new beta, fresh from the oven.

This release contains some very neat indicators which show you where a search is active. Before it was easy to get confused when tracks seemed to be missing, only for you to discover that you had actually a search filter active. I added a little magnifying glass next to the list name in the navigation pane. If you hover your mouse over it you can see the exact search text that is active.

I've also added some new actions you can perform on tracks. First of all you can select multiple tracks and see their combined length and size. This comes in handy with two other new features, which allow you to move or copy files directly from inside Stoffi. You can now select a set of tracks, make sure they are of a certain size, and then move them to a destination, such as a MP3 player or a USB stick.

For those of you out there using a laptop and feeling a grudge over our use of numpad keys in our shortcut profile we now offer a laptop profile for you. This version replaces all shortcuts containing numpad keys, so it should make it easier to use. I've not been able to do any auto detection, though. So you need to switch to the new profile manually.

We have also gained a new language. Thanks to Tom Sokolinski we can now offer you Stoffi in a German version.

Lastly, there's a lot of bug fixes and other improvements. For one thing I've spent quite some time improving startup time. I've never been very satisfied with the time it takes to start Stoffi. For this release I stripped out all code running at startup and then carefully placed it back again, moving things to after GUI initialization or into background threads whenever possible. The effect on my computer was just below 5 seconds before the window is drawn. That's a pretty large improvement from before. Hopefully you will notice the difference.

As usual you should get this new update automatically if you're running the beta version. You can also download our beta here.

Friday, February 24, 2012

We ditched Go Daddy, and why you should too

We just completed our transfer of from Go Daddy to Namecheap. The website was down for a few hours but everything is now back online. The reason was not so much as to move to Namecheap, but to quit doing business with Go Daddy. We here at Stoffi are very concern with ethics and appreciate good moral values. Go Daddy is the opposite.

The first controversy over Go Daddy that I was told, by our very own Hylton, about was the fact that Bob Parson, CEO and founder of Go Daddy, likes to hunt elephants. The African elephant has a conservation status of "Threatened".

But Go Daddy don't settle for just one misstep. Last year when SOPA was hotly debated and a mass protest was being organized by major Internet stakeholders, Go Daddy went out and supported SOPA. This caused several customers to organize a boycott of Go Daddy. We participated in this boycott but our transfer was delayed due to Go Daddy locking our domain for transfer due to a change of contact email. The boycott forced Go Daddy to reverse their stance on SOPA but as they say: Fool me once, shame on you. Fool me twice, shame on me.

It doesn't end there however. Recently Go Daddy was involved in another controversy where they, in cooperation with the Secret Service, shut down popular form website without any due process or even a notification to the owner. Apparently there was some content on JotForm created by one of its millions of users that the Secret Service wanted to get rid of. But instead of notifying JotForm and asking them to remove the content (which they have done on other occasions), the whole website was shut down. When Go Daddy finally reactivated the website they did not bother to contact the owner. Instead he was notified by Nate Anderson, a journalist at Ars Technica.

Of course, there are many more controversies regarding Go Daddy. If you are a customer we ask you to follow us and move to any other registrar. Vote with your money. Go Daddy has shown on countless occasions that they do not value their customers very highly. Moving your domain is very easy and you can even do it without downtime.

Think of the elephants!

Sunday, January 15, 2012

Project Visual: Summary and remaining reports

Since the last post we have been very busy. The plugin system itself is working, loading and managing plugins nicely, but apart from that we have also integrated OpenGL through OpenTK. This means it is now possible to draw anything using OpenGL and it will be displayed on a canvas in Stoffi. We did run in to some technical difficulties with loading plugins at first, and when that was done we had some problems getting the plugin assembly to draw.

What was Project Visual
Project Visual set out to become a plugin based visualizer for Stoffi. We wanted anyone with C# skills to be able to make a visualizer.

OpenGL was desired due to being platform independent. There were several ideas for future development as well, but this was at the heart of it. Visualizers can be fun, but why not give the creativity to you, the user?

During the development of Project Visual the focus slightly changed from being just on a plugin based visualizer to being on a plugin system that could be used to make it possible to develop plugins for other parts of Stoffi as well.

Though we have succeeded in both making a general plugin system which in the future might mean that users can code their own parts of Stoffi, the visualizer is perhaps not as fancy as i set out to make it.

Here is where you will find the visualizer in Stoffi.

Making a Visualizer
Anyonw who wants to code a visualizer could do so with the current system. All you have to do is create a C# project, hook it up to a provided DLL, inherit class in said DLL and just implement a Refresh function. In this function it is now possible to draw anything using OpenGL, and it will be displayed on a canvas. But what is a visualizer if it's just pretty images? Shouldn't it move to the music? Indeed it should, which is why we provide the raw FFT data. Though not filtered in any way, this 1024 array of floats is a good base for building a visualizer. You could indeed code your own filters for this data as well.
When a visualizer is done it just have to be packaged into an SPP (Stoffi Plugin Package) file and either put in the plugin folder or dragged into Stoffi, and it will be loaded.

Just look how pretty it is.
(Please note that this was whipped together in a matter
of minutes with limited previous knowledge of OpenGL.)

The Future
At present it is only possible to get FFT data when playing local files, and not for YouTube. This is because they are not played in the same way. We consider this high priority and more of an issue compared to other future features.

There are several interesting ideas for the future of this feature. Of course you can probably look forward to being able to program other kinds of plugins in the future, but the visualizer alone holds some interesting future possibilities.

First of all the visualizer system should provide some functions which will enable you to make basic, but interesting, visualizers without being a C# or openGL guru. Second, it should provide some nice filters for the data. The idea is that we want to make it simple for as many as possible to make cool visualizers.

There are some interesting possibilities in making interactivity possible. Imagine being able to play a game inside Stoffi, or make your own music based game, with the comparatively easy to use tools provided. This also brings up the future idea of looking ahead in the data. This will mean analyzing a song ahead of time, which should bring interesting possibilities not only to interactive visualizers, but to visualizers in general.

Saturday, January 14, 2012

Updated blog design

The blog has been redesigned to better fit in with the design of the new, upcoming website.

You can change the layout by using the drop down menu in the upper left corner. The about pages are gone and in their place are a bunch of links to the website, the project site and to third party sites such as Facebook, Twitter and YouTube.

Hope you like it.

Tuesday, January 10, 2012

Alpha update: plugins, cloud, social

A new update has been sent to the alpha channel. Since the alpha channel hasn't been updated in a while most of these updates have already been available for some time in the beta channel. But there are some new stuff in here as well:

  • A new plugin system for visualizers
  • A welcome dialog for file associations (which doesn't do anything yet)
  • Icons indicating whether or not a search is active
  • Several bug fixes
Along with these the latest stuff from the beta channel is here as well: improved icon rendering, cloud connectivity and the ability to share songs on YouTube.

Project Social: Summary

Now the time for hackathon has come to a close and this project with it.

What was Project Social all about?

This project was about getting to share your songs and playlists through our newly created cloud system to Facebook, Twitter and Google+. For the most part it had the features we wanted to implement to Stoffi but what wasn't implemented I'll be talking about soon.

Sharing songs

The main goal of this project was to share a song, and to share it with ease. So putting it in a single button that would handle everything was obvious. Of course, you would need to be connected to a Stoffi account before sharing anything.

"Share" has been added to the context menu.

It's also required that the account is also in turn connected to Facebook, Twitter and/or Google+ before the song can be shared onto those sites. But that isn't needed to share at all since it's also uploaded to the account which has all necessary information, including your songs and playlists.

What's to come

The features that are still to be implemented are the abibilty to share a playlist and share a song to Google+.

Sharing a playlist proved to take some more time than what we thought so we felt it was best to postpone it to make time for the other features for this project. And sharing to Google+ has to wait as we're waiting for them to release their API so it can be possible to share.

One other thing that we had an idea of but didn't get to realize it in this project was to be able to stream music from your Stoffi account to other users and be a DJ to your friends! The problem that we had with this was more legal than anything else as you're not allowed to stream the music to too many people at the same time.

Project Remote: Summary

What was Project Remote?
Project Remote was part of the Stoffi Hackathon 2011 and was the realization of a remote control app for stoffi desktop players.

The app used the REST-ful interface of Project Genesis to push changes in a users configuration to the server, which then pushed the changes to the client being controlled.

The first part of the project was to securely connect to the cloud services of Stoffi. GTMOAuth, an open source OAuth library for iOS, was used to a accomplish this. To sign in, the user is presented with an embedded browser with the login page. This way, the user can also login using Facebook, twitter, linked in or other social networks thanks to the existing login system.

The second time you start the app, you will notice that no credentials are needed to login. The app automatically stores the authentication token and session information to restore a secure connection each startup. This information is, of course, erased if you choose to sign out of the app manually.

The remote
A one-view interface was created containing the various playback controls required. Several designs were tried and discarded and I ended up with a quite simple design that focuses on the most basic playback controls: current track, play/pause, previous/next and volume.

The design was created to give the feel of a remote control rather than a music player. This was achieved by removing direct playback control: The user cannot view his music library from the app. Instead, the app contains only the most basic interface elements required to remotely control a music player, similar to a stereo hardware remote.


The app was created with english as its default language and was localized for swedish using the native localization tools for iOS. The app will change the language automatically if you change the system language of your device.

The language files have a very simple format that can be directly sent to translators without any need of programming experience. The localization file currently consists of as little as 11 entries, making the translation work even easier.

Snap Play
To give the app uniqueness and "Wow"-effect, the Snap Play feature was added.

Snap Play allows you to hit "Play" without actually touching your device: When activated, the current track is paused and the app enters a listening mode that detects sudden peaks in volume. Once you snap your fingers, the current song starts playing.

The future of Stoffi Remote
The remote has a lot of room for improvement. Once Stoffi cloud services supports track history, queue and playlists, a lot of new functionality can be added. As the server is quite slow at the moment, all playback changes are quite delayed. Future versions of the app should display this to the user to give you a better feel of what's happening.

The current audio analysis of Snap Play is very simple and only registers changes in decibel. As a result, speaking can unintentionally trigger the feature. This can unfortunately only be fixed by adding pitch analysis, as speaking gives a very loud peak in volume. As a temporary safety measure, the feature is disabled if it detects too much background noise. Adding a better audio analysis function for this feature would greatly improve its "Wow"-effect and make it a much more impressive feature.

The app will be available for testing soon!

Project Genesis: Summary

The 5 month long hackathon draws to an end and we have handed in our first draft of the final report. On Wednesday we will have a demo of the resulting work for our coordinator.

The new "Service" settings where you connect Stoffi to the cloud.

In this last blog post I will summarize Project Genesis and the work that has been created in it's name.

What was Project Genesis?
The project was the birth of our cloud platform. By connecting the Stoffi Music Player to our cloud we will be able to provide countless of new services and cool features, both inside the player itself and as external applications.

Project Genesis was part of the Stoffi 2011 Hackathon which was a joint effort by a group of students at Uppsala University, part of our studies in Computer Science.

Account system
The first thing I did was add the ability to register and login on our website. To ease this process I decided to use OAuth which lets you register using your account on Facebook, Twitter, Google, Vimeo, SoundCloud, Rdio or LinkedIn. Thus, there's no need to create yet another password to remember.

The login screen inside Stoffi Music Player

For those of you who do register, you will notice how little information you actually need to type in. You only need to type in your email address and choose a password. There's no name, no age, no "which company have you worked for or schools have you attended" stuff. Email and password. That's it.

The registration form on the website

I made this choice since I want to limit the amount of personal information that you, our users, need to give us. This limits the impact a breach of security would have in case it would happen. To further enhance security I have enforced the use of a secure connection, password are hashed before submission, hashed further, even several times, before they are stored in the database and the hashing uses user specific salts and another salt which is not inside the database.

Hopefully, this will make it a bit easier for everyone to sleep at night.

With account systems in place and the ability to connect Stoffi Music Player I created the first cloud feature: synchronization.

I started simple and added synchronization of volume, repeat state, shuffle state, media state (paused or playing), and the current track. I also added API calls to tell connected players to switch to the next or previous track.

While Fredrik was busy creating an iOS app named Stoffi Remote which would use this API as a remote controller for Stoffi, I created a web interface to do the same. Since this would mostly be used on phones I made a mobile version of our website as well.

The My Stoffi page on the mobile website.

Once you have connected a Stoffi Music Player to the cloud and enabled synchronization you will be able to remotely control it using a normal browser on any computer, using a browser on a phone, or by using our new Stoffi Remote app for iPhone, iPad and iPod.

Remote controls on the mobile website.
In the next coming months I will further expand this feature. There's so much potential here.

Listening statistics
As part of Project Mind Reader, I and Martin decided to let you submit what songs you are listening to up to our server and there have us analyze the pattern in order to give you suggestions based on that. Of course. His project was not finished in time but we hope to have it ready within a few months. In the mean time you will at least have some rudimentary statistics on what your favorite artists and songs are.

This feature is of course opt-in, which means that it will not be enabled by default. After you connect Stoffi Music Player to your cloud account you will need to enable submissions of the songs you listen to. Everything to ensure privacy.

Donations to artists
Another new cool feature which is not exactly part of Project Genesis, but could be integrated with the new cloud is the ability for you to send money to any artist. You will only be able to send money to artists that have appeared in any form on the cloud system (by sharing, listening, synchronization). As people use our cloud more and more artists should appear.

The artist page on the website.
Each artist will be shown with the top songs, a short description from Wikipedia, a profile picture as well as a button to send them money.

When sending money you can select how much to send, what should happen if we can't find or reach the artists and how to distribute the money among the artist, us (Stoffi) and charity.

The donation form on the website.

You will be able to see the artist that have received the most donations and how much charity that artist has  generated.

Hopefully this will be an interesting new way for artists to generate income as well for us to get a way to pay some of our bills (hopefully).

Where to go from here
There's a lot more that can be done with all these new and shiny things. First I plan on adding synchronizations of playlists. I also plan on adding further integration with Google and YouTube, so you can import and synchronize playlist on YouTube as well.

I also want to add more services such as Yahoo! and MySpace. We are also waiting for Google+ to release their API and for Facebook to open their new Open Graph API so we can send the songs users listen to.

Do you have any suggestions on cloud services you think would be nice? Please let me know in the comments.