Пример #1
0
        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));
        }
Пример #2
0
        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);
            }
        }