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