private IEnumerator Recognise(AudioClip clip)
        {
            var wavData = new WavData(clip);

            var queryString          = String.Format(BingSpeechAPIStrings.QUERY_STRING_SPEECH_API_FORMAT, Guid.NewGuid(), BingSpeechAPIStrings.PARAMETER_APP_ID, Guid.NewGuid());
            var speechRecognitionUri = BingSpeechAPIStrings.URI_SPEECH_RECOGNISE + queryString;

            var headers = CreateRecogniseHeaders(clip);

            // Request
            var w = new WWW(speechRecognitionUri, wavData.FullRawBytes, headers);

            yield return(w);

            // Response
            if (string.IsNullOrEmpty(w.error))
            {
                if (OnRecognise != null)
                {
                    var args = new RecogniseEventArgs(true, w.text);
                    OnRecognise(this, args);
                }
            }
            else
            {
                Debug.Log("Error: " + w.text);
            }
        }
Example #2
0
        private void ReadDataWave()
        {
            System.Windows.Forms.OpenFileDialog openFileDialog = new OpenFileDialog();
            openFileDialog.Filter = "All Supported Files (*.wav)|*.wav";
            if (openFileDialog.ShowDialog() == System.Windows.Forms.DialogResult.Cancel)
            {
                return;
            }

            FileName = openFileDialog.FileName;
            WavFile file = new WavFile(FileName);     //входной файл
            WavData orig = file.ReadData();

            Processed = new WavData(orig.Header, orig.Data.Length);
            SelectedData.Clear();
            Line.Points.Clear();

            using (orig)
            {
                int c = orig.GetSamplesCount();

                int x = 0;

                for (int i = 0; i < c; i++)
                {
                    float y = orig.ReadNextSample();     //читаем следующий семпл
                    Line.Points.Add(new DataPoint(x++, y));
                }
                Model.InvalidatePlot(true);
            }
        }
Example #3
0
        private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
        {
            this.Cursor = Cursors.WaitCursor;

            for (int j = 0; j < audioFiles.Length; j++)
            {
                try
                {
                    WavData.ReadWavDataChunk(audioFiles[j]);
                }
                catch (WavException ex)
                {
                    MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }

                setProgressBarSpeed(1);

                rawdata = WavData.NornalizeData;

                mfcc = MFCC.Transform(ref rawdata, 0, WavData.SampleNumber, Constants.mfccSize, Constants.sampleRate, Constants.mfccFreqMin, Constants.mfccFreqMax);

                string mfccString = "";
                for (int i = 0; i < mfcc.Length; i++)
                {
                    mfccString += mfcc[i] + "/";
                }

                mfccString = mfccString.Substring(0, mfccString.Length - 1);

                using (StreamWriter streamwriter = new StreamWriter(pathToTempBase, true, Encoding.UTF8))
                {
                    streamwriter.WriteLine(String.Format("{0};{1}", word, mfccString));
                }
            }
        }
Example #4
0
            public void WriteData(WavData input)
            {
                var header = input.Header;

                byte[] data = input.Data;
                using (var fs = new FileStream(FilePath, FileMode.Create, FileAccess.Write))
                {
                    using (var writer = new BinaryWriter(fs))
                    {
                        //пишем заголовок
                        writer.Write((int)header.ChunkId);
                        writer.Write((int)header.ChunkSize);
                        writer.Write((int)header.Format);
                        writer.Write((int)header.Subchunk1Id);
                        writer.Write((int)header.Subchunk1Size);
                        writer.Write((short)header.AudioFormat);
                        writer.Write((short)header.NumChannels);
                        writer.Write((int)header.SampleRate);
                        writer.Write((int)header.ByteRate);
                        writer.Write((short)header.BlockAlign);
                        writer.Write((short)header.BitsPerSample);

                        if (header.Subchunk1Size == 18)
                        {
                            writer.Write((short)0);
                        }

                        //пишем данные
                        writer.Write((int)header.Subchunk2Id);
                        writer.Write((int)header.Subchunk2Size);
                        writer.Write(data);
                    }
                }
            }
Example #5
0
        public void AddSound(string name, WavData wavData)
        {
            var sound = new WavViewModel(name, wavData);

            Sounds.Add(sound);
            sound.RemoveSoundCommand = new RelayCommand(() => Sounds.Remove(sound));
        }
Example #6
0
        private void LoadFile(object o)
        {
            OpenFileDialog openFileDialog = new OpenFileDialog();

            openFileDialog.Title      = "Browse WAV Files";
            openFileDialog.DefaultExt = "wav";
            openFileDialog.Filter     = "WAV files (*.wav)|*.wav";

            if (openFileDialog.ShowDialog() == true)
            {
                WavData data = WavReader.ReadData(openFileDialog.FileName);
                this.Channel    = data.Samples;
                this.FileName   = openFileDialog.FileName;
                this.SampleRate = data.FormatChunk.SampleRate;
                List <DataPoint> signal = new List <DataPoint>();
                for (int i = 0; i < this.Channel.Length; i++)
                {
                    signal.Add(new DataPoint(i, this.Channel[i]));
                }
                this.Signal = signal;
                this.AutocorrelationFreq = null;
                this.FourierFreq         = null;
                this.AutocorrelationData = null;
                Notify.Info("WAV file loaded sucessfully!");
            }
        }
