Concisely handling both arrays and Backbone.Collection as parameter
setFromSongs initialises the searchResults variable and then in 2-of-3 cases it immediately overwrites it. You can rewrite the singular case to create the array containing only the single object then you don't need to initialise the variable immediately.

You are repeating the code { song: x, title: x.get('title') } in three different places - you can make the code more DRY if you create a function defined outside the class to handle the mapping of a song to its association with its title:

var associateSongWithTitle = function( song ){
  return {
    song:  song,
    title: song.get('title')
  };
};


You can then refactor the code to:

var SearchResults = Backbone.Collection.extend({
  ...
  setFromSongs: function (songs) {
      var searchResults;
      if (songs instanceof Backbone.Collection) {
          searchResults = songs.map( associateSongWithTitle );
      } else if (_.isArray(songs)) {
          searchResults = _.map(songs, associateSongWithTitle );
      } else {
          searchResults = [ associateSongWithTitle( songs ) ];
      }
      this.reset(searchResults);
  },
  ...
});