How mood and tempo can influence artist discovery?

If you log-in to Deezer, Spotify, YouTube, etc. to listen to a particular artist, you can simply pick their top-tracks. Yet, while they’re the most popular, they are not necessarily the ones providing a good understanding of their style, or – on the opposite – might not surprise you enough. Plus, depending on which platform you use, unexpected results can appear!

Using the Gracenote API, here’s an experiment using their mood and tempo detection features to answers questions like “What a band generally plays”, “How eclectic an album is” or “How can I listen to something unexpected my favorite artist”.

You Can’t, You Won’t And You Don’t Stop

First, let’s try to understand how eclectic an artist is: do they tend to play diverse style, or do they stick to common patterns? In the first case, is that something we can experience through a single album, or did they simply switch genres over the years?

Take for instance the Beastie Boys, who played hardcore punk in their early years, before becoming hip-hop stars in the 90’s. If you look as their old recordings, compiled in “Same old bullshit“, you’ll find the following top-3 tempos and moods.

Beastie boys - Some Old Bullshit
# Tempo
- Medium Tempo: 8 (57.14%)
- Fast Tempo: 6 (42.86%)
- Medium Fast: 5 (35.71%)
# Mood
- Aggressive: 8 (57.14%)
- Cool Confidence: 4 (28.57%)
- Heavy Triumphant: 4 (28.57%)

While a more recent record like “Hello Nasty” seems to leave away the aggressive parts of their early years, even though the defiant mood is definitely here to stay!

Beastie boys - Hello Nasty
# Tempo
- Medium Tempo: 21 (95.45%)
- Medium Fast: 12 (54.55%)
- 90s: 7 (31.82%)
# Mood
- Attitude / Defiant: 7 (31.82%)
- Defiant: 7 (31.82%)
- Cool Confidence: 6 (27.27%)

Looking at individual albums, there are interesting patterns as well. London Calling from The Clash combines elements of Punk-Rock, Jazz, Ska, R&B and more. Consequently, lots of different moods are covered in the same album:

The Clash - London Calling
# Mood
- Rowdy: 5 (26.32%)
- Excited: 4 (21.05%)
- Ramshackle / Rollicking: 4 (21.05%)
- Cool: 4 (21.05%)
- Loud Celebratory: 3 (15.79%)
- Casual Groove: 3 (15.79%)
- Carefree Pop: 2 (10.53%)
- Upbeat: 2 (10.53%)
- Empowering: 1 (5.26%)
- Cool Confidence: 1 (5.26%)

Fear of the Dark

On the other hand, some bands didn’t significantly evolved during decades. Running the same test on the first and most recent studio albums of Iron Maiden (“Iron Maiden” and “The Final Frontier“) shows that tempo remains the same, while the Defiant mood is still a strong part of their style, 30 years after their first release.

Iron Maiden - Iron Maiden
# Tempo
- Medium Tempo: 6 (75.00%)
- Medium Fast: 5 (62.50%)
- 100s: 4 (50.00%)
# Mood
- Defiant: 5 (62.50%)
- Hard Positive Excitement: 3 (37.50%)
- Hard Dark Excitement: 2 (25.00%)
Iron Maiden - The Final Frontier
# Tempo
- Medium Tempo: 6 (60.00%)
- Medium Fast: 4 (40.00%)
- Fast: 3 (30.00%)
# Mood
- Defiant: 6 (60.00%)
- Heavy Brooding: 6 (60.00%)
- Brooding: 2 (20.00%)

Finally, for all their studio albums (143 tracks), we have:

Iron Maiden
# Tempo
- Medium Tempo: 88 (61.54%)
- Medium Fast: 55 (38.46%)
- Fast Tempo: 53 (37.06%)
- Fast: 44 (30.77%)
- Medium: 31 (21.68%)
- 100s: 26 (18.18%)
- 80s: 21 (14.69%)
- 90s: 14 (9.79%)
- 130s: 12 (8.39%)
- 140s: 12 (8.39%)
# Mood
- Defiant: 72 (50.35%)
- Heavy Brooding: 33 (23.08%)
- Hard Dark Excitement: 30 (20.98%)
- Brooding: 26 (18.18%)
- Rowdy: 18 (12.59%)
- Confident / Tough: 10 (6.99%)
- Hard Positive Excitement: 9 (6.29%)
- Aggressive: 9 (6.29%)
- Heavy Triumphant: 7 (4.90%)
- Alienated / Brooding: 7 (4.90%)

