using NAudio.Lame; namespace QuikDawEditor.EDITING; public partial class AudioMethods { public static TimeSpan GetSoundDurationMp3(string f) { TimeSpan returnTimeSpan = TimeSpan.Zero; try { Mp3FileReader reader = new Mp3FileReader(f); reader.Close(); returnTimeSpan = reader.TotalTime; } catch { } return returnTimeSpan; } public static void DeleteOrphanAudio() { //Delete any orphan audio files try { foreach (string f in Directory.GetFiles(EditingProjectClipsDirectory)) { bool IsOrphan = f.EndsWith(".wav") | f.EndsWith(".mp3") && !Path.GetFileName(f).StartsWith("UNUSED") && editingProject.GetAllTracksInProject.Where(t => t.Clips.Where(c => c.ClipSourceFileName == Path.GetFileName(f)).Count() > 0).Count() == 0; if (IsOrphan) { string unusedName = EditingProjectClipsDirectory + "\\UNUSED_" + Path.GetFileName(f); File.Move(f, unusedName, true); } } } catch (Exception ex) { Debug.WriteLine("Error moving file: " + ex.Message); } } public static void AddNewAudioClipToTrack(string newClipSourceFileName, Track addToTrack, double addPositionMs, double addingClipWidthMs, bool looped = false, bool reversed = false) { projPlayer.SendLocalMessage("Adding new clip to track"); Debug.WriteLine("Adding new clip to track.."); Track targetTrack; int insertIdx = 0; string fileNameOnly = Path.GetFileName(newClipSourceFileName); if (addToTrack == null) { //create a new track to add to targetTrack = new Track(TrackType.Audio) { TrackName = fileNameOnly }; editingProject.Tracks.Add(targetTrack); undoActions.Add(new TrackAddUndo(targetTrack.UndoTrackID)); insertIdx = 0; } else { targetTrack = addToTrack; Clip firstClipRight = targetTrack.Clips.FirstOrDefault(cl => cl.ClipLeftMs > addPositionMs); insertIdx = firstClipRight == null ? targetTrack.Clips.Count : targetTrack.Clips.IndexOf(firstClipRight); } Task.Run(() => { //Doing this in a task makes for smoother operation after a file drop if (!File.Exists(EditingProjectClipsDirectory + "\\" + fileNameOnly)) File.Copy(newClipSourceFileName, EditingProjectClipsDirectory + "\\" + fileNameOnly, true); newClipSourceFileName = fileNameOnly; //Add new audio file as a new clip to track Clip addingClip = new Clip(newClipSourceFileName, (int)ClipType.Audio) { ClipName = newClipSourceFileName, ClipVirtualStartMs = addPositionMs, ClipWidthMs = addingClipWidthMs, IsLooped = looped, IsReversed = reversed }; Application.Current.Dispatcher.Invoke(() => { targetTrack.Clips.Insert(insertIdx, addingClip); }); addingClip.ApplyWaveBitmapSourcesToImage(); targetTrack.AddClipSampleProviderToClip(addingClip); targetTrack.UpdateMyClipsToOwner(); Application.Current.Dispatcher.Invoke(() => { //Set clip width to be source length or fit before next clip to right if (addingClip.GetIndexInTrack < targetTrack.Clips.Count - 1) addingClip.ClipWidthMs = Math.Min(addingClip.ClipWidthMs, targetTrack.Clips[addingClip.GetIndexInTrack + 1].ClipLeftMs - addingClip.ClipLeftMs); addingClip.GainPoints = new ObservableCollection() { new GainPoint() { sourcePointms = 0, GainValue = 1, IsLeftEdgeGainPoint = true }, new GainPoint() { sourcePointms = addingClip.ClipWidthMs, GainValue = 1, IsRightEdgeGainPoint = true }}; projPlayer.SendLocalMessage("Added new clip to track: " + addingClip.ClipSourceFileName); projPlayer.UpdateEndPoint(); undoActions.Add(new ClipAddUndo(addingClip.UndoClipID)); editingProject.NeedsSaving = true; }, DispatcherPriority.Render); }); } public static float GetAverageSamples(float[] samps) { float result = 0; for (int i = 0; i < samps.Length - 2; i += 3) { //if (float.IsNaN(samps[i])) Debug.WriteLine("Errro in getting average: " + samps[i].ToString()); result = Math.Max(result, Math.Abs(samps[i])); } return result; } public static void ConvertWaveToMP3(string waveFileName, string mp3FileName, int bitRate = 128) { AudioFileReader reader = new AudioFileReader(waveFileName); LameMP3FileWriter writer = new LameMP3FileWriter(mp3FileName, reader.WaveFormat, bitRate); reader.CopyTo(writer); reader.Close(); writer.Close(); } //public static void MP3ToWave(string mp3FileName, string waveFileName) //{ // using (var reader = new Mp3FileReader(mp3FileName)) // using (var writer = new WaveFileWriter(waveFileName, reader.WaveFormat)) // reader.CopyTo(writer); //} }