/// <summary>
        /// Gets list of all records (except data field) from DataBase
        /// </summary>
        public List <TransferDataSong> GetAllRecords()
        {
            List <TransferDataSong> list = new List <TransferDataSong>();
            string query = "SELECT song_id, artist, title, time, path, data FROM songs";

            using (SQLiteConnection connection = new SQLiteConnection(cb.ConnectionString))
            {
                connection.Open();
                using (SQLiteCommand command = new SQLiteCommand(connection))
                {
                    command.CommandText = query;
                    command.CommandType = CommandType.Text;
                    using (SQLiteDataReader Reader = command.ExecuteReader())
                    {
                        while (Reader.Read())
                        {
                            TransferDataSong tds = new TransferDataSong();
                            tds.id       = Convert.ToInt32(Reader["song_id"]);
                            tds.artist   = Reader["artist"].ToString();
                            tds.title    = Reader["title"].ToString();
                            tds.duration = Reader["time"].ToString();
                            tds.path     = Reader["path"].ToString();
                            int    DataRowNumber = Reader.GetOrdinal("data");
                            byte[] buffer        = new byte[Reader.GetBytes(DataRowNumber, 0, null, 0, int.MaxValue)];
                            Reader.GetBytes(DataRowNumber, 0, buffer, 0, buffer.Length);
                            tds.data = buffer;
                            list.Add(tds);
                        }
                    }
                }
            }
            return(list);
        }
        /// <summary>
        /// Gets song data via song_id
        /// </summary>
        /// <param name="song_id">song_id in DataBase</param>
        public TransferDataFFT GetSongData(int song_id)
        {
            TransferDataSong tds   = new TransferDataSong();
            TransferDataFFT  tdf   = new TransferDataFFT();
            string           query = "SELECT data FROM songs WHERE song_id=" + song_id;

            using (SQLiteConnection connection = new SQLiteConnection(cb.ConnectionString))
            {
                connection.Open();
                using (SQLiteCommand command = new SQLiteCommand(connection))
                {
                    command.CommandText = query;
                    command.CommandType = CommandType.Text;
                    using (SQLiteDataReader Reader = command.ExecuteReader())
                    {
                        while (Reader.Read())
                        {
                            int    DataRowNumber = Reader.GetOrdinal("data");
                            byte[] buffer        = new byte[Reader.GetBytes(DataRowNumber, 0, null, 0, int.MaxValue)];
                            Reader.GetBytes(DataRowNumber, 0, buffer, 0, buffer.Length);
                            tds.data = buffer;
                            tdf      = tds.DeserializeData();
                        }
                    }
                }
            }
            return(tdf);
        }
        /// <summary>
        /// Inserts processed music data into DataBase
        /// </summary>
        /// <param name="tds">Class containing music data</param>
        public void Insert(TransferDataSong tds)
        {
            string query = "INSERT INTO [songs] ([song_id], [title], [artist], [path], [time], [data]) VALUES (null, @title, @artist, @path, @time, @data);";

            using (SQLiteConnection connection = new SQLiteConnection(cb.ConnectionString))
            {
                connection.Open();
                using (SQLiteCommand command = new SQLiteCommand(connection))
                {
                    command.CommandText = query;
                    command.CommandType = CommandType.Text;
                    command.Parameters.AddWithValue("@title", tds.title);
                    command.Parameters.AddWithValue("@artist", tds.artist);
                    command.Parameters.AddWithValue("@path", tds.path);
                    command.Parameters.AddWithValue("@time", tds.duration);
                    command.Parameters.AddWithValue("@data", tds.data);
                    command.ExecuteNonQuery();
                }
            }
        }
