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