This becomes interesting in terms of discovery. if you want to listen to typical Maiden, just pick a mid-tempo track with a defiant mood: “The Trooper” is one of them. On the other hand, let’s imagine you’re into something more obscure, pick an Alienating 90s-BPM track, like “Mother Russia“.

If you want to run similar experiments on your favorite albums, simply set-up an account with the Gracenote API, and get the small Python class I’ve build for the analysis.

@seevl’s DJ, Twitter, and the Semantic Web

As most of my side projects, “seevl DJ” started as a quick hack on a sunday afternoon. Yet, it has been quickly picked and featured on Fast Company and Hypebot, and also got some attention on Twitter itself.

With a little help from my friends

I’ve spend some time improving it so you can use additional commands, e.g. “a song by”, “play me something like”. In addition, it now uses the Freebase / YouTube mappings combined with the seevl API in order to find an artist’s videos (when using a genre / label / related query).

Last but not least, you can now use “/cc @user” and “for @user” in your Tweet to send a track to any of your friend, the music video being available directly on their feed through Twitter cards (Web and mobile).

Services, actions, and payments on Twitter

Thinking again about Twitter as an intelligent agent on the Web, let’s be bold and imagine this integrated with the buy / Stripe integration. While it’s now used to buy stuff, what about paying for services with it? “Hey @uber, bring @myfriend here”. “Hey @trycaviar, sushis for 6 please”. Both answering with an automated tweet embedding a Buy button so you can validate the order; and get your black car or food home within minutes. All through Twitter.

Natural Language Processing is one way to enable this, but another one is to pre-fill such “service-based tweets” so that users would just have to complete a few fields (e.g. number of people when messaging @opentable). This makes things much easier from the processing side, also providing a friction-less experience to users. Technically, the intelligence can be brought by actions, as I’ve wrote in the past, using JSON-LD as the supporting data serialisation.

A similar approach is used in Gmail (see for instance the Github integration). So, Twitter, what’s your next move to also embrace the Semantic Web?

Remove inactive Twitter followees with this tiny Python script

I recently reached the Twitter limit to add new followees so I’ve wrote a tiny Python script, Twitter Cleaner, to remove people who haven’t send anything for a number of days (30 by default) – and consequently be able to add new ones. It’s now available on github.

Twitter Cleaner
Twitter Cleaner

Note that it might conflict with the previous Twitter TOS if you unfollow too many people at once. However, it will happen only once if you put it into a daily crontab. It was safe in my case, but I can’t guarantee it will be in yours. You may also reach the API rate-limiting if you’ve too many followees.

It’t built using python-twitter, and is available under the MIT license.


Last night a DJ saved my life: What if Twitter could be your own DJ?

While the Twitter music app eventually failed, it’s still clear that people use Twitter’s data stream to share and/or discover new #music. Thanks to Twitter cards, a great thing is that you can directly watch a YouTube video, or listen to a SoundCloud clip, right from your feed, without leaving the platform. But what if Twitter could be your own DJ, playing songs on your request?

Since it’s been a few month since I enjoyed my last Music Hack Day – oh, I definitely miss that! – I’ve hacked a proof of concept using the seevl API, combined with the Twitter and the YouTube ones, to make Twitter acts as your own personal DJ.

Hey @seevl, play something cool

The result is a twitter bot, running under our @seevl handle, which accepts a few (controlled) natural-language queries and replies with an appropriate track, embedded in a Tweet via a YouTube card. Here are a few patterns you can use:

Hey @seevl, play something like A

To play something that is similar to A. For instance, tweet “play something like New Order”, and you might get a reply with a Joy Division track in your feed.

Hey @seevl, play something from L

To play something from an artist signed on label L (or, at least, that used to be on this label at some stage)

Hey @seevl, play some G

To play something from a given genre G

Hey @seevl, play A

To simply play a track from A.

By the way, you can replace “Hey” by anything you want, as long as you politely ask your DJ what you want him to spin. Here’s an example, with my tweet just posted (top of the timeline), and a reply from the bot (bottom left).

Twitter As A DJ
Twitter As A DJ

A little less conversation

