private void stop(object sender, RoutedEventArgs e) { if (!isRecording || this.lvSentences.SelectedItems.Count < 1) { return; } isRecording = false; recorder.Close(); filewriter.Close(); int index = this.lvSentences.SelectedIndex; lblRecording.Visibility = System.Windows.Visibility.Hidden; Sentence sentence = (Sentence)this.lvSentences.SelectedItem; loadLanguage(); // Called to refresh the sentence data of the current langugae this.lvSentences.SelectedIndex = index; wavProcessor processor = new wavProcessor(); int noiceLevel = (int)this.noiceLevelSlider.Value; processor.StripSilence(sentence.fullPath, noiceLevel); processor.ToneIn(sentence.fullPath); processor.ToneOut(sentence.fullPath); processor.SpeedUp(sentence.fullPath, (int)this.speedSlider.Value); }
/// <summary> /// Filter out silence or noise from start and end of wave file. /// </summary> /// <param name="strPath">Source wave file</param> /// <param name="noiceLevel">Absolute value for noice threshold</param> /// <returns>True/False</returns> public bool StripSilence(string strPath, int noiceLevel) { if ((strPath == null) || (strPath == "")) return false; // Read from file wavProcessor wain = new wavProcessor(); if (!wain.WaveHeaderIN(@strPath)) return false; byte[] arrfile = GetWAVEData(strPath); int startpos = 0; int endpos = arrfile.Length - 1; // Check for silence at start for (int j = 0; isSilence(arrfile, j, noiceLevel); j += 20) startpos = j; // Allow room for tone-in buffer int buffer = wain.SampleRate * (wain.BitsPerSample / 8) / 32; // 1/32 seconds lead time startpos = startpos - buffer; if (startpos < 0) startpos = 0; // Check for silence at end. No need to check tone out buffer for (int k = arrfile.Length - buffer; (k >= 0) && (isSilence(arrfile, k, noiceLevel)); k -= 20) endpos = k; // Allow room for tone-out buffer endpos = endpos + buffer; if (endpos > arrfile.Length) endpos = arrfile.Length - 2; if (startpos >= endpos) return false; byte[] newarr = new byte[endpos - startpos]; for (int ni = 0, m = startpos; ni < newarr.Length; m++, ni++) newarr[ni] = arrfile[m]; // write file back WavFileWriter writer = new WavFileWriter(@strPath, wain.SampleRate, wain.BitsPerSample, wain.Channels); writer.Write(newarr, newarr.Length); writer.Close(); return true; }
/// <summary> /// Speed up wav file to mimic Donald Duck /// </summary> /// <param name="strPath">Source wave</param> /// <param name="speed">Speed between 0 and 19 </param> /// <returns>True/False</returns> public bool SpeedUp(string strPath, int speed) { if ((strPath == null) || (strPath == "")) { return(false); } if ((speed < 0) || (speed > 19)) { return(false); } // Read from file wavProcessor wain = new wavProcessor(); if (!wain.WaveHeaderIN(@strPath)) { return(false); } byte[] arrfile = GetWAVEData(strPath); byte[] newfile = new byte[arrfile.Length]; int skip = 21 - speed; int j = 0; for (int i = 0; i < arrfile.Length; i += 2) { if (skip > 20 || (((i / 2) % skip) != 0)) { newfile[j] = arrfile[i]; newfile[j + 1] = arrfile[i + 1]; j += 2; } } // write file back WavFileWriter writer = new WavFileWriter(@strPath, wain.SampleRate, wain.BitsPerSample, wain.Channels); writer.Write(newfile, j); writer.Close(); return(true); }
/// <summary> /// Tone out wav file /// </summary> /// <param name="strPath">Source wave</param> /// <returns>True/False</returns> public bool ToneOut(string strPath) { if ((strPath == null) || (strPath == "")) { return(false); } // Read from file wavProcessor wain = new wavProcessor(); if (!wain.WaveHeaderIN(@strPath)) { return(false); } byte[] arrfile = GetWAVEData(strPath); // Calculate constants int end = wain.Length; int start = end - (wain.SampleRate * (wain.BitsPerSample / 8) / 16); // 1/16 seconds from end int span = end - start; //change volume for (int j = start; j < arrfile.Length; j += 2) { short snd = ComplementToSigned(ref arrfile, j); snd = Convert.ToInt16(snd * (end - j) / span); byte[] newval = SignedToComplement(snd); arrfile[j] = newval[0]; arrfile[j + 1] = newval[1]; } // write file back WavFileWriter writer = new WavFileWriter(@strPath, wain.SampleRate, wain.BitsPerSample, wain.Channels); writer.Write(arrfile, arrfile.Length); writer.Close(); return(true); }
/// <summary> /// Filter out silence or noise from start and end of wave file. /// </summary> /// <param name="strPath">Source wave file</param> /// <param name="noiceLevel">Absolute value for noice threshold</param> /// <returns>True/False</returns> public bool StripSilence(string strPath, int noiceLevel) { if ((strPath == null) || (strPath == "")) { return(false); } // Read from file wavProcessor wain = new wavProcessor(); if (!wain.WaveHeaderIN(@strPath)) { return(false); } byte[] arrfile = GetWAVEData(strPath); int startpos = 0; int endpos = arrfile.Length - 1; // Check for silence at start for (int j = 0; isSilence(arrfile, j, noiceLevel); j += 20) { startpos = j; } // Allow room for tone-in buffer int buffer = wain.SampleRate * (wain.BitsPerSample / 8) / 32; // 1/32 seconds lead time startpos = startpos - buffer; if (startpos < 0) { startpos = 0; } // Check for silence at end. No need to check tone out buffer for (int k = arrfile.Length - buffer; (k >= 0) && (isSilence(arrfile, k, noiceLevel)); k -= 20) { endpos = k; } // Allow room for tone-out buffer endpos = endpos + buffer; if (endpos > arrfile.Length) { endpos = arrfile.Length - 2; } if (startpos >= endpos) { return(false); } byte[] newarr = new byte[endpos - startpos]; for (int ni = 0, m = startpos; ni < newarr.Length; m++, ni++) { newarr[ni] = arrfile[m]; } // write file back WavFileWriter writer = new WavFileWriter(@strPath, wain.SampleRate, wain.BitsPerSample, wain.Channels); writer.Write(newarr, newarr.Length); writer.Close(); return(true); }
/// <summary> /// Tone in wav file /// </summary> /// <param name="strPath">Source wave</param> /// <returns>True/False</returns> public bool ToneIn(string strPath) { if ((strPath == null) || (strPath == "")) return false; // Read from file wavProcessor wain = new wavProcessor(); if (!wain.WaveHeaderIN(@strPath)) return false; byte[] arrfile = GetWAVEData(strPath); // Calculate constants int start = 0; int end = wain.SampleRate * (wain.BitsPerSample / 8) / 16; // 1/16 seconds int span = end - start; //change volume for (int j = start; j < end; j += 2) { short snd = ComplementToSigned(ref arrfile, j); snd = Convert.ToInt16(snd * (j / span)); byte[] newval = SignedToComplement(snd); arrfile[j] = newval[0]; arrfile[j + 1] = newval[1]; } // write file back WavFileWriter writer = new WavFileWriter(@strPath, wain.SampleRate, wain.BitsPerSample, wain.Channels); writer.Write(arrfile, arrfile.Length); writer.Close(); return true; }
/// <summary> /// Speed up wav file to mimic Donald Duck /// </summary> /// <param name="strPath">Source wave</param> /// <param name="speed">Speed between 0 and 19 </param> /// <returns>True/False</returns> public bool SpeedUp(string strPath, int speed) { if ((strPath == null) || (strPath == "")) return false; if ((speed < 0) || (speed > 19)) return false; // Read from file wavProcessor wain = new wavProcessor(); if (!wain.WaveHeaderIN(@strPath)) return false; byte[] arrfile = GetWAVEData(strPath); byte[] newfile = new byte[arrfile.Length]; int skip = 21-speed; int j = 0; for (int i = 0; i < arrfile.Length; i += 2) { if (skip > 20 || (((i/2) % skip) != 0)) { newfile[j] = arrfile[i]; newfile[j + 1] = arrfile[i + 1]; j += 2; } } // write file back WavFileWriter writer = new WavFileWriter(@strPath, wain.SampleRate, wain.BitsPerSample, wain.Channels); writer.Write(newfile, j); writer.Close(); return true; }