Example #7
0
        public static void WriteData(string fileName, WavData data)
        {
            using (var fs = File.Create(fileName))
                using (var writer = new BinaryWriter(fs))
                {
                    writer.Write(data.DescriptorChunk.ChunkId);
                    writer.Write(data.DescriptorChunk.ChunkSize);
                    writer.Write(data.DescriptorChunk.Format);

                    writer.Write(data.FormatChunk.ChunkId);
                    writer.Write(data.FormatChunk.ChunkSize);
                    writer.Write(data.FormatChunk.AudioFormat);
                    writer.Write(data.FormatChunk.NumChannels);
                    writer.Write(data.FormatChunk.SampleRate);
                    writer.Write(data.FormatChunk.ByteRate);
                    writer.Write(data.FormatChunk.BlockAlign);
                    writer.Write(data.FormatChunk.BitsPerSample);

                    if (data.FormatChunk.ChunkSize == 18)
                    {
                        writer.Write(data.FormatChunk.ExtraData);
                    }

                    writer.Write(data.DataChunk.ChunkId);
                    writer.Write(data.DataChunk.ChunkSize);
                    writer.Write(data.DataChunk.RawData);
                }
        }
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 * (double)numericStartDelayTorelance.Value + (double)numericAccumulateSeconds.Value)
                {
                    textBoxConsole.Text += string.Format(rm.GetString("WavFileTooShort"), path, (double)numericStartDelayTorelance.Value + (double)numericAccumulateSeconds.Value) + "\r\n";
                    return(null);
                }
            }

            return(wavData);
        }
Example #9
0
    private IEnumerator RecognizeCoroutine(AudioClip clip)
    {
        var wavData = new WavData(clip);

        var client = UnityWebRequest.Put(sttUrl + "?language=" + sttLanguage, wavData.FullRawBytes);

        client.SetRequestHeader("Ocp-Apim-Subscription-Key", subscriptionKey);
        client.SetRequestHeader("Authorization", _storedTokenValue);
        client.SetRequestHeader("Content-type", "audio/wav; codec=audio/pcm; samplerate=16000");

        client.method = "POST";

        yield return(client.SendWebRequest());

        if (client.isNetworkError || client.isHttpError)
        {
            Debug.Log(client.error);
        }
        else
        {
            string resultContent = client.downloadHandler.text;
            Debug.Log(resultContent);
            //OnTextReceived(resultContent);
            Debug.Log("Recognizing...DONE");

            Debug.Log(resultContent.ToString());

            var result = JsonUtility.FromJson <RecognitionResult>(resultContent.ToString());

            OnTextReceived(result);
        }
    }
Example #10
0
        public List <Sound> Calculate(WavData wavData)
        {
            var frequencies = new List <Sound>();

            for (int i = 0; i < wavData.ChunkedSamples.Length; i++)
            {
                var samples = wavData.ChunkedSamples[i];

                var localMin            = (Index : 0, Value : double.MaxValue);
                var lastValue           = double.MinValue;
                var monotonicityChanged = 0;
                var isGrowing           = true;
                var found  = false;
                var result = new double[samples.Length - 1];

                for (int j = 1; j < samples.Length; j++)
                {
                    var correlated = 0.0;
                    for (int k = 0; k < samples.Length - j; k++)
                    {
                        correlated += Math.Abs(samples[k] - samples[k + j]);
                    }

                    result[j - 1] = correlated;

                    if (!found && isGrowing != lastValue < correlated)
                    {
                        isGrowing = lastValue < correlated;
                        monotonicityChanged++;

                        if (monotonicityChanged == 2)
                        {
                            localMin = (j - 1, lastValue);
                            found    = true;
                        }
                    }

                    lastValue = correlated;
                }

                var frequency = wavData.FormatChunk.SampleRate / localMin.Index;
                if (frequencies.Any() && frequencies.Last().Frequency == frequency)
                {
                    frequencies.Last().EndTime += 50;
                }
                else
                {
                    frequencies.Add(new Sound
                    {
                        StartTime = i * 50,
                        EndTime   = i * 50 + 50,
                        Frequency = frequency,
                        Result    = result
                    });
                }
            }

            return(frequencies);
        }
Example #11
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 #12
0
        public WavViewModel(string name, WavData wavData)
        {
            Name        = name;
            Duration    = wavData.NumberOfChunks * 50;
            WavData     = wavData;
            WavByteData = wavData.GetByteData();

            PlaySoundCommand = new RelayCommand(PlaySound);
            SaveSoundCommand = new RelayCommand(SaveSound);
        }
