Esempio n. 1
0
        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);
            }
        }
Esempio n. 2
0
        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);
        }