Friday, June 28, 2013

Week 2: Bringing code up to date

This week, I worked on bringing Keith's code up-to-date, eliminating some of the outdated slots and signals (e.g. slotSearch and doSearch) and the unnecessary custom WSelectorTrackTableView. I also fixed some of the bugs, such as filters remaining active after no song is playing (although I'm not sure if the logic is quite right; this requires more testing), and allow the user to set the seed track using drag-and-drop.

I made a first attempt at getting a custom score column into SelectorLibraryTableModel, but while it displays in the view, it cannot be used to sort, defeating the purpose. It seems like I may have to modify the behavior of LibraryTableModel further, perhaps by overriding BaseSqlTableModel::select and adding my custom sort after the SQL-based "m_trackSource->filterAndSort."

Per Max's suggestion, I also looked into Mirage, which offers a track similarity feature very similar to that provided by the Vamp plugin. It estimates a multivariate Gaussian model of the track's MFCCs, then uses the symmetric KL divergence between Gaussians as the distance function. The implementation may be more efficient, but the same basic idea (storing the model and calculating KL divergence on the fly) can be used without having to alter the Vamp plugin drastically.

It may be that Mirage's approach is better than the Queen Mary one, but it appears that it would require me to add some matrix math to Mixxx. I'm not sure if it's worth adding the additional complexity for this.

My goal for next week is two-fold: fix the score column so that it can actually be used to sort, and then start on integrating the timbral similarity function (whether the Queen Mary or Mirage version) so that there will be values upon which to sort.

Friday, June 21, 2013

Week 1: Refining the direction

This week was mostly spent setting up my dev environment (I've decided to use Qt Creator) and finding my way around the codebase, getting Keith's code from the track_selector_feature branch to work again. A partly revised design document is up at: http://mixxx.org/wiki/doku.php/gsoc2013_track_selector

I've forked the Github repo and started working off the features_key branch, so that I can take advantage of the key analysis functions. My branch is here: https://github.com/chrisjr/mixxx/tree/features_key_selector

Now that filters are more or less in place, I need to figure out a way to isolate the filtered set and apply a an arbitrary similarity function between those tracks and the current one. That will be the task for next week.

For the midterm, my goal is to have the selector interface working, with tracks ranked by a customizable ranking function and with the interface to prioritize different rankings (and to add user-selected follow-ups) exposed. The remaining time would then be spent adding new comparison options (e.g. the Last.FM tags and timbral similarity).

Monday, June 17, 2013

Kicking off

This summer, I'll be working on track suggestion functionality for Mixxx, drawing upon BPM, key, timbre, and genre to autopopulate a list of potential follow-up tracks.

My goal for this week is to quickly recreate the track selector interface from Varun's "track_selector_feature" branch allowing for an extensible set of filters, so that different criteria can be tested to see how well they identify follow-ups. In addition, I'll create a list in the preferences to allow the user to specify which filters are active and their order of priority.