public static List<FindSimilar.QueryResult> SimilarTracksSoundfingerprintingList(FileInfo filePath, Repository repository) { DbgTimer t = new DbgTimer(); t.Start (); // get work config from the audio file WorkUnitParameterObject param = GetWorkUnitParameterObjectFromAudioFile(filePath); param.FingerprintingConfiguration = fingerprintingConfigQuerying; // TODO: i don't really know how the threshold tables work. // 1 returns more similar hits // 2 returns sometimes only the one we search for // even 0 seem to work (like 1) List<FindSimilar.QueryResult> candidates = repository.FindSimilarFromAudioSamplesList(param.FingerprintingConfiguration.NumberOfHashTables, param.FingerprintingConfiguration.NumberOfKeys, 0, param); Dbg.WriteLine ("SimilarTracksSoundfingerprintingList - Total Execution Time: {0} ms", t.Stop().TotalMilliseconds); return candidates; }
/// <summary> /// Query the database for perceptually similar tracks using the sound fingerprinting methods /// </summary> /// <param name="filePath">input file</param> /// <param name="repository">the database (repository)</param> /// <param name="thresholdTables">Minimum number of hash tables that must be found for one signature to be considered a candidate (0 and 1 = return all candidates, 2+ = return only exact matches)</param> /// <param name="optimizeSignatureCount">Reduce the number of signatures in order to increase the search performance</param> /// <param name="doSearchEverything">disregard the local sensitivity hashes and search the whole database</param> /// <param name="splashScreen">The "please wait" splash screen (or null)</param> /// <returns>a list of query results objects (e.g. similar tracks)</returns> public static List<FindSimilar.QueryResult> SimilarTracksSoundfingerprintingList(FileInfo filePath, Repository repository, int thresholdTables, bool optimizeSignatureCount, bool doSearchEverything, SplashSceenWaitingForm splashScreen) { DbgTimer t = new DbgTimer(); t.Start (); if (splashScreen != null) splashScreen.SetProgress(0, "Reading audio file ..."); // get work config from the audio file WorkUnitParameterObject param = GetWorkUnitParameterObjectFromAudioFile(filePath); if (param == null) { if (splashScreen != null) splashScreen.SetProgress(0, "Failed reading audio file!"); return null; } param.FingerprintingConfiguration = fingerprintingConfigQuerying; if (splashScreen != null) splashScreen.SetProgress(1, "Successfully reading audio file!"); // This is how the threshold tables work: // For each signature created from a query file we retrieve a number of candidates // based on how many fingerprints that are associated to the same hash bucket. // if the number of fingerprints associated to the same hash bucket is relatively high // the likelyhood for this being an exact match is also very high. // Therefore a value of 0 or 1 basically means return every track that has an association // to the same hash bucket, while a number higher than that increases the accuracy for // only matching identical matches. // 0 and 1 returns many matches // 2 returns sometimes only the one we search for (exact match) List<FindSimilar.QueryResult> similarFiles = repository.FindSimilarFromAudioSamplesList(param.FingerprintingConfiguration.NumberOfHashTables, param.FingerprintingConfiguration.NumberOfKeys, thresholdTables, param, optimizeSignatureCount, doSearchEverything, splashScreen); Dbg.WriteLine ("SimilarTracksSoundfingerprintingList - Total Execution Time: {0} ms", t.Stop().TotalMilliseconds); return similarFiles; }