private Track GetRandomWorkingTrack() { var excludeTracks = new List <Track>(); excludeTracks.Add(this.CurrentTrack); excludeTracks.AddRange(_history); var preferredTracks = this.MixLibrary.GetPreferredTracks(this.CurrentTrack); var forbiddenTracks = this.MixLibrary.GetForbiddenTracks(this.CurrentTrack); excludeTracks.AddRange(forbiddenTracks); excludeTracks.AddRange(preferredTracks); Track randomTrack = null; if (this.WorkingTrack != null && this.CurrentTrack != this.WorkingTrack && this.CurrentTrack != null) { randomTrack = this.WorkingTrack; } else if (this.WorkingTrack != null) { var currentTrack = this.CurrentTrack; if (currentTrack == null) { currentTrack = this.WorkingTrack; } randomTrack = BassHelper.GetTracksInBPMRange(currentTrack.EndBPM, 5M, this.Library.GetTracks()) .Union(BassHelper.GetTracksInEndBPMRange(currentTrack.StartBPM, 5M, this.Library.GetTracks())) .Distinct() .Except(excludeTracks) .OrderBy(t => BassHelper.AbsoluteBPMPercentChange(currentTrack.EndBPM, t.StartBPM)) .FirstOrDefault(); } if (randomTrack == null) { randomTrack = this.WorkingTrack; } return(randomTrack); }
/// <summary> /// Gets all preferred tracks for the specified track /// </summary> /// <param name="track">The track.</param> /// <returns>A list of tracks in the library the specified track should prefer to mix with</returns> public List <Track> GetMixableTracks(Track track, int mixLevel) { var tracks = new List <Track>(); if (track == null) { return(tracks); } if (mixLevel == 1) { var excludeTracks = new List <Track>(); excludeTracks.Add(track); excludeTracks.AddRange(GetMixableTracks(track, 0)); excludeTracks.AddRange(GetMixableTracks(track, 2)); excludeTracks.AddRange(GetMixableTracks(track, 3)); excludeTracks.AddRange(GetMixableTracks(track, 4)); excludeTracks.AddRange(GetMixableTracks(track, 5)); var tracksInRange = BassHelper.GetTracksInBPMRange(track.EndBPM, 5M, _library.GetTracks()); return(tracksInRange .Distinct() .Except(excludeTracks) .ToList()); } else { foreach (var toTrack in GetMixTracks(track).GetToTracks(mixLevel)) { var mixableTrack = _library.GetTracks() .Where(t => t.Description == toTrack.TrackDescription) .FirstOrDefault(); if (mixableTrack != null) { tracks.Add(mixableTrack); } } } return(tracks); }