Posts Tagged echonest
With all the controversy surrounding Glee’s ripoff of Jonathan Coulton’s Baby Got back I thought I would makes a remix that combines the two versions. The remix alternates between the two songs, beat by beat.
At first I thought I had a bug and only one of the two songs was making it into the output, but nope, they are both there. To prove it I made another version that alternates the same beat between the two songs – sort of a call and answer. You can hear the subtle differences, and yes, they are very subtle.
The audio speaks for itself.
Here’s the code.
My latest music hack is Bangarang Boomerang. It is a web app (runs in Chrome or the latest Safari), that lets you ‘drive’ the Skrillex song. You can freeze-frame the song on a beat, you can make the song go backwards beat by beat, you can advance through the song at double time, or triple time, and set bookmarks to let you easily jump to different sections of the song. It is a rather fun app that lets you feel like a musician, even if you have very little musical talent.
Watch the quick Youtube demo, and then try it yourself: Bangarang Boomerang
I’m at Music Apps Hack Weekend doing my favorite thing: hacking on music. I’ve just finished my hack called Boil the Frog. Boil the Frog is a Spotify App that will create playlists that gradually take you from one music style to another. It is like the proverbial story of the frog in the pot of water. If you heat the water gradually, the frog won’t notice and will happily sit in the pot until it becomes frog stew. With Boil the Frog you can do the same thing musically. Create a playlist that gradually takes your pre-teen from Miley Cyrus to Miles Davis, or perhaps more perversely the Kenny G fan to Cannibal Corpse.
To build the app I built an artist similarity graph of 100,000 of the most popular artists. I use The Echo Nest artist similarity to connect each artist to its four nearest neighbors. To find the path between any two artists I use a bidirectional Dijkstra shortest path algorithm. Most paths can be computed in less than 100ms.
The Spotify Apps API is the perfect hacking platform. You can build a Spotify app that has full access to the vast Spotify music catalog and artwork, along with access to the listener’s catalog. Since the Spotify Apps run in an embedded browser all of your web app programming skills apply. You can use jQuery, make calls to JSON APIs, use HTML 5 canvas. It is all there. Spotify has done a really good job putting together this platform. The only downside is that, unlike the web, it is hard to actually release Spotify apps, but the Spotify team is working to make this easier. I’d love to release Boil the Frog because it is really fun to make playlists that bring you from one music style to another. It is interesting to see what musical neighborhoods you wander through on your way. For instance, I made a Kenny G to Cannibal Corpse playlist. To get there, the playlist brought me from easy listening, to movie soundtracks and then through video game soundtracks to get to the heavy metal world. Cool stuff. If you want to see a playlist between two artists let me know in the comments and I’ll create and share the playlist with you.
I made a video of Boil the Frog in action. Check it out:
Update: I’ve just pushed the client code out to github: https://github.com/plamere/boilthefrog
Every few months you’ll see a query like this on Reddit – someone is looking for songs that slowly build in intensity. It’s an interesting music query since it is primarily focused on what the music sounds like. Since we’ve analyzed the audio of millions and millions of tracks here at The Echo Nest we should be able to automate this type of query. One would expect that Slow Build songs will have a steady increase in volume over the course of a song, so lets look at the loudness data for a few Slow Build songs to confirm this intuition. First, here’s the canonical slow builder: Stairway to Heaven:
The green line is the raw loudness data, the blue line is a smoothed version of the data. Clearly we see a rise in the volume over the course of the song. Let’s look at another classic Slow Build – The Hall Of the Mountain King – again our intuition is confirmed:
Looking at a non-Slow Build song like Katy Perry’s California Gurls we see that the loudness curve is quite flat by comparison:
Of course there are other aspects beyond loudness that a musician may use to build a song to a climax – tempo, timbre and harmony are all useful, but to keep things simple I’m going to focus only on loudness.
Looking at these plots it is easy to see which songs have a Slow Build. To algorithmically identify songs that have a slow build, we can use a technique similar to the one I described in The Stairway Detector. It is a simple algorithm that compares the average loudness of the first half of the song to the average loudness of the second half of the song. Songs with the biggest increase in average loudness rank the highest. For example, take a look at a loudness plot for Stairway to Heaven. You can see that there is a distinct rise in scores from the first half to the second half of the song (the horizontal dashed lines show the average loudness for the first and second half of the song). Calculating the ramp factor we see that Stairway to Heaven scores an 11.36 meaning that there is an increase in average loudness of 11.36 decibels between the first and the second half of the song.
This algorithm has some flaws – for instance it will give very high scores to ‘hidden track’ songs. Artists will sometimes ‘hide’ a track at the end of a CD by padding the beginning of the track with a few minutes of silence. For example, this track by ‘Fudge Tunnel’ has about five minutes of silence before the band comes in.
Clearly this song isn’t a Slow Build, our simple algorithm is fooled. To fix this we need to introduce a measure of how straight the ramp is. One way to measure the straightness of a line is to calculate the Pearson correlation for the loudness data as a function of time. XY Data with correlation that approaches one (or negative one) is by definition, linear. This nifty wikipedia visualization of the correlation of different datasets shows the correlation for various datasets:
We can combine the correlation with our ramp factors to generate an overall score that takes into account the ramp of the song as well as the straightness of the ramp. The overall score serves as our Slow Build detector. Songs with a high score are Slow Build songs. I suspect that there are better algorithms for this so if you are a math-oriented reader who is cringing at my naivete please set me and my algorithm straight.
Armed with our Slow Build Detector, I built a little web app that lets you explore for Slow Build songs. The app - Looking For The Slow Build – looks like this:
The application lets you type in the name of your favorite song and will give you a plot of the loudness over the course of the song, and calculates the overall Slow Build score along with the ramp and correlation. If you find a song with an exceptionally high Slow Build score it will be added to the gallery. I challenge you to get at least one song in the gallery.
You may find that some songs that you think should get a high Slow Build score don’t score as high as you would expect. For instance, take the song Hoppipolla by Sigur Ros. It seems to have a good build, but it scores low:
It has an early build but after a minute it has reached it’s zenith. The ending is symmetrical with the beginning with a minute of fade. This explains the low score.
Another song that builds but has a low score is Weezer’s The Angel and the One.
This song has a 4 minute power ballad build – but fails to qualify a a slow build because the last 2 minutes of the song are nearly silent.
Finding Slow Build songs in the Million Song Dataset
Now that we have an algorithm that finds Slow Build songs, lets apply it to the Million Song Dataset. I can create a simple MapReduce job in Python that will go through all of the million tracks and calculate the Slow Build score for each of them to help us find the songs with the biggest Slow Build. I’m using the same framework that I described in the post “How to Process a Million Songs in 20 minutes“. I use the S3 hosted version of the Million Song Dataset and process it via Amazon’s Elastic MapReduce using mrjob – a Python MapReduce library. Here’s the mapper that does almost all of the work, the full code is on github in cramp.py:
def mapper(self, _, line): """ The mapper loads a track and yields its ramp factor """ t = track.load_track(line) if t and t['duration'] > 60 and len(t['segments']) > 20: segments = t['segments'] half_track = t['duration'] / 2 first_half = 0 second_half = 0 first_count = 0 second_count = 0 xdata =  ydata =  for i in xrange(len(segments)): seg = segments[i] seg_loudness = seg['loudness_max'] * seg['duration'] if seg['start'] + seg['duration'] <= half_track: seg_loudness = seg['loudness_max'] * seg['duration'] first_half += seg_loudness first_count += 1 elif seg['start'] < half_track and seg['start'] + seg['duration'] > half_track: # this is the nasty segment that spans the song midpoint. # apportion the loudness appropriately first_seg_loudness = seg['loudness_max'] * (half_track - seg['start']) first_half += first_seg_loudness first_count += 1 second_seg_loudness = seg['loudness_max'] * (seg['duration'] - (half_track - seg['start'])) second_half += second_seg_loudness second_count += 1 else: seg_loudness = seg['loudness_max'] * seg['duration'] second_half += seg_loudness second_count += 1 xdata.append( seg['start'] ) ydata.append( seg['loudness_max'] ) correlation = pearsonr(xdata, ydata) ramp_factor = second_half / half_track - first_half / half_track if YIELD_ALL or ramp_factor > 10 and correlation > .5: yield (t['artist_name'], t['title'], t['track_id'], correlation), ramp_factor
This code takes less than a half hour to run on 50 small EC2 instances and finds a bucketload of Slow Build songs. I’ve created a page of plots of the top 500 or so Slow Build songs found by this job. There are all sorts of hidden gems in there. Go check it out:
The page has 500 plots all linked to Spotify so you can listen to any song that strikes your fancy. Here are some my favorite discoveries:
Respighi’s The Pines of the Appian Way
I remember playing this in the orchestra back in high school. It really is sublime. Click the plot to listen in Spotify.
Maria Friedman’s Play The Song Again
So very theatrical
Mandy Patinkin’s Rock-A-Bye Your Baby With A Dixie Melody
Another song that seems to be right off of Broadway – it has an awesome slow build.
- The Million Song Dataset – deep data about a million songs
- The Stairway Index - my first look at this stuff about 2 years ago
- How to process a million songs in 20 minutes – a blog post about how to process the MSD with mrjob and Elastic Map Reduce
- Looking for the Slow Build - a simple web app that calculates the Slow Build score and loudness plot for just about any song
- cramp.py – the MapReduce code for calculating Slow Build scores for the MSD
- Looking for the Slow Build in the Million Song Dataset - 500 loudness plots of the top Slow Builders
- Top Slow Build songs in the Million Song Dataset – the top 6K songs with a Slow Build score of 10 and above
- A Spotify collaborative playlist with a bunch of Slow Build songs in it. Feel free to add more.