public static List <double> MergeSamples( IList <double> stream1, IList <double> stream2, MergeFileAlgorithm algorithm = MergeFileAlgorithm.AverageX2 ) { switch (algorithm) { case MergeFileAlgorithm.Average: return(MergeSamplesAverage(stream1, stream2)); case MergeFileAlgorithm.AverageX2: { var raw = MergeSamplesAverage(stream1, stream2); return(raw.Select(t => Math.Max(Math.Min(t * 2, 1), -1)).ToList()); } case MergeFileAlgorithm.Sum: return(MergeSamplesSum(stream1, stream2)); default: throw new ArgumentOutOfRangeException(nameof(algorithm), algorithm, null); } }
public static WAVParser MergeFiles( WAVParser file1, WAVParser file2, MergeFileAlgorithm algorithm = MergeFileAlgorithm.AverageX2 ) { var realFile1 = file1.Clone(); var realFile2 = file2.Clone(); if (realFile1.SampleRate > realFile2.SampleRate) { realFile2 = ChangeSampleRate(realFile2, realFile1.SampleRate); } else if (realFile1.SampleRate < realFile2.SampleRate) { realFile1 = ChangeSampleRate(realFile1, realFile2.SampleRate); } var mergeMap = new List <List <int> >(); if (realFile1.ChannelCount == realFile2.ChannelCount) { for (int i = 0; i < realFile1.ChannelCount; i++) { mergeMap.Add(new List <int>() { i, i }); } } else { if (realFile1.ChannelCount == 1) { for (int i = 0; i < realFile2.ChannelCount; i++) { mergeMap.Add(new List <int>() { 0, i }); } } else if (realFile2.ChannelCount == 1) { for (int i = 0; i < realFile1.ChannelCount; i++) { mergeMap.Add(new List <int>() { i, 0 }); } } else { throw new Exception(string.Format("File 1 has {0} channels. File 2 has {1} channels. Can't merge", realFile1.ChannelCount, realFile2.ChannelCount)); } } var samples = new List <List <double> >(); foreach (var map in mergeMap) { var channel1 = realFile1.Samples[map[0]]; var channel2 = realFile2.Samples[map[1]]; samples.Add(MergeSamples(channel1, channel2, algorithm)); } var newFile = realFile1.Clone(); newFile.Samples = samples; return(newFile); }