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)); }
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); } }