Beispiel #4
0
        static TransferDataSong ReadAndProcess(AudioFileReader reader, string SongPath)
        {
            FourierTransformer ft = new FourierTransformer(_FrameSize);

            Complex[] temp        = new Complex[_FrameSize];
            double[]  Amp         = new double[_FrameSize];
            double[]  F           = new double[_FrameSize];
            double[]  sBass       = LinSpace(16, 60, _NumberOfFreqIntervals).ToArray();
            double[]  Bass        = LinSpace(60, 250, _NumberOfFreqIntervals).ToArray();
            double[]  Mid         = LinSpace(250, 2000, _NumberOfFreqIntervals).ToArray();
            double[]  HighMid     = LinSpace(2000, 6000, _NumberOfFreqIntervals).ToArray();
            double[]  High        = LinSpace(6000, 15000, _NumberOfFreqIntervals).ToArray();
            double[]  MainFreqs   = sBass.Concat(Bass).Concat(Mid).Concat(HighMid).Concat(High).Distinct().ToArray();
            double[]  MeanFreqs   = new double[MainFreqs.Length - 1];
            double[]  MedianFreqs = new double[MainFreqs.Length - 1];
            double[]  StdFreqs    = new double[MainFreqs.Length - 1];
            Sample    FreqSample  = new Sample();
            double    sum;

            for (int i = 0; i < _FrameSize; i++)
            {
                F[i] = (double)i / (_FrameSize / 2 + 1) * reader.WaveFormat.SampleRate / 2;
            }
            int[] FreqIndRange = new int[MainFreqs.Length];
            for (int i = 0; i < MainFreqs.Length; i++)
            {
                int j = 0;
                while (F[j] < MainFreqs[i])
                {
                    j++;
                }
                FreqIndRange[i] = j;
            }
            // Create mediumsize array for reading from stream
            int sampleCount = Math.Min(Convert.ToInt32(reader.Length / sizeof(float) / _NumberOfFrames),
                                       Convert.ToInt32(reader.WaveFormat.SampleRate * _TimeToProcess * 2 / _NumberOfFrames));

            if (sampleCount < _FrameSize * 2)
            {
                sampleCount = _FrameSize * 2;
            }
            float[] buffer = new float[sampleCount];

            for (int m = 0; m < _NumberOfFrames; m++)
            {
                reader.Read(buffer, 0, sampleCount);
                for (int k = 0; k < temp.Length; k++)
                {
                    temp[k] = buffer[2 * k];
                }
                Complex[] FFTresults = ft.Transform(temp);
                for (int i = 0; i < _FrameSize; i++)
                {
                    Amp[i] = Meta.Numerics.ComplexMath.Abs(FFTresults[i]);
                }
                sum = Amp.Sum();
                Amp = Amp.Select(x => x / sum).ToArray();
                for (int s = 0; s < MainFreqs.Length - 1; s++)
                {
                    FreqSample.Clear();
                    double[] PartAmp = new double[FreqIndRange[s + 1] - FreqIndRange[s]];
                    Array.Copy(Amp, FreqIndRange[s], PartAmp, 0, PartAmp.Length);
                    FreqSample.Add(PartAmp);
                    MeanFreqs[s]   += FreqSample.Mean / _NumberOfFrames;
                    MedianFreqs[s] += FreqSample.Median / _NumberOfFrames;
                    StdFreqs[s]    += FreqSample.StandardDeviation / _NumberOfFrames;
                }
            }
            for (int i = 0; i < MeanFreqs.Length; i++)
            {
                if (Double.IsNaN(MeanFreqs[i]))
                {
                    throw new System.Exception("Results of FFT is NaN");
                }
            }
            MemoryStream    DataStream = new MemoryStream();
            BinaryFormatter formatter  = new BinaryFormatter();

            formatter.Serialize(DataStream, new TransferDataFFT(MeanFreqs, MedianFreqs, StdFreqs));
            //DataStream.Position = 0;
            //TransferDataFFT TransferStruct2 = (TransferDataFFT)formatter.Deserialize(DataStream);
            TransferDataSong tds = new TransferDataSong();

            tds.data = DataStream.ToArray();
            tds.path = SongPath;
            TimeSpan t = TimeSpan.FromSeconds(reader.TotalTime.TotalSeconds);

            tds.duration = string.Format("{0:D2}:{1:D2}", t.Minutes, t.Seconds);
            TagLib.ByteVector.UseBrokenLatin1Behavior = true;
            using (TagLib.File tagFile = TagLib.File.Create(SongPath))
            {
                tds.title  = tagFile.Tag.Title;
                tds.artist = tagFile.Tag.FirstPerformer;
            }
            DataStream.Close();
            return(tds);
        }