Example #13
0
        public double[] Equalize(double[] gains, WavData wavData)
        {
            var n              = FourierHelper.GetExpandedPow2(_windowLength + _filterLength - 1);
            var size           = wavData.Samples.Length + n - _windowLength;
            var result         = new double[size];
            var windows        = new double[size / _windowHopSize][];
            var windowsComplex = new Complex[size / _windowHopSize][];

            for (int i = 0; i < windows.Length; i++)
            {
                windows[i]        = new double[n];
                windowsComplex[i] = new Complex[n];
            }

            var windowFactors = _window.WindowFactors(_windowLength);
            var gainsComplex  = GenerateGains(gains, wavData.FormatChunk.SampleRate, n);

            for (int i = 0; i < windows.Length; i++)
            {
                for (int j = 0; j < _windowLength; j++)
                {
                    if (i * _windowHopSize + j < wavData.Samples.Length)
                    {
                        windows[i][j] = windowFactors[j] * wavData.Samples[i * _windowHopSize + j];
                    }
                    else
                    {
                        windows[i][j] = 0;
                    }
                }
                for (int j = _windowLength; j < n; j++)
                {
                    windows[i][j] = 0;
                }

                windowsComplex[i] = FourierTransform.FFT(windows[i]);
                windowsComplex[i] = AdjustGain(gainsComplex, windowsComplex[i]);
                windows[i]        = FourierTransform.IFFT(windowsComplex[i]);
            }

            for (int i = 0; i < windows.Length; i++)
            {
                for (int j = 0; j < windows[i].Length; j++)
                {
                    if (i * _windowHopSize + j < wavData.Samples.Length)
                    {
                        result[i * _windowHopSize + j] += windows[i][j];
                    }
                }
            }

            return(result);
        }
Example #14
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 #15
0
            public WavData ReadData()
            {
                var header = new WavHeader();

                byte[] data;
                using (var fs = new FileStream(FilePath, FileMode.Open, FileAccess.Read))
                {
                    using (var reader = new BinaryReader(fs))
                    {
                        //считываем заголовок
                        header.ChunkId       = reader.ReadInt32();
                        header.ChunkSize     = reader.ReadInt32();
                        header.Format        = reader.ReadInt32();
                        header.Subchunk1Id   = reader.ReadInt32();
                        header.Subchunk1Size = reader.ReadInt32();
                        header.AudioFormat   = reader.ReadInt16();
                        header.NumChannels   = reader.ReadInt16();
                        header.SampleRate    = reader.ReadInt32();
                        header.ByteRate      = reader.ReadInt32();
                        header.BlockAlign    = reader.ReadInt16();
                        header.BitsPerSample = reader.ReadInt16();

                        if (header.Subchunk1Size == 18)
                        {
                            header.FmtExtraSize = reader.ReadInt16();
                            reader.ReadBytes(header.FmtExtraSize);
                        }

                        //пытаемся считать данные
                        header.Subchunk2Id   = reader.ReadInt32();
                        header.Subchunk2Size = reader.ReadInt32();

                        while (true)
                        {
                            data = reader.ReadBytes(header.Subchunk2Size);
                            if (header.Subchunk2Id == 0x61746164)
                            {
                                break;
                            }                                               //данные найдены

                            //если Subchunk2Id нет тот, что ожидался, пропускаем и пробуем снова
                            header.Subchunk2Id   = reader.ReadInt32();
                            header.Subchunk2Size = reader.ReadInt32();
                        }
                    }
                }

                var result = new WavData(header, data);

                return(result);
            }
Example #16
0
        private bool WriteWavFile(WavData wavData, string path)
        {
            bool rv = true;

            try {
                using (BinaryWriter bw1 = new BinaryWriter(File.Open(path, FileMode.Create))) {
                    wavData.Write(bw1);
                }
            } catch (System.Exception ex) {
                Console.WriteLine(ex.ToString());
                rv = false;
            }
            return(rv);
        }
Example #17
0
        ////////////////////////////////////////////////////////

        public SignalGeneratorResult GenerateSignal(SignalGenerateParams s, out WavData wavData)
        {
            List <PcmSamples1Channel> samples = new List <PcmSamples1Channel>();

            int nSample           = s.seconds * s.sampleRate;
            PcmSamples1Channel ch = new PcmSamples1Channel(nSample, s.bitsPerSample);

            samples.Add(ch);

            System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch();
            sw.Start();

            SignalGeneratorResult result = SignalGeneratorResult.Success;
            double truncFreq             = (s.sampleRate / 2) * s.truncationRatio;

            switch (s.ss)
            {
            case SignalShape.SineWave:
                result = GenerateSineWave(ch, s.sampleRate, s.freq, s.amplitude);
                break;

            case SignalShape.SquareWave:
                result = GenerateSquareWave(ch, s.sampleRate, s.freq, s.amplitude, truncFreq);
                break;

            case SignalShape.SawToothWaveDesc:
                result = GenerateSawToothWave(ch, s.sampleRate, s.freq, s.amplitude, truncFreq, false);
                break;

            case SignalShape.SawToothWaveAsc:
                result = GenerateSawToothWave(ch, s.sampleRate, s.freq, s.amplitude, truncFreq, true);
                break;

            case SignalShape.TriangleWave:
                result = GenerateTriangleWave(ch, s.sampleRate, s.freq, s.amplitude, truncFreq);
                break;

            default:
                System.Diagnostics.Debug.Assert(false);
                break;
            }

            sw.Stop();
            Console.WriteLine("{0} ms", sw.ElapsedMilliseconds);


            wavData = new WavData();
            wavData.Create(s.sampleRate, s.bitsPerSample, samples);
            return(result);
        }
