public void Search(List <Audio> source, Audio referenceItem, object parameters = null) { SimilarityOptions Options = parameters as SimilarityOptions; if (Options == null) { throw new ArgumentException("Invalid options"); } var ReferenceTempogram = referenceItem.GetData <Tempogram>(); var ReferenceVolumDescriptor = referenceItem.GetData <VolumeDescriptor>(); foreach (var Item in source) { var Distance = 0f; var Tempogram = Item.GetData <Tempogram>(); if (Tempogram == null || ReferenceTempogram == null) { Distance += 1; } else { if (Options.LongRhythm) { Distance += ReferenceTempogram.LongTempogram.Distance(Tempogram.LongTempogram); } if (Options.ShortRhythm) { Distance += ReferenceTempogram.ShortTempogram.Distance(Tempogram.ShortTempogram) * 0.3f; } if (Options.Intensity) { Distance += Math.Abs(ReferenceTempogram.Intensity - Tempogram.Intensity) * 0.2f; } } if (Options.VolumeDistr) { var VolumeDescriptor = Item.GetData <VolumeDescriptor>(); if (VolumeDescriptor == null || ReferenceVolumDescriptor == null) { Distance += 1f; } else { Distance += ReferenceVolumDescriptor.Distance(VolumeDescriptor); } } Item.Tag = Distance; } source.Sort((a1, a2) => a1.Tag.CompareTo(a2.Tag)); }
public ActionResult Search(int id) { var trackList = new List<Track>(); if (db.Tracks.Any()) { trackList = db.Tracks.ToList(); } if (id < 0 || id >= ShownItems.Count) { return View(new List<Track>()); } SimilarityOptions Options = new SimilarityOptions() { AmpEnvelope = true, Intensity = true, LongRhythm = true, ShortRhythm = true, VolumeDistr = true }; var searchItems = ShownItems.SearchBy<SearchBySimilarity>(id, Options); var showTrackList = new List<Track>(); foreach (var shownItem in searchItems) { var track = trackList.FirstOrDefault(t => t.FileName.Contains(shownItem.ShortName)); if (track != null) { showTrackList.Add(track); } } return View(showTrackList); }
private void findSimilarsToolStripMenuItem_Click(object sender, EventArgs e) { if (selectedItemIndex < 0 || selectedItemIndex >= items.Count) return; try { if (findSimilarPropertiesForm.ShowDialog() != DialogResult.OK) return; SimilarityOptions Options = new SimilarityOptions() { AmpEnvelope = findSimilarPropertiesForm.cbAmpEnvelope.Checked, Intensity = findSimilarPropertiesForm.cbIntensity.Checked, LongRhythm = findSimilarPropertiesForm.cbLongRhythm.Checked, ShortRhythm = findSimilarPropertiesForm.cbShortRhythm.Checked, VolumeDistr = findSimilarPropertiesForm.cbVolumeDistr.Checked }; items.SearchBy<SearchBySimilarity>(selectedItemIndex, Options); ScrollToTopLeft(); selectedItemIndex = 0; Invalidate(); } catch (Exception ex) { MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); } }