コード例 #1
0
        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);
        }
コード例 #2
0
ファイル: clsWaveProcessor.cs プロジェクト: Grawp/opentx
    /// <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;
    }
コード例 #3
0
    /// <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);
    }
コード例 #4
0
    /// <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);
    }
コード例 #5
0
    /// <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);
    }
コード例 #6
0
ファイル: clsWaveProcessor.cs プロジェクト: Grawp/opentx
    /// <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;
    }
コード例 #7
0
ファイル: clsWaveProcessor.cs プロジェクト: Grawp/opentx
    /// <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;
    }