Example #18
0
        private void SaveRecordedData()
        {
            var bytes   = wasapi.GetCapturedData(mCapturedPcmData);
            var nFrames = bytes / WasapiCS.SampleFormatTypeToUseBytesPerSample(mSampleFormat) / mNumChannels;

            if (nFrames == 0)
            {
                return;
            }

            textBoxLog.Text += string.Format("captured frames={0} ({1:F1} seconds) glichCount={2}\r\n",
                                             nFrames, (double)nFrames / mSamplingFrequency, wasapi.GetCaptureGlitchCount());

            Microsoft.Win32.SaveFileDialog dlg = new Microsoft.Win32.SaveFileDialog();
            dlg.DefaultExt = ".wav";
            dlg.Filter     = "WAVEファイル|*.wav";

            Nullable <bool> result = dlg.ShowDialog();

            if (result != true)
            {
                return;
            }

            // あとで本のサイズに戻す。
            var originalSize = mCapturedPcmData.Length;

            Array.Resize(ref mCapturedPcmData, (int)bytes);

            mWavData = new WavData();
            mWavData.Set(mNumChannels, WasapiCS.SampleFormatTypeToUseBytesPerSample(mSampleFormat) * 8, WasapiCS.SampleFormatTypeToValidBitsPerSample(mSampleFormat),
                         mSamplingFrequency, SampleFormatToVRT(mSampleFormat), nFrames, mCapturedPcmData);

            try {
                using (BinaryWriter w = new BinaryWriter(File.Open(dlg.FileName, FileMode.Create))) {
                    mWavData.Write(w);

                    textBoxLog.Text += string.Format("ファイル保存成功: {0}\r\n", dlg.FileName);
                }
            } catch (Exception ex) {
                string s = string.Format("E: ファイル保存失敗: {0}\r\n{1}\r\n", dlg.FileName, ex);
                textBoxLog.Text += s;
                MessageBox.Show(s);
            }

            slider1.Value  = 0;
            label1.Content = "0/0";
            Array.Resize(ref mCapturedPcmData, originalSize);
        }
Example #19
0
        private void Effect(WavData wavData)
        {
            if (checkBoxInvert.Checked) {
                for (int ch=0; ch < wavData.NumChannels; ++ch) {
                    for (int pos=0; pos < wavData.NumSamples; ++pos) {
                        short val = wavData.Sample16Get(ch, pos);

                        // Invert! we want to do this effect
                        val = (short)-val;

                        wavData.Sample16Set(ch, pos, val);
                    }
                }
            }
        }
Example #20
0
        public List <Sound> Calculate(WavData wavData)
        {
            var frequencies = new List <Sound>();

            for (int i = 0; i < wavData.ChunkedSamples.Length; i++)
            {
                var samples = wavData.ChunkedSamples[i];

                var reducedSamples = FourierHelper.ReduceToPow2(samples);
                reducedSamples = FourierHelper.PreEmphasis(reducedSamples);
                reducedSamples = _fourierWindow.Windowing(reducedSamples);

                var complexSamples = FourierTransform.FFT(reducedSamples);
                complexSamples = complexSamples.Take(complexSamples.Length / 2).ToArray();

                var threshold = complexSamples.Max(c => c.Magnitude) / 10;
                var localMax  = 0;

                for (int j = 1; j < complexSamples.Length; j++)
                {
                    if (complexSamples[j].Magnitude > threshold && complexSamples[j].Magnitude > complexSamples[j - 1].Magnitude && complexSamples[j].Magnitude > complexSamples[j + 1].Magnitude)
                    {
                        localMax = j;
                        break;
                    }
                }

                var frequency = (wavData.FormatChunk.SampleRate / (complexSamples.Length * 2)) * localMax;
                if (frequencies.Any() && frequencies.Last().Frequency == frequency)
                {
                    frequencies.Last().EndTime += 50;
                }
                else
                {
                    frequencies.Add(new Sound
                    {
                        StartTime = i * 50,
                        EndTime   = i * 50 + 50,
                        Frequency = frequency,
                        Result    = complexSamples.Select(c => c.Magnitude).ToArray()
                    });
                }
            }

            return(frequencies);
        }
Example #21
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);
        }
Example #22
0
        private void Effect(WavData wavData)
        {
            if (checkBoxInvert.Checked)
            {
                for (int ch = 0; ch < wavData.NumChannels; ++ch)
                {
                    for (int pos = 0; pos < wavData.NumSamples; ++pos)
                    {
                        short val = wavData.Sample16Get(ch, pos);

                        // Invert! we want to do this effect
                        val = (short)-val;

                        wavData.Sample16Set(ch, pos, val);
                    }
                }
            }
        }