As it’s all Twitter-based, not only you can send messages, but you can have a conversation with your virtual DJ. Here’s for instance what I’ve sent first

And got this immediate reply – with the embedded YouTube video

Followed by (“coo” meant to be “cool”)

To immediately listen to Bettie Smith in my stream

It’s kind of fun, I have to say, especially due to the instantaneous nature of the conversation – and it even reminds IRC bots!

Unfortunately, it’s likely that the bot will reach the API rate-limit when posting Tweets (and I’m not handling those errors in the current MVP), so you may not have a reply when you interact with it.

Twitter As A Service?

Besides the music-related hack, I also wanted to showcase the growth of intelligent services on the Web – and how a platform like Twitter can be part of it, using “Twitter As A Service” as a layer for an intelligent Web.

The recently-launched “Buy button” is a simple example of how Twitter can be a Siri-like interface to the world. But why not bringing more intelligence into Twitter. What about “Hey @uber, pick me in 10 minutes”, and using the Tweet geolocation plus a Uber-API integration integration to directly pick – and bill – whoever #requested a black car? Or “Please @opentable, I’d love to have sushis tonight”, and get a reply with links to the top-rated places nearby, with in-tweet booking capability (via the previous buy button)? The data is there, the tools and APIs are there, so…

Yes, this sound a bit like what’s described in the seminal Semantic Web article by Tim Berners-Lee, James Hendler and Ora Lassila. Maybe it’s because we’re finally there, in an age where computers can be those social machines that we’re dreaming about!


Love Product Hunt? Here’s a Chrome extension to discover even more products

Product Hunt is the new rising star in the start-up community. Think of it as a mix of Beta List and Hacker News, but with products that are already live, and a wider community, including engineers of course, but also product people, investors, media and more. A few days ago, and by popular demand, they’ve launched early access to heir official API.

More Products: A Chrome plug-in for Product Hunt recommendations

With more than 6,000 products already in the Product Hunt database, I’ve decided to use the API to build a product recommendation engine. It seems that evey times it comes to hacking and APIs, I can’t get away of discovery, or music. Or both.

The result is a Chrome extension simply named “More Products!”. It directly integrates top-10 related products for each product page, as you can see below. I might iterate on the algorithm itself, but want to keep this plug-in very focused so it’s unlikely that it will integrate other features. Note that it doesn’t track anything, so your privacy is preserved.

More Products on Product Hunt!
More Products on Product Hunt!

Under the hood

The engine relies on the API to get the list of all products and related posts, and then uses TF-IDF and Cosine similarity to to find similarities between them, using NLTK and scikit-learn, respectively the standard Python tools for Natural Language Processing and Machine Learning. To put it simply, it builds a giant database of words used in all posts, mapped to products with their frequency, and then finds how close products are,  based on those frequencies.

New products are fetched every 2 hours, and recommendations are updated at the same time. Flask handles requests between the extension and the recommendations database, and Redis is used as a cache layer. 

Back in Black: Analyzing the loudness and tempo of the Rolling Stone top 500 songs

Here’s the second post of my data analysis series on the Rolling Stone top 500 greatest songs of all time. While the first one focused on lyrics, this one is all about the acoustic properties of the data-set – especially their volume and tempo.

To do so, I used the EchoNest, which delivers a good understanding of each track at the section level (e.g. verse, chorus, etc.) but also at a deeper “segment” level, providing loudness details about very short intervals (up to less than a second). This is not perfect, due to some issues discussed below, but gives a few interesting insights.

[Update 22 July] As noted in the comments, there were a few unexpected results. I’ve run the pipeline again and done some more cleaning on the API results, as explained here.

Black leather, knee-hole pants, can’t play no highschool dance

As my goal was to identify relevant tracks from the dataset, in addition to absolute values for the loudness and tempo of each track, I also looked at their standard deviation. If you’re not familiar with it, this helps to identify which songs / artists tend to be closer to their average tempo / loudness, versus the ones that are more dynamic.

Before going through individual songs from the top-500, let’s take an example with the top-10 Spotify tracks of a few artists to check their loudness:

Artist Average Loudness Standard deviation
Motörhead -5.05 1.29
Ramones -6.85 3.22
Radiohead -11.83 3.20
Daft Punk -11.23 4.82
Public Enemy -5.34 2.30
Beastie Boys -9.38 4.30
Bob Dylan -10.67 2.88
Pink Floyd -16.06 6.50

And the tempo:

Artist Average Tempo Standard deviation
Motörhead 130.58 33.35
Ramones 175.34 7.69
Radiohead 104.80 28.86
Daft Punk 109.90 11.96
Public Enemy 102.93 13.28
Beastie Boys 108.37 16.85
Bob Dylan 126.60 33.95
Pink Floyd 118.23 25.08

You can see that some bands really deserve their reputation. For instance, while the Pink Floyd have a high standard deviation both in volume and tempo (not surprising), Motörhead is not only the loudest (in average) of the list, but also the one with the smallest standard deviation, meaning most of their tracks evolve around that average loudness. In order words, they play everything loud. While the Ramones and just fast, everything fast. And when they’re together on stage, the result is not surprising

But you don’t really care for music, do you?

Coming back to the top 500, I ran the Echonest analysis on 474 tracks of the list. The 26 missing are due to various errors at different stages of the full pipeline.

On the one hand, I’ve used raw results from the song API to get the average values. [Update 22 July] I had to consolidate the data by aggregating multiple API results together. For a single song, multiple tracks are returned by the API (as expected), but there can be large inconsistencies between them. For instance, if you search for American Idiot, one track (ID=SOHDHEA1391229C0EF) is identified having a tempo of 93, the other one (SOCVQDB129F08211FC) of 186. Some can also have slighter variations (in volume for instance, between a live and the original version). To simplify things – and I agree it include a bias in the results – I averaged the first 3 results from the API.

On the other hand, I relied on numpy to compute the standard deviation from the first API result, removing first the fade-in and fade-out of each track. Here, I’ve also skipped every segment of section where the API confidence was too low (< 0.4).

The average loudness for the dataset is -10.38 dB. Paul Lamere run an analysis of 1500 tracks a few years ago, with an average of  -9.5 dB so we can see that this dataset is not too far from a “random” sample – check the conclusion of this post to understand why the Echonest’s loudness is less than 0.

Going through individual tracks, here are the loudest tracks from the list:

And the quietest ones:

You can clearly see the dB difference between a loud (CCR) and quiet (Jeff Buckley) track on following plots.

Loudness for CCR - Who'll stop the rain
Creedence Clearwater Revival – Who’ll Stop the Rain
Loudness plot or Hallelujah by Jeff Buckley
Jeff Buckley – Hallelujah (a low-level but very dynamic track)

Looking at the standard deviations, here are now the most dynamic, volume-wise, tracks.

This last one is a beautiful example of a soul song with a dynamic volume range, and here’s a live version below.

On the other side of the spectrum, here are the less dynamic tracks – i.e. the ones with the smallest standard deviation, volume-wise:

The Ramones strike again – but I’m not sure that Highway to Hell is actually so linear – even though the 2nd part definitely is!

AC/DC - Highway to Hell
AC/DC – Highway to Hell

Please could you stop the noise, I’m trying to get some rest

Going away from the loudness and focusing on the tempo, here are the fastest tracks (in average BpM) of the list (some seem a bit awkward here):

And the slowest ones, also including the Stones:

But I believe that once again, it’s interested to look at how dynamic the tracks can be, with the most dynamic ones (tempo-wise):

And the most static ones, i.e. the ones with less tempo variation:

If you’ve ever looked at the Man vs Machine app, you might find fun that even though the less dynamic (or the more consistent, depending how you look at it) one is using samples (Run DMC), all other involved drummers. Don’t forget to thank the best backing band ever for the perfect tempo on Marvin Gaye’s track (and I couldn’t resist sharing their own cover of the song).

I’m waiting for that final moment you say the words that I can’t say

Last but not least, I’ve normalized and combined both the tempo deviation and the rhythm one to assign a [0:1] score to each track in order find the most and less dynamic tracks overall. Here’s the top-5 of the most dynamic ones:

If you listen to My Generation, you can clearly hear the dynamic both in tempo and volume with the different bursts of the song. While the Radiohead one is more on the long-run, with clearly distinct phases as shown below for the volume part.

Radiohead - Paranoid Android
Radiohead – Paranoid Android

Finally, here are the less dynamic ones. Several ones on that list made it through the  charts, showing that even though a song can be pretty flat in both volume and tempo, it can still be a hit – or at least an earworm: