Example #1
0
        private void buttonStart_Click(object sender, EventArgs e)
        {
            textBoxConsole.Text += string.Format(rm.GetString("ProcessStarted"),
                                                 textBoxRead1.Text, textBoxRead2.Text, Magnitude, textBoxWrite.Text) + "\r\n";

            wavRead1 = ReadWavFile(textBoxRead1.Text);
            if (null == wavRead1)
            {
                textBoxConsole.Text += string.Format(rm.GetString("ReadWavFileFailed"), textBoxRead1.Text) + "\r\n";
                return;
            }

            wavRead2 = ReadWavFile(textBoxRead2.Text);
            if (null == wavRead2)
            {
                textBoxConsole.Text += string.Format(rm.GetString("ReadWavFileFailed"), textBoxRead2.Text) + "\r\n";
                return;
            }

            if (wavRead1.SampleRate != wavRead2.SampleRate)
            {
                textBoxConsole.Text += string.Format(rm.GetString("SampleRateIsDifferent")) + "\r\n";
                return;
            }
            if (wavRead1.NumChannels != wavRead2.NumChannels)
            {
                textBoxConsole.Text += string.Format(rm.GetString("NumChannelsIsDifferent")) + "\r\n";
                return;
            }

            backgroundWorker1.RunWorkerAsync();
            buttonStart.Enabled = false;
        }
Example #2
0
        private WavData ReadWavFile(string path)
        {
            WavData wavData = new WavData();

            Console.WriteLine(rm.GetString("ReadFileStarted"), path);

            using (BinaryReader br1 = new BinaryReader(File.Open(path, FileMode.Open))) {
                if (!wavData.Read(br1))
                {
                    textBoxConsole.Text += string.Format(rm.GetString("ReadFileFailFormat"), path) + "\r\n";
                    return(null);
                }
                if (16 != wavData.BitsPerSample)
                {
                    textBoxConsole.Text += string.Format(rm.GetString("BitsPerSampleFailFormat"), path, wavData.BitsPerSample) + "\r\n";
                    return(null);
                }

                if (wavData.NumSamples < wavData.SampleRate * DelaySecondsMax + AccumulateSecondsMax)
                {
                    textBoxConsole.Text += string.Format(rm.GetString("WavFileTooShort"), path, DelaySecondsMax + AccumulateSecondsMax) + "\r\n";
                    return(null);
                }
            }

            return(wavData);
        }
Example #3
0
        private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
        {
            int startPos = (int)numericStartPos.Value;
            int outputSamples = (int)numericOutputSamples.Value;
            string path = textBoxReadWavFile.Text;

            WavData wavData = new WavData();
            Console.WriteLine(rm.GetString("ReadFileStarted"), path);
            using (BinaryReader br1 = new BinaryReader(File.Open(path, FileMode.Open))) {
                if (!wavData.Read(br1)) {
                    resultString = string.Format(rm.GetString("ReadFileFailFormat"), path) + "\r\n";
                    e.Result = false;
                    return;
                }
                if (wavData.NumSamples < startPos + outputSamples) {
                    resultString = string.Format(rm.GetString("WavFileTooShort"), startPos + outputSamples, wavData.NumSamples, path) + "\r\n";
                    e.Result = false;
                    return;
                }
            }

            Console.WriteLine(rm.GetString("WavFileSummary"), wavData.NumSamples);
            resultString += string.Format(rm.GetString("WavFileSummary"), wavData.NumSamples);
            double offset = (double)numericUpDownSubSampleOffset.Value;

            if (checkBoxCh0.Checked && !checkBoxCh1.Checked) {
                using (StreamWriter sw = new StreamWriter(textBoxWriteFile.Text)) {
                    for (int i=startPos; i < startPos + outputSamples; ++i) {
                        sw.WriteLine("{0} {1}", i+offset, wavData.Sample16Get(0, i));
                    }
                }
            } else if (!checkBoxCh0.Checked && checkBoxCh1.Checked) {
                using (StreamWriter sw = new StreamWriter(textBoxWriteFile.Text)) {
                    for (int i=startPos; i < startPos + outputSamples; ++i) {
                        sw.WriteLine("{0} {1}", i + offset, wavData.Sample16Get(1, i));
                    }
                }
            } else if (checkBoxCh0.Checked && checkBoxCh1.Checked) {
                using (StreamWriter sw = new StreamWriter(textBoxWriteFile.Text)) {
                    for (int i=startPos; i < startPos + outputSamples; ++i) {
                        sw.WriteLine("{0} {1} {2}", i + offset, wavData.Sample16Get(0, i), wavData.Sample16Get(1, i));
                    }
                }
            }
            e.Result = true;
        }
Example #4
0
        static void Main(string[] args)
        {
            OptionInfo optionInfo = new OptionInfo(2);

            ParseOptions(ref optionInfo, args);

            WavData ch0Wav = ReadWavFromFile(optionInfo.channels[0].chFileName);
            WavData ch1Wav = ReadWavFromFile(optionInfo.channels[1].chFileName);

            if (ch0Wav.NumSamples != ch1Wav.NumSamples) {
                Console.WriteLine("E: NumSamples mismatch. ch0.numSamples={0}, ch1.numSamples={1}",
                    ch0Wav.NumSamples, ch1Wav.NumSamples);
                PrintUsageAndExit();
            }

            WavData writeWav = new WavData();
            List<PcmSamples1Channel> channels = new List<PcmSamples1Channel>();
            for (int i=0; i<2; ++i) {
                channels.Add(new PcmSamples1Channel(ch0Wav.NumSamples, ch0Wav.BitsPerSample));
            }

            int ch0UseCh = optionInfo.channels[0].chFileUseCh;
            int ch1UseCh = optionInfo.channels[1].chFileUseCh;
            for (int i=0; i<ch0Wav.NumSamples; ++i) {
                channels[0].Set16(i, ch0Wav.Sample16Get(ch0UseCh, i));
                channels[1].Set16(i, ch1Wav.Sample16Get(ch1UseCh, i));
            }

            writeWav.Create(ch0Wav.SampleRate, ch0Wav.BitsPerSample, channels);

            try {
                using (BinaryWriter bw = new BinaryWriter(File.Open(optionInfo.outputWavFileName, FileMode.CreateNew))) {
                    writeWav.Write(bw);
                }
            } catch (Exception ex) {
                Console.WriteLine("E: {0}", ex);
                PrintUsageAndExit();
            }
        }
Example #5
0
        static WavData ReadWavFromFile(string path)
        {
            WavData wavData = new WavData();

            using (BinaryReader br = new BinaryReader(File.Open(path, FileMode.Open))) {
                if (!wavData.Read(br)) {
                    Console.WriteLine("E: Read failed. unknown format. {0}", path);
                    PrintUsageAndExit();
                }
            }
            return wavData;
        }
Example #6
0
        private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
        {
            int sampleDelay;
            double w1w2VolumeRatio;
            if (!SampleDelay(wavRead1, wavRead2, out sampleDelay, out w1w2VolumeRatio)) {
                e.Result = false;
                resultString = rm.GetString("TwoWavFilesTooDifferent");
                return;
            }

            if (!checkBoxAutoAdjustVolumeDifference.Checked) {
                w1w2VolumeRatio = 1.0;
            }

            int numSamples = wavRead1.NumSamples - 2 * Math.Abs(sampleDelay);
            if (wavRead2.NumSamples < wavRead1.NumSamples) {
                numSamples = wavRead2.NumSamples - 2 * Math.Abs(sampleDelay);
            }

            List<PcmSamples1Channel> samples = new List<PcmSamples1Channel>();
            for (int i=0; i<wavRead1.NumChannels; ++i) {
                PcmSamples1Channel ps = new PcmSamples1Channel(numSamples, wavRead1.BitsPerSample);
                samples.Add(ps);
            }

            long acc = 0;
            int maxDiff = 0;

            float magnitude = (float)Magnitude;
            if (0 <= sampleDelay) {
                for (int ch=0; ch < wavRead1.NumChannels; ++ch) {
                    PcmSamples1Channel ps = samples[ch];
                    for (int sample=0; sample < numSamples; ++sample) {
                        int diff = (int)(wavRead1.Sample16Get(ch, sample)
                                       - wavRead2.Sample16Get(ch, sample + sampleDelay) * w1w2VolumeRatio);

                        int absDiff = Math.Abs(diff);
                        acc += absDiff;
                        if (maxDiff < absDiff) {
                            maxDiff = absDiff;
                        }

                        ps.Set16(sample, (short)(diff * magnitude));
                    }
                }
            } else {
                // sampleDelay < 0
                for (int ch=0; ch < wavRead1.NumChannels; ++ch) {
                    PcmSamples1Channel ps = samples[ch];
                    for (int sample=0; sample < numSamples; ++sample) {
                        int diff = (int)(wavRead1.Sample16Get(ch, sample - sampleDelay)
                                       - wavRead2.Sample16Get(ch, sample) * w1w2VolumeRatio);

                        int absDiff = Math.Abs(diff);
                        acc += absDiff;
                        if (maxDiff < absDiff) {
                            maxDiff = absDiff;
                        }

                        ps.Set16(sample, (short)(diff * magnitude));
                    }
                }
            }

            if (0 == acc) {
                e.Result = false;
                resultString = rm.GetString("TwoWavFilesAreExactlyTheSame");
                return;
            }

            WavData wav = new WavData();
            wav.Create(wavRead1.SampleRate, wavRead1.BitsPerSample, samples);

            if (0 < maxDiff) {
                int maxMagnitude = 32767 / maxDiff;
                resultString = string.Format(rm.GetString("DiffStatistics"),
                    (double)acc / wav.NumSamples, maxDiff, maxMagnitude);
                Console.WriteLine(resultString);

                if (32767 < maxDiff * magnitude) {
                    Console.WriteLine(rm.GetString("OutputFileLevelOver"), maxMagnitude);
                }
            }

            try {
                using (BinaryWriter bw = new BinaryWriter(File.Open(textBoxWrite.Text, FileMode.CreateNew))) {
                    wav.Write(bw);
                }
            } catch (Exception ex) {
                resultString = ex.ToString();
                e.Result = false;
            }
            e.Result = true;
        }
Example #7
0
        /** @param delay_return [out] (0 < delay_return) w1 is delayed by delay samples
         *                     (delay_return < 0) w2 is delayed by delay samples
         *  @param w1w2VolumeRatio_return [out] >1: w1 volume is larger than w2, <1: w1 volume is smaller than w2
         */
        private bool SampleDelay(WavData w1, WavData w2, out int delay_return, out double w1w2VolumeRatio_return)
        {
            float ACCUMULATE_SECONDS_MAX = (float)AccumulateSecondsMax;
            float DELAY_SECONDS_MAX      = (float)DelaySecondsMax;
            delay_return = 0;

            SortedDictionary<long, VolumeInfo> delayValueAndPos =
                new SortedDictionary<long, VolumeInfo>();

            int samplesPerSecond = w1.SampleRate;
            /* assume w1 is delayed (0 < delay) */
            for (int delay=0; delay < samplesPerSecond * DELAY_SECONDS_MAX; ++delay) {
                VolumeInfo vi = new VolumeInfo();
                vi.delay = delay;

                for (int pos=0; pos < samplesPerSecond * ACCUMULATE_SECONDS_MAX; ++pos) {
                    int w1Value = Math.Abs(w1.Sample16Get(0, pos));
                    int w2Value = Math.Abs(w2.Sample16Get(0, pos + delay));
                    vi.w1Volume += w1Value;
                    vi.w2Volume += w2Value;
                    vi.accumulatedDiff += Math.Abs(w1Value - w2Value);
                }
                // Console.Write("[{0} {1}]", delay, acc);
                if (!delayValueAndPos.ContainsKey(vi.accumulatedDiff)) {
                    delayValueAndPos[vi.accumulatedDiff] = vi;
                }
                backgroundWorker1.ReportProgress(delay * 50 / (int)(samplesPerSecond * DELAY_SECONDS_MAX));
            }

            /* assume w2 is delayed (delay < 0) */
            for (int delay=1; delay < samplesPerSecond * DELAY_SECONDS_MAX; ++delay) {
                VolumeInfo vi = new VolumeInfo();
                vi.delay = -delay;

                for (int pos=0; pos < samplesPerSecond * ACCUMULATE_SECONDS_MAX; ++pos) {
                    int w1Value = Math.Abs(w1.Sample16Get(0, pos + delay));
                    int w2Value = Math.Abs(w2.Sample16Get(0, pos));
                    vi.w1Volume += w1Value;
                    vi.w2Volume += w2Value;
                    vi.accumulatedDiff += Math.Abs(w1Value - w2Value);
                }
                // Console.Write("[{0} {1}]", -delay, acc);
                if (!delayValueAndPos.ContainsKey(vi.accumulatedDiff)) {
                    delayValueAndPos[vi.accumulatedDiff] = vi;
                }
                backgroundWorker1.ReportProgress(50 + delay * 50 / (int)(samplesPerSecond * DELAY_SECONDS_MAX));
            }

            SortedDictionary<long, VolumeInfo>.Enumerator e = delayValueAndPos.GetEnumerator();
            e.MoveNext();

            w1w2VolumeRatio_return = (double)e.Current.Value.w1Volume / e.Current.Value.w2Volume;
            delay_return = e.Current.Value.delay;

            Console.WriteLine();
            Console.WriteLine(rm.GetString("SampleDelaySummary"),
                delay_return, (double)delay_return / samplesPerSecond,
                (double)e.Current.Key / (samplesPerSecond * DELAY_SECONDS_MAX),
                w1w2VolumeRatio_return);
            if (w1w2VolumeRatio_return < 0.5 || 2.0 < w1w2VolumeRatio_return) {
                return false;
            }
            return true;
        }
Example #8
0
        private WavData ReadWavFile(string path)
        {
            WavData wavData = new WavData();

            Console.WriteLine(rm.GetString("ReadFileStarted"), path);

            using (BinaryReader br1 = new BinaryReader(File.Open(path, FileMode.Open))) {
                if (!wavData.Read(br1)) {
                    textBoxConsole.Text += string.Format(rm.GetString("ReadFileFailFormat"), path) + "\r\n";
                    return null;
                }
                if (16 != wavData.BitsPerSample) {
                    textBoxConsole.Text += string.Format(rm.GetString("BitsPerSampleFailFormat"), path, wavData.BitsPerSample) + "\r\n";
                    return null;
                }

                if (wavData.NumSamples < wavData.SampleRate * DelaySecondsMax + AccumulateSecondsMax) {
                    textBoxConsole.Text += string.Format(rm.GetString("WavFileTooShort"), path, DelaySecondsMax + AccumulateSecondsMax) + "\r\n";
                    return null;
                }
            }

            return wavData;
        }
Example #9
0
        private void buttonStart_Click(object sender, EventArgs e)
        {
            textBoxConsole.Text += string.Format(rm.GetString("ProcessStarted"),
                textBoxRead1.Text, textBoxRead2.Text, Magnitude, textBoxWrite.Text) + "\r\n";

            wavRead1 = ReadWavFile(textBoxRead1.Text);
            if (null == wavRead1) {
                textBoxConsole.Text += string.Format(rm.GetString("ReadWavFileFailed"), textBoxRead1.Text) + "\r\n";
                return;
            }

            wavRead2 = ReadWavFile(textBoxRead2.Text);
            if (null == wavRead2) {
                textBoxConsole.Text += string.Format(rm.GetString("ReadWavFileFailed"), textBoxRead2.Text) + "\r\n";
                return;
            }

            if (wavRead1.SampleRate != wavRead2.SampleRate) {
                textBoxConsole.Text += string.Format(rm.GetString("SampleRateIsDifferent")) + "\r\n";
                return;
            }
            if (wavRead1.NumChannels != wavRead2.NumChannels) {
                textBoxConsole.Text += string.Format(rm.GetString("NumChannelsIsDifferent")) + "\r\n";
                return;
            }

            backgroundWorker1.RunWorkerAsync();
            buttonStart.Enabled = false;
        }
Example #10
0
        private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
        {
            int    sampleDelay;
            double w1w2VolumeRatio;

            if (!SampleDelay(wavRead1, wavRead2, out sampleDelay, out w1w2VolumeRatio))
            {
                e.Result     = false;
                resultString = rm.GetString("TwoWavFilesTooDifferent");
                return;
            }

            if (!checkBoxAutoAdjustVolumeDifference.Checked)
            {
                w1w2VolumeRatio = 1.0;
            }

            int numSamples = wavRead1.NumSamples - 2 * Math.Abs(sampleDelay);

            if (wavRead2.NumSamples < wavRead1.NumSamples)
            {
                numSamples = wavRead2.NumSamples - 2 * Math.Abs(sampleDelay);
            }

            List <PcmSamples1Channel> samples = new List <PcmSamples1Channel>();

            for (int i = 0; i < wavRead1.NumChannels; ++i)
            {
                PcmSamples1Channel ps = new PcmSamples1Channel(numSamples, wavRead1.BitsPerSample);
                samples.Add(ps);
            }

            long acc     = 0;
            int  maxDiff = 0;

            float magnitude = (float)Magnitude;

            if (0 <= sampleDelay)
            {
                for (int ch = 0; ch < wavRead1.NumChannels; ++ch)
                {
                    PcmSamples1Channel ps = samples[ch];
                    for (int sample = 0; sample < numSamples; ++sample)
                    {
                        int diff = (int)(wavRead1.Sample16Get(ch, sample)
                                         - wavRead2.Sample16Get(ch, sample + sampleDelay) * w1w2VolumeRatio);

                        int absDiff = Math.Abs(diff);
                        acc += absDiff;
                        if (maxDiff < absDiff)
                        {
                            maxDiff = absDiff;
                        }

                        ps.Set16(sample, (short)(diff * magnitude));
                    }
                }
            }
            else
            {
                // sampleDelay < 0
                for (int ch = 0; ch < wavRead1.NumChannels; ++ch)
                {
                    PcmSamples1Channel ps = samples[ch];
                    for (int sample = 0; sample < numSamples; ++sample)
                    {
                        int diff = (int)(wavRead1.Sample16Get(ch, sample - sampleDelay)
                                         - wavRead2.Sample16Get(ch, sample) * w1w2VolumeRatio);

                        int absDiff = Math.Abs(diff);
                        acc += absDiff;
                        if (maxDiff < absDiff)
                        {
                            maxDiff = absDiff;
                        }

                        ps.Set16(sample, (short)(diff * magnitude));
                    }
                }
            }

            if (0 == acc)
            {
                e.Result     = false;
                resultString = rm.GetString("TwoWavFilesAreExactlyTheSame");
                return;
            }

            WavData wav = new WavData();

            wav.Create(wavRead1.SampleRate, wavRead1.BitsPerSample, samples);

            if (0 < maxDiff)
            {
                int maxMagnitude = 32767 / maxDiff;
                resultString = string.Format(rm.GetString("DiffStatistics"),
                                             (double)acc / wav.NumSamples, maxDiff, maxMagnitude);
                Console.WriteLine(resultString);

                if (32767 < maxDiff * magnitude)
                {
                    Console.WriteLine(rm.GetString("OutputFileLevelOver"), maxMagnitude);
                }
            }

            try {
                using (BinaryWriter bw = new BinaryWriter(File.Open(textBoxWrite.Text, FileMode.CreateNew))) {
                    wav.Write(bw);
                }
            } catch (Exception ex) {
                resultString = ex.ToString();
                e.Result     = false;
            }
            e.Result = true;
        }
Example #11
0
        /** @param delay_return [out] (0 < delay_return) w1 is delayed by delay samples
         *                     (delay_return < 0) w2 is delayed by delay samples
         *  @param w1w2VolumeRatio_return [out] >1: w1 volume is larger than w2, <1: w1 volume is smaller than w2
         */
        private bool SampleDelay(WavData w1, WavData w2, out int delay_return, out double w1w2VolumeRatio_return)
        {
            float ACCUMULATE_SECONDS_MAX = (float)AccumulateSecondsMax;
            float DELAY_SECONDS_MAX      = (float)DelaySecondsMax;

            delay_return = 0;

            SortedDictionary <long, VolumeInfo> delayValueAndPos =
                new SortedDictionary <long, VolumeInfo>();

            int samplesPerSecond = w1.SampleRate;

            /* assume w1 is delayed (0 < delay) */
            for (int delay = 0; delay < samplesPerSecond * DELAY_SECONDS_MAX; ++delay)
            {
                VolumeInfo vi = new VolumeInfo();
                vi.delay = delay;

                for (int pos = 0; pos < samplesPerSecond * ACCUMULATE_SECONDS_MAX; ++pos)
                {
                    int w1Value = Math.Abs(w1.Sample16Get(0, pos));
                    int w2Value = Math.Abs(w2.Sample16Get(0, pos + delay));
                    vi.w1Volume        += w1Value;
                    vi.w2Volume        += w2Value;
                    vi.accumulatedDiff += Math.Abs(w1Value - w2Value);
                }
                // Console.Write("[{0} {1}]", delay, acc);
                if (!delayValueAndPos.ContainsKey(vi.accumulatedDiff))
                {
                    delayValueAndPos[vi.accumulatedDiff] = vi;
                }
                backgroundWorker1.ReportProgress(delay * 50 / (int)(samplesPerSecond * DELAY_SECONDS_MAX));
            }

            /* assume w2 is delayed (delay < 0) */
            for (int delay = 1; delay < samplesPerSecond * DELAY_SECONDS_MAX; ++delay)
            {
                VolumeInfo vi = new VolumeInfo();
                vi.delay = -delay;

                for (int pos = 0; pos < samplesPerSecond * ACCUMULATE_SECONDS_MAX; ++pos)
                {
                    int w1Value = Math.Abs(w1.Sample16Get(0, pos + delay));
                    int w2Value = Math.Abs(w2.Sample16Get(0, pos));
                    vi.w1Volume        += w1Value;
                    vi.w2Volume        += w2Value;
                    vi.accumulatedDiff += Math.Abs(w1Value - w2Value);
                }
                // Console.Write("[{0} {1}]", -delay, acc);
                if (!delayValueAndPos.ContainsKey(vi.accumulatedDiff))
                {
                    delayValueAndPos[vi.accumulatedDiff] = vi;
                }
                backgroundWorker1.ReportProgress(50 + delay * 50 / (int)(samplesPerSecond * DELAY_SECONDS_MAX));
            }

            SortedDictionary <long, VolumeInfo> .Enumerator e = delayValueAndPos.GetEnumerator();
            e.MoveNext();

            w1w2VolumeRatio_return = (double)e.Current.Value.w1Volume / e.Current.Value.w2Volume;
            delay_return           = e.Current.Value.delay;

            Console.WriteLine();
            Console.WriteLine(rm.GetString("SampleDelaySummary"),
                              delay_return, (double)delay_return / samplesPerSecond,
                              (double)e.Current.Key / (samplesPerSecond * DELAY_SECONDS_MAX),
                              w1w2VolumeRatio_return);
            if (w1w2VolumeRatio_return < 0.5 || 2.0 < w1w2VolumeRatio_return)
            {
                return(false);
            }
            return(true);
        }
Example #12
0
        private bool SaveWav(int sampleRate, int bitsPerSample, List<PcmSamples1Channel> samples, string path)
        {
            bool ret = true;

            WavData wav = new WavData();
            wav.Create(sampleRate, bitsPerSample, samples);

            try {
                using (BinaryWriter bw = new BinaryWriter(File.Open(path, FileMode.CreateNew))) {
                    wav.Write(bw);
                }
            } catch (Exception ex) {
                resultString = ex.ToString();
                ret = false;
            }
            return ret;
        }