Example #23
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 #24
0
        private void UnixPlayThread(object state)
        {
            if (_unixPlayStopEvent.WaitOne(0))
            {
                return;
            }
            Stream      stream = null;
            AudioDevice dev    = null;

            try
            {
                lock (s_playSync)
                {
                    dev          = AudioDevice.CreateAlsaDevice(_latency);
                    stream       = ReadFile((string)state);
                    _unixWavData = new WavData(_logger, stream, _unixPlayStopEvent);
                }
                _unixWavData.Setup(dev);
                _unixWavData.Play(dev);
            }
            catch (ThreadAbortException)
            {
            }
            catch (Exception ex)
            {
                _logger.LogError(Message.SoundPlayError, ex, (string)state);
            }
            finally
            {
                if (dev != null)
                {
                    dev.Dispose();
                }
                if (stream != null)
                {
                    stream.Close();
                }
                if (_unixWavData == null || !_unixWavData.IsStopped)
                {
                    PlayingStopped.RaiseEvent(this);
                }
            }
        }
Example #25
0
        private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
        {
            WavData wavData = ReadWavFile(textBoxInput.Text);

            if (null == wavData)
            {
                e.Result = string.Format(rm.GetString("ReadWavFileFailed"), textBoxInput.Text) + "\r\n";
                return;
            }

            Effect(wavData);

            if (!WriteWavFile(wavData, textBoxOutput.Text))
            {
                e.Result = string.Format(rm.GetString("WriteWavFileFailed"), textBoxOutput.Text) + "\r\n";
                return;
            }
            e.Result = string.Format(rm.GetString("WriteWavFileSucceeded"), textBoxOutput.Text) + "\r\n";
        }
Example #26
0
        private WavData ReadWavFile(string path)
        {
            WavData wavData = new WavData();

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

            using (BinaryReader br1 = new BinaryReader(File.Open(path, FileMode.Open))) {
                if (!wavData.Read(br1))
                {
                    return(null);
                }
                if (16 != wavData.BitsPerSample)
                {
                    return(null);
                }
            }

            return(wavData);
        }
        ////////////////////////////////////////////////////////
        public SignalGeneratorResult GenerateSignal(SignalGenerateParams s, out WavData wavData)
        {
            List<PcmSamples1Channel> samples = new List<PcmSamples1Channel>();

            int nSample = s.seconds * s.sampleRate;
            PcmSamples1Channel ch = new PcmSamples1Channel(nSample, s.bitsPerSample);
            samples.Add(ch);

            System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch();
            sw.Start();

            SignalGeneratorResult result = SignalGeneratorResult.Success;
            double truncFreq = (s.sampleRate / 2) * s.truncationRatio;

            switch (s.ss) {
            case SignalShape.SineWave:
                result = GenerateSineWave(ch, s.sampleRate, s.freq, s.amplitude);
                break;
            case SignalShape.SquareWave:
                result = GenerateSquareWave(ch, s.sampleRate, s.freq, s.amplitude, truncFreq);
                break;
            case SignalShape.SawToothWaveDesc:
                result = GenerateSawToothWave(ch, s.sampleRate, s.freq, s.amplitude, truncFreq, false);
                break;
            case SignalShape.SawToothWaveAsc:
                result = GenerateSawToothWave(ch, s.sampleRate, s.freq, s.amplitude, truncFreq, true);
                break;
            case SignalShape.TriangleWave:
                result = GenerateTriangleWave(ch, s.sampleRate, s.freq, s.amplitude, truncFreq);
                break;
            default:
                System.Diagnostics.Debug.Assert(false);
                break;
            }

            sw.Stop();
            Console.WriteLine("{0} ms", sw.ElapsedMilliseconds);

            wavData = new WavData();
            wavData.Create(s.sampleRate, s.bitsPerSample, samples);
            return result;
        }
Example #28
0
        public double[] FilterData(WavData wavData)
        {
            var result = new double[wavData.Samples.Length + _filterLength - 1];

            var filterFactors = BasicFilter.LowPassFilterFactors(_cutFreq, wavData.FormatChunk.SampleRate, _filterLength);
            var filtered      = _window.Windowing(filterFactors);

            var data  = wavData.Samples.ToList();
            var zeros = new double[_filterLength - 1];

            data.InsertRange(0, zeros);
            data.AddRange(zeros);

            for (int i = _filterLength - 1; i < data.Count; i++)
            {
                for (int j = 0; j < filtered.Length; j++)
                {
                    result[i - _filterLength + 1] += data[i - j] * filtered[j];
                }
            }

            return(result);
        }
Example #29
0
        private void buttonStart_Click(object sender, EventArgs e)
        {
            textBoxConsole.Clear();

            textBoxConsole.Text += string.Format(rm.GetString("ProcessStarted"),
                                                 textBoxWavFile1.Text, ReadFilePathToWriteFilePath(textBoxWavFile1.Text),
                                                 textBoxWavFile2.Text, ReadFilePathToWriteFilePath(textBoxWavFile2.Text)) + "\r\n";

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

            wavRead2 = ReadWavFile(textBoxWavFile2.Text);
            if (null == wavRead2)
            {
                textBoxConsole.Text += string.Format(rm.GetString("ReadWavFileFailed"), textBoxWavFile2.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 #30
0
 public void AddLR(WavData wd, int sampleNum, double start, double end)
 {
     double startTime = wd.RatioToTime(start);
     double endTime = wd.RatioToTime(end);
     double dt = (endTime - startTime) / sampleNum;
     short[] left = wd.GetLeft(sampleNum, start, end);
     short[] right = wd.GetRight(sampleNum, start, end);
     chart.Series.Clear();
     chart.Series.Add("L");
     chart.Series["L"].ChartType = System.Windows.Forms.DataVisualization.Charting.SeriesChartType.Line;
     for (int i = 0; i < left.Length; i++)
     {
         double x = startTime + dt * i;
         chart.Series["L"].Points.AddXY(x, left[i]);
     }
     chart.Series.Add("R");
     chart.Series["R"].ChartType = System.Windows.Forms.DataVisualization.Charting.SeriesChartType.Line;
     for (int i = 0; i < right.Length; i++)
     {
         double x = startTime + dt * i;
         chart.Series["R"].Points.AddXY(x, right[i]);
     }
     setXlim(startTime, endTime);
     setYlim(Int16.MinValue+1, Int16.MaxValue - 1);
 }
        public void GenerateTime()
        {
            var wavData = new WavData(44100, Time);

            SoundPlayerViewModel.AddSound("TimeFiltered", wavData);
        }
        public void GenerateOriginal()
        {
            var wavData = new WavData(44100, Original);

            SoundPlayerViewModel.AddSound("Original", wavData);
        }
        public void GenerateFrequency()
        {
            var wavData = new WavData(44100, Frequency);

            SoundPlayerViewModel.AddSound("FrequencyFiltered", wavData);
        }
Example #34
0
        private void DoWork(object o, DoWorkEventArgs args)
        {
            Console.WriteLine("DoWork started\n");

            int count = 0;
            while (!asio.Run()) {
                ++count;
                Console.WriteLine("\nForm1.DoWork() count={0} m_seconds={1}", count, m_seconds);
                int percent = 100 * count / m_seconds;
                if (100 < percent) {
                    percent = 100;
                }

            }
            int[] recordedData = asio.RecordedDataGet(m_inputChannelNum, m_seconds * SAMPLE_RATE);
            PcmSamples1Channel ch0 = new PcmSamples1Channel(m_seconds * SAMPLE_RATE, 16);
            int max = 0;
            int min = 0;
            for (int i = 0; i < recordedData.Length; ++i) {
                if (max < recordedData[i]) {
                    max = recordedData[i];
                }
                if (recordedData[i] < min) {
                    min = recordedData[i];
                }
            }
            Console.WriteLine("max={0} min={1}", max, min);

            if (max < -min) {
                max = -min;
            }
            double mag = 32767.0 / max;
            Console.WriteLine("mag={0}", mag);

            for (int i = 0; i < recordedData.Length; ++i) {
                ch0.Set16(i, (short)(recordedData[i] * mag));
            }

            List<PcmSamples1Channel> chList = new List<PcmSamples1Channel>();
            chList.Add(ch0);

            WavData wd = new WavData();
            wd.Create(SAMPLE_RATE, 16, chList);
            using (BinaryWriter bw = new BinaryWriter(File.Open(m_writeFilePath, FileMode.Create))) {
                wd.Write(bw);
            }

            args.Result = 0;
            Console.WriteLine("DoWork end\n");
        }
        static void Main(string[] args)
        {
            {
                byte[] rawData16 = new byte[65536 * 2];
                for (int i = 0; i < 65536; ++i) {
                    rawData16[i * 2] = (byte)(i & 0xff);
                    rawData16[i * 2 + 1] = (byte)(i >> 8);
                }

                WavData wdOrigI16 = new WavData();
                wdOrigI16.CreateHeader(1, 44100, 16, 65536);
                wdOrigI16.SetRawData(rawData16);

                {
                    System.Console.WriteLine("I16 ==> I24 ==> I16 test");
                    WavData wdI24 = wdOrigI16.BitsPerSampleConvertTo(24, ValueRepresentationType.SInt);
                    WavData wdNew = wdI24.BitsPerSampleConvertTo(16, ValueRepresentationType.SInt);

                    byte[] b16to24 = wdI24.SampleRawGet();
                    byte[] bNew = wdNew.SampleRawGet();
                    int iMin = Int32.MaxValue;
                    int iMax = Int32.MinValue;

                    for (int i = 0; i < 65536; ++i) {

                        short vOrig = (short)((int)rawData16[i * 2] + (rawData16[i * 2 + 1] << 8));
                        int v16to24 =
                            ((int)b16to24[i * 3] << 8)
                            + (b16to24[i * 3 + 1] << 16)
                            + (b16to24[i * 3 + 2] << 24);
                        int vNew24 = v16to24 / 256;

                        if (vNew24 < iMin) {
                            iMin = vNew24;
                        }
                        if (iMax < vNew24) {
                            iMax = vNew24;
                        }

                        short vNew = (short)((int)bNew[i * 2] + (bNew[i * 2 + 1] << 8));

                        if (0 != (vNew - vOrig)) {
                            System.Console.WriteLine("{0} ==> {1} via {2} diff={3} DIFFERENT! ################",
                            vOrig, vNew, vNew24, vNew - vOrig);
                        }
                    }
                    System.Console.WriteLine("  i24 min={0} max={1}",
                        iMin, iMax);
                }

                {
                    System.Console.WriteLine("I16 ==> I32 ==> I16 test");
                    WavData wdI32 = wdOrigI16.BitsPerSampleConvertTo(32, ValueRepresentationType.SInt);
                    WavData wdNew = wdI32.BitsPerSampleConvertTo(16, ValueRepresentationType.SInt);
                    byte[] b16toI32 = wdI32.SampleRawGet();
                    byte[] bNew = wdNew.SampleRawGet();
                    int iMin = Int32.MaxValue;
                    int iMax = Int32.MinValue;
                    for (int i = 0; i < 65536; ++i) {

                        short vOrig = (short)((int)rawData16[i * 2] + (rawData16[i * 2 + 1] << 8));
                        int vI32 = BitConverter.ToInt32(b16toI32, i * 4);

                        if (vI32 < iMin) {
                            iMin = vI32;
                        }
                        if (iMax < vI32) {
                            iMax = vI32;
                        }

                        short vNew = (short)((int)bNew[i * 2] + (bNew[i * 2 + 1] << 8));
                        if (0 != (vNew - vOrig)) {
                            System.Console.WriteLine("{0} ==> {1} via {2} diff={3} DIFFERENT!",
                                vOrig, vNew, vI32, vNew - vOrig);
                        }
                    }
                    System.Console.WriteLine("  i32 min={0} max={1}",
                        iMin, iMax);
                }

                {
                    System.Console.WriteLine("I16 ==> F32 ==> I16 test");
                    WavData wdF32 = wdOrigI16.BitsPerSampleConvertTo(32, ValueRepresentationType.SFloat);
                    WavData wdNew = wdF32.BitsPerSampleConvertTo(16, ValueRepresentationType.SInt);
                    byte[] b16toF32 = wdF32.SampleRawGet();
                    byte[] bNew = wdNew.SampleRawGet();
                    float fMin = float.MaxValue;
                    float fMax = float.MinValue;
                    for (int i = 0; i < 65536; ++i) {

                        short vOrig = (short)((int)rawData16[i * 2] + (rawData16[i * 2 + 1] << 8));
                        float vF32 = BitConverter.ToSingle(b16toF32, i * 4);

                        if (vF32 < fMin) {
                            fMin = vF32;
                        }
                        if (fMax < vF32) {
                            fMax = vF32;
                        }

                        short vNew = (short)((int)bNew[i * 2] + (bNew[i * 2 + 1] << 8));
                        if (0 != (vNew - vOrig)) {
                            System.Console.WriteLine("{0} ==> {1} via {2} diff={3} DIFFERENT!",
                                vOrig, vNew, vF32, vNew - vOrig);
                        }
                    }

                    System.Console.WriteLine("  fMin={0} fMax={1}", fMin, fMax);
                }
            }

            {
                byte[] rawData24 = new byte[16777216 * 3];
                for (int i = 0; i < 16777216; ++i) {
                    rawData24[i * 3] = (byte)(i & 0xff);
                    rawData24[i * 3 + 1] = (byte)(i >> 8);
                    rawData24[i * 3 + 2] = (byte)(i >> 16);
                }

                WavData wdOrigI24 = new WavData();
                wdOrigI24.CreateHeader(1, 44100, 24, 16777216);
                wdOrigI24.SetRawData(rawData24);

                {
                    System.Console.WriteLine("I24 ==> I32 ==> I24 test");
                    WavData wdI32 = wdOrigI24.BitsPerSampleConvertTo(32, ValueRepresentationType.SInt);
                    WavData wdNew = wdI32.BitsPerSampleConvertTo(24, ValueRepresentationType.SInt);

                    byte[] b24to32 = wdI32.SampleRawGet();
                    byte[] bNew = wdNew.SampleRawGet();
                    int iMin = Int32.MaxValue;
                    int iMax = Int32.MinValue;
                    for (int i = 0; i < 16777216; ++i) {

                        int vOrig32 = ((int)rawData24[i * 3]<<8)
                            + (rawData24[i * 3 + 1] << 16)
                            + (rawData24[i * 3 + 2] << 24);
                        int vOrig24 = vOrig32 / 256;

                        int v24to32 = BitConverter.ToInt32(b24to32, i * 4);

                        if (v24to32 < iMin) {
                            iMin = v24to32;
                        }
                        if (iMax < v24to32) {
                            iMax = v24to32;
                        }

                        int vNew32 = ((int)bNew[i * 3] << 8)
                            + (bNew[i * 3 + 1] << 16)
                            + (bNew[i * 3 + 2] << 24);
                        int vNew24 = vNew32 / 256;

                        if (0 != (vNew24 - vOrig24)) {
                            System.Console.WriteLine("{0} ==> {1} via {2} diff={3} DIFFERENT! ################",
                            vOrig24, vNew24, v24to32, vNew24 - vOrig24);
                        }
                    }
                    System.Console.WriteLine("  i32 min={0} max={1}",
                                            iMin, iMax);
                }

                {
                    System.Console.WriteLine("I24 ==> F32 ==> I24 test");
                    WavData wdF32 = wdOrigI24.BitsPerSampleConvertTo(32, ValueRepresentationType.SFloat);
                    WavData wdNew = wdF32.BitsPerSampleConvertTo(24, ValueRepresentationType.SInt);

                    byte[] b24toF32 = wdF32.SampleRawGet();
                    byte[] bNew = wdNew.SampleRawGet();
                    float fMin = float.MaxValue;
                    float fMax = float.MinValue;
                    for (int i = 0; i < 16777216; ++i) {

                        int vOrig32 = ((int)rawData24[i * 3] << 8)
                            + (rawData24[i * 3 + 1] << 16)
                            + (rawData24[i * 3 + 2] << 24);
                        int vOrig24 = vOrig32 / 256;

                        float vF32 = BitConverter.ToSingle(b24toF32, i * 4);

                        if (vF32 < fMin) {
                            fMin = vF32;
                        }
                        if (fMax < vF32) {
                            fMax = vF32;
                        }

                        int vNew32 = ((int)bNew[i * 3] << 8)
                            + (bNew[i * 3 + 1] << 16)
                            + (bNew[i * 3 + 2] << 24);
                        int vNew24 = vNew32 / 256;

                        if (0 != (vNew24 - vOrig24)) {
                            System.Console.WriteLine("{0} ==> {1} via {2} diff={3} DIFFERENT! ################",
                            vOrig24, vNew24, vF32, vNew24 - vOrig24);
                        }
                    }
                    System.Console.WriteLine("  fMin={0} fMax={1}", fMin, fMax);
                }
            }

            System.Console.WriteLine("done.");
        }
        private void SaveRecordedData()
        {
            var bytes = wasapi.GetCapturedData(mCapturedPcmData);
            var nFrames = bytes / WasapiCS.SampleFormatTypeToUseBytesPerSample(mSampleFormat) / mNumChannels;

            if (nFrames == 0) {
                return;
            }

            textBoxLog.Text += string.Format("captured frames={0} ({1:F1} seconds) glichCount={2}\r\n",
                nFrames, (double)nFrames / mSamplingFrequency, wasapi.GetCaptureGlitchCount());

            Microsoft.Win32.SaveFileDialog dlg = new Microsoft.Win32.SaveFileDialog();
            dlg.DefaultExt = ".wav";
            dlg.Filter = "WAVEファイル|*.wav";

            Nullable<bool> result = dlg.ShowDialog();

            if (result != true) {
                return;
            }

            // あとで本のサイズに戻す。
            var originalSize = mCapturedPcmData.Length;
            Array.Resize(ref mCapturedPcmData, (int)bytes);

            mWavData = new WavData();
            mWavData.Set(mNumChannels, WasapiCS.SampleFormatTypeToUseBytesPerSample(mSampleFormat) * 8, WasapiCS.SampleFormatTypeToValidBitsPerSample(mSampleFormat),
                mSamplingFrequency, SampleFormatToVRT(mSampleFormat), nFrames, mCapturedPcmData);

            try {
                using (BinaryWriter w = new BinaryWriter(File.Open(dlg.FileName, FileMode.Create))) {
                    mWavData.Write(w);

                    textBoxLog.Text += string.Format("ファイル保存成功: {0}\r\n", dlg.FileName);
                }
            } catch (Exception ex) {
                string s = string.Format("E: ファイル保存失敗: {0}\r\n{1}\r\n", dlg.FileName, ex);
                textBoxLog.Text += s;
                MessageBox.Show(s);
            }

            slider1.Value = 0;
            label1.Content = "0/0";
            Array.Resize(ref mCapturedPcmData, originalSize);
        }
Example #37
0
        private bool WriteWavFile(WavData wavData, string path)
        {
            Console.WriteLine(rm.GetString("WriteWavFileStarted"), path);

            bool rv = true;
            try {
                using (BinaryWriter bw1 = new BinaryWriter(File.Open(path, FileMode.Create))) {
                    wavData.Write(bw1);
                }
            } catch (System.Exception ex) {
                Console.WriteLine(ex.ToString());
                rv = false;
            }
            return rv;
        }
Example #38
0
        private WavData ReadWavFile(string path)
        {
            WavData wavData = new WavData();

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

            using (BinaryReader br1 = new BinaryReader(File.Open(path, FileMode.Open))) {
                if (!wavData.Read(br1)) {
                    return null;
                }
                if (16 != wavData.BitsPerSample) {
                    return null;
                }
            }

            return wavData;
        }