예제 #1
0
        public void Extract(CSCore.IWaveSource audioSource, Song s)
        {
            _currentTask = "Analysing Song";

            List <Onset> onsets;

            if (SongAnalysed(s.SongBase.InternalName))
            {
                onsets = LoadOnsets(GetOnsetFilePath(s.SongBase.InternalName));
            }
            else
            {
                onsets = _onsetDetector.Detect(audioSource.ToSampleSource());
                SaveOnsets(GetOnsetFilePath(s.SongBase.InternalName), onsets);
            }
            OnsetTimes = onsets.Select(o => o.OnsetTime).ToList();
            Onsets     = onsets;
            ApplyCorrection(OnsetTimes, _correction);

            //force garbage collection
            GC.Collect(2, GCCollectionMode.Forced, true);

            //audioSource.Position = 0;
            //AcoustID.ChromaContext cm = new AcoustID.ChromaContext();
            //AcoustIDCSCore decoder = new AcoustIDCSCore(audioSource);
            //cm.Start(audioSource.WaveFormat.SampleRate, audioSource.WaveFormat.Channels);
            //decoder.Decode(cm.Consumer, 60);
            //cm.Finish();

            //var f = cm.GetFingerprint();

            //Debug.WriteLine(f);

            //AcoustID.Configuration.ClientKey = "3jSfGwVIGZ";
            //AcoustID.Web.LookupService lService = new AcoustID.Web.LookupService();
            //var duration = audioSource.GetLength().TotalSeconds;
            //var lookupTask = lService.GetAsync(f, (int)duration, new string[] { "recordings", "compress" });
            //lookupTask.ContinueWith(t =>
            //{
            //    var resp = t.Result;
            //    foreach (var res in resp.Results)
            //    {
            //        Debug.WriteLine($"Score: {res.Score}, ID: {res.Id}");
            //        foreach (var rec in res.Recordings)
            //        {
            //            Debug.WriteLine($"{rec.Artists.First().Name} - {rec.Title}");
            //        }
            //    }
            //});
            //decoder.Dispose();
        }
예제 #2
0
        public List <Note> Detection()
        {
            List <Note> noteList = new List <Note>();

            //Console.WriteLine("Press any key to convert to .WAV file...");
            //Console.ReadLine();

            int i;
            //Open MP3 file and convert to WAV file.
            WaveOutEvent  waveOut   = new WaveOutEvent();
            Mp3FileReader mp3Reader = new Mp3FileReader(@"C:\Users\Fazle\source\repos\Practice\Media\twinkle.mp3");

            toWAV(mp3Reader);
            //Console.WriteLine(".WAV file created! Press any key to continue...");
            //Console.ReadLine();
            StereoToMono(@"C:\Users\Fazle\source\repos\Practice\Media\current.wav");

            int sampleRate;

            double[] data = null, R = null;
            ReadWavFile(out sampleRate);
            openWav(@"C:\Users\Fazle\source\repos\Practice\Media\currentMono.wav", out data, out R);
            //Console.WriteLine(data.Length);


            Progress <string> progress = new Progress <string>();

            OnsetDetector detector = new OnsetDetector(DetectorOptions.Default, progress);
            List <Onset>  list     = detector.Detect(@"C:\Users\Fazle\source\repos\Practice\Media\currentMono.wav");

            /*Console.WriteLine("Time    Amp");
             * for (i = 0; i < list.Count; i++)
             * {
             *  Console.Write(list[i].OnsetTime);
             *  Console.Write("   ");
             *  Console.Write(list[i].OnsetAmplitude);
             *  Console.Write("   ");
             *  Console.WriteLine();
             * }
             * Console.WriteLine();*/

            int    startPos = 0, stopPos = 0, flag = 0;
            double freq = 0, duration = 0;

            double[] temp;
            double[] result;
            CSCore.Utils.Complex[] complex;

            for (i = 0; i < list.Count - 1; i++)
            {
                startPos = (int)Math.Ceiling(list[i].OnsetTime * sampleRate);
                stopPos  = (int)Math.Floor(list[i + 1].OnsetTime * sampleRate);
                temp     = new double[stopPos - startPos];
                result   = new double[stopPos - startPos];
                complex  = new CSCore.Utils.Complex[stopPos - startPos];

                Array.ConstrainedCopy(data, startPos, temp, 0, temp.Length);

                for (int j = 0; j < complex.Length; j++)
                {
                    complex[j] = new Complex((float)temp[j]);
                    //Console.WriteLine(complex[j]);
                }
                //Console.ReadLine();
                Note note = new Note();
                note.Frequency = CalculateFFT(result, complex, flag);
                note.Name      = UtilMethods.FreqToNote(note.Frequency);
                note.Duration  = list[i + 1].OnsetTime - list[i].OnsetTime;
                noteList.Add(note);
            }

            //Last Note
            startPos = (int)Math.Floor(list[i].OnsetTime * sampleRate);
            stopPos  = data.Length - 1;
            temp     = new double[stopPos - startPos];
            result   = new double[stopPos - startPos];
            complex  = new CSCore.Utils.Complex[stopPos - startPos];
            Array.ConstrainedCopy(data, startPos, temp, 0, temp.Length);
            for (int j = 0; j < complex.Length; j++)
            {
                complex[j] = new Complex((float)temp[j]);
            }
            flag = 1;

            Note lastNote = new Note();

            lastNote.Frequency = CalculateFFT(result, complex, flag);
            lastNote.Name      = UtilMethods.FreqToNote(lastNote.Frequency);
            lastNote.Duration  = (data.Length / sampleRate) - list[i].OnsetTime;
            noteList.Add(lastNote);

            //Console.WriteLine("Press any key to terminate.");
            //Console.ReadLine();
            mp3Reader.Dispose();

            return(noteList);
        }