Esempio n. 1
0
        public static float[] ConvertWav2FFTMag(string wavfile, string outfile)
        {
            WAVFile audioFile = new WAVFile();
            String  warning   = audioFile.Open(wavfile, WAVFile.WAVFileMode.READ);

            Complex[] indata      = new Complex[MaxSamples];
            int       IterSamples = (audioFile.NumSamples < MaxSamples) ? audioFile.NumSamples : MaxSamples;

            float[] indata_mag = null;

            if (warning == "")
            {
                //short audioSample = 0;
                for (int sampleNum = 0; sampleNum < IterSamples; ++sampleNum)
                {
                    //audioSample = audioFile.GetNextSampleAs16Bit();
                    indata[sampleNum].Re = audioFile.GetNextSampleAs16Bit();
                }
                FourierTransform.FFT(indata, FourierTransform.Direction.Forward);
                indata_mag = GetMagnitude(indata);

                if (outfile != null)
                {
                    WriteData(indata_mag, outfile);
                }
            }
            audioFile.Close();
            return(indata_mag);
        }
Esempio n. 2
0
        public void TestProcess()
        {
            Porcupine p = new Porcupine(Path.Combine(Environment.CurrentDirectory, "porcupine_params.pv"), keywordFilePath: $"{GetAbsRootPath()}resources/keyword_files/porcupine_{GetEnvironmentName()}.ppn", sensitivity: 0.5f);

            Assert.AreEqual(PicoVoiceStatus.SUCCESS, p.Status, "the status of the creation of the recognition system has failed");
            WAVFile file = new WAVFile();

            file.Open("porcupine.wav", WAVFile.WAVFileMode.READ);
            Assert.AreEqual(p.SampleRate() / 1000, file.BitsPerSample, "The samplerate is not equal!!!");
            List <short> data = new List <short>();

            while (file.NumSamplesRemaining > 0)
            {
                data.Add(BitConverter.ToInt16(file.GetNextSample_ByteArray()));
            }

            int framecount = (int)Math.Floor((decimal)(data.Count / p.FrameLength()));
            var results    = new List <bool>();

            for (int i = 0; i < framecount; i++)
            {
                int          start = i * p.FrameLength();
                int          count = p.FrameLength();
                List <short> frame = data.GetRange(start, count);
                p.Process(frame.ToArray(), out bool result);
                results.Add(result);
            }

            var res = results.Count(x => x);

            Assert.AreEqual(1, res, $"The result is not as expected, expected {1} got {res}");
            p.Dispose();
        }
Esempio n. 3
0
        public MemoryStream createWavMemory(Bitmap bitmap, string name, bool create_img, bool with_cue)
        {
            bitmap = managementGUI.resizeImage(bitmap, _scanWidth, _scanHeight, _myEyeMusic.ResizeMode);
            Rectangle rect = new Rectangle(0, 0, bitmap.Width, bitmap.Height);

            System.Drawing.Imaging.BitmapData bmpData = bitmap.LockBits(rect, System.Drawing.Imaging.ImageLockMode.ReadOnly, bitmap.PixelFormat);

            float[,] imArr = ReconstructColor(bmpData);
            bitmap.UnlockBits(bmpData);

            if (create_img)
            {
                Bitmap clusteredImage = generatePostClassifictionBitmap(imArr);
                // display image
                _myEyeMusic.setScanPictureBoxes(clusteredImage);
            }

            MemoryStreamEM sonifiedWAV = new MemoryStreamEM();
            MemoryStream   toREt       = sonifiedWAV.Create(_myEyeMusic.OutDirectory + "\\" + name + ".wav", false, 44100, 16);
            double         volume      = _myEyeMusic.MyVolume;

            if (_myEyeMusic.MyCueType.Equals(eyeMusic2.CueType.NoCue))
            {
                volume = 0.0;
            }

            if (with_cue)
            {
                short   sample;
                WAVFile cueWAVFile = new WAVFile();             // adding cue
                cueWAVFile.Open(_myEyeMusic._mapFile + "\\Sounds\\" + _myEyeMusic.model.beep_noise, WAVFile.WAVFileMode.READ);
                for (int j = 0; j < cueWAVFile.NumSamples; j++)
                {
                    sample = (short)(volume * cueWAVFile.GetNextSample_16bit());
                    sample = Math.Min(short.MaxValue, sample);
                    sonifiedWAV.AddSample_16bit(sample);
                }
                cueWAVFile.Close();
            }

            for (int i = 0; i < _scanWidth; i++)
            {
                createMixer(i, sonifiedWAV, imArr);
            }

            sonifiedWAV.addLength();

            toREt = sonifiedWAV.mFileStream;


            return(toREt);
        }
Esempio n. 4
0
        public void MultipleKeywords()
        {
            var modelFilePath = Path.GetFullPath(Path.Combine(Environment.CurrentDirectory, "porcupine_params.pv"));

            Assert.IsTrue(File.Exists(modelFilePath), $"File.Exists(modelFilePath) --> {modelFilePath}");
            paths.ForEach(keywordFilePath => Assert.IsTrue(File.Exists(keywordFilePath), $"File.Exists(keywordFilePath) --> {keywordFilePath}"));

            Porcupine p = new Porcupine(modelFilePath, keywordFilePaths: paths, sensitivities: senses);

            Assert.AreEqual(PicoVoiceStatus.SUCCESS, p.Status, "the status of the creation of the recognition system has failed");
            WAVFile file = new WAVFile();

            file.Open("multiple_keywords.wav", WAVFile.WAVFileMode.READ);
            Assert.AreEqual(p.SampleRate(), file.AudioFormat.SampleRateHz, "The samplerate is not equal!!!");
            List <short> data = new List <short>();

            while (file.NumSamplesRemaining > 0)
            {
                data.Add(BitConverter.ToInt16(file.GetNextSample_ByteArray()));
            }
            int framecount = (int)Math.Floor((decimal)(data.Count / p.FrameLength()));
            var results    = new List <int>();

            for (int i = 0; i < framecount; i++)
            {
                int             start  = i * p.FrameLength();
                int             count  = p.FrameLength();
                List <short>    frame  = data.GetRange(start, count);
                PicoVoiceStatus status = p.ProcessMultipleKeywords(frame.ToArray(), out int result);
                if (result >= 0)
                {
                    results.Add(result);
                }
                Assert.AreEqual(PicoVoiceStatus.SUCCESS, status, "The status is not as expected");
            }

            var requiredRes = new[] { 8, 0, 1, 2, 3, 4, 5, 7, 8, 9 };

            Assert.AreEqual(requiredRes.Length, results.Count, $"expected results length are different expected {requiredRes.Length} got {results.Count}");
            for (var i = 0; i < results.Count; i++)
            {
                Assert.AreEqual(requiredRes[i], results[i], $"The result is not as expected, expected {requiredRes[i]} got {results[i]}");
            }

            p.Dispose();
        }
Esempio n. 5
0
        public static MemoryStream encodeCompressedFromWAV(string source)
        {
            WAVFile      wav = new WAVFile();
            MemoryStream ms  = new MemoryStream();

            wav.Open(source, WAVFile.WAVFileMode.READ);

            IMAADPCM.ADPCMState state = new IMAADPCM.ADPCMState();
            byte enc1, enc2;

            for (long i = 0; i < wav.NumSamples / 2; i++)
            {
                enc1 = IMAADPCM.encodeADPCM(wav.GetNextSampleAs16Bit(), ref state);
                enc2 = IMAADPCM.encodeADPCM(wav.GetNextSampleAs16Bit(), ref state);
                ms.Write(BitConverter.GetBytes(Convert.ToInt32(Utils.binaryString(enc2, 4) + Utils.binaryString(enc1, 4), 2)), 0, 1);
            }

            wav.Close();
            return(ms);
        }
Esempio n. 6
0
        public float[] GetVPFromWave(string wavefile)
        {
            string w = Path.GetDirectoryName(wavefile) + @"\n_" + Path.GetFileName(wavefile);

            Normalize(wavefile, w);
            WAVFile wave = new WAVFile();

            wave.Open(w, WAVFile.WAVFileMode.READ);
            float[] samples = new float[wave.NumSamples];
            for (int i = 0; i < wave.NumSamples; i++)
            {
                samples[i] = wave.GetNextSample_16bit();
            }

            int cp = 0;
            int t  = samples.Length / 1024;

            if (t > 0)
            {
                int r = samples.Length % 1024;
                for (int x = 1; x <= t; x++)
                {
                    Exocortex.DSP.ComplexF[] complexData = new Exocortex.DSP.ComplexF[1024];
                    for (int i = cp; i <= 1023; i++)
                    {
                        complexData[i].Re = samples[cp + i];
                        complexData[i].Im = samples[cp + i] + 5;
                    }
                    Exocortex.DSP.Fourier.FFT(complexData, complexData.Length, FourierDirection.Forward);
                    for (int i = 0; i <= 1023; i++)
                    {
                        samples[cp + i] = complexData[i].Re;
                    }

                    cp += 1024;
                }
            }

            wave.Close();
            return(samples);
        }
Esempio n. 7
0
        byte[] GetWavData(string fileName)
        {
            var wav = new WAVFile();

            wav.Open(fileName, WAVFile.WAVFileMode.READ);
            wav.SeekToAudioDataStart();
            byte[] data = new byte[wav.DataSizeBytes];
            byte[] arr;
            int    start = 0;

            do
            {
                arr = wav.GetNextSample_ByteArray();
                arr.CopyTo(data, start);
                start += arr.Length;
            }while (wav.NumSamplesRemaining > 1);

            wav.Close();

            return(data);
        }
Esempio n. 8
0
        public short[] GetSecondaryVPFromWave(string wavefile)
        {
            //  string w = Path.GetDirectoryName(wavefile) + @"\n_" + Path.GetFileName(wavefile);
            // Normalize(wavefile, w);
            WAVFile wave = new WAVFile();

            wave.Open(wavefile, WAVFile.WAVFileMode.READ);
            short[] samples = new short[wave.NumSamples];
            for (int i = 0; i < wave.NumSamples; i++)
            {
                samples[i] = wave.GetNextSample_16bit();
            }

            int cp = 0;
            int t  = samples.Length / 1024;

            //if (t > 0)
            //{
            //    int r = samples.Length % 1024;
            //    for (int x = 1; x <= t; x++)
            //    {
            //        Exocortex.DSP.ComplexF[] complexData = new Exocortex.DSP.ComplexF[1024];
            //        for (int i = cp; i <= 1023; i++)
            //        {
            //            complexData[i].Re = samples[cp + i];
            //            complexData[i].Im = samples[cp + i] + 5;

            //        }
            //        Exocortex.DSP.Fourier.FFT(complexData, complexData.Length, FourierDirection.Forward);
            //        for (int i = 0; i <= 1023; i++)
            //            samples[cp + i] = complexData[i].Re;

            //        cp += 1024;
            //    }

            //}
            wave.Close();

            return(samples);
        }
Esempio n. 9
0
        /// <summary>
        /// loads the samples from WavFilePath to _samplesArray
        /// </summary>
        private void loadSamples()
        {
            //WaitForm waitForm = new WaitForm();
            //ProgressBar pb = new ProgressBar();
            //pb.Minimum = 0;

            //WAVFileMP3 currentWAVFile;
            WAVFile currentWAVFile;

            string[] fileNames = Directory.GetFiles(MyFileMap + "\\" + _wavFilePath);
            currentWAVFile = new WAVFile();
            currentWAVFile.Open(fileNames[0], WAVFile.WAVFileMode.READ);
            //pb.Maximum = fileNames.Length * currentWAVFile.NumSamples;
            int seconds = (currentWAVFile.NumSamples - FirstSample);

            currentWAVFile.Close();
            //pb.Value = 0;
            //pb.Location = new Point(40, 80);

            //waitForm.Show();
            //waitForm.Controls.Add(pb);

            Application.DoEvents();
            for (int i = 0; i < fileNames.Length; i++)
            {
                // Create the WAVFile object and open the current sample WAV file.
                currentWAVFile = new WAVFile();
                currentWAVFile.Open(fileNames[i], WAVFile.WAVFileMode.READ);

                // Get the sample from the file and copy it to our array
                for (int j = 0; j < currentWAVFile.NumSamples; j++)
                {
                    _samplesArray[i, j] = currentWAVFile.GetNextSample_16bit();
                }
                //pb.Value += currentWAVFile.NumSamples;
                currentWAVFile.Close();     // Close the WAV file
            }
            //waitForm.Close();
        }
Esempio n. 10
0
        //methods for creating wav file

        /// <summary>
        /// allocates an array of according to the number of files in WavFilePath
        /// </summary>
        private void allocateArray()
        {
            int cols, rows;

            string[] fileNames = Directory.GetFiles(MyFileMap + "\\" + _wavFilePath);
            rows = fileNames.Length;

            if (rows != _numTotalFiles)
            {
                throw new System.ArgumentException("total number of files must be equal to the number of files in wav folder");
            }

            // Set the number of cols according to the number samples in the first WAV file
            //WAVFileMP3 tempWAVFile = new WAVFileMP3();
            WAVFile tempWAVFile = new WAVFile();

            tempWAVFile.Open(fileNames[0], WAVFile.WAVFileMode.READ);
            cols = tempWAVFile.NumSamples;
            tempWAVFile.Close();

            // Allocate the array
            _samplesArray = new short[rows, cols];
        }
Esempio n. 11
0
    /// <summary>
    /// Returns a WAVFormat struct containing audio format information
    /// (# channels, sample rate, and bits per sample) for a WAV file.
    /// </summary>
    /// <param name="pFilename">The name of the file about which to retrieve format information</param>
    /// <returns>A WAVFormat struct object containing the audio format information for the open file</returns>
    public static WAVFormat GetAudioFormat(String pFilename)
    {
        WAVFormat format = new WAVFormat();

        WAVFile audioFile = new WAVFile();
        if (audioFile.Open(pFilename, WAVFileMode.READ).Length == 0)
        {
            format.BitsPerSample = audioFile.mBitsPerSample;
            format.NumChannels = audioFile.mNumChannels;
            format.SampleRateHz = audioFile.mSampleRateHz;

            audioFile.Close();
        }

        return (format);
    }
Esempio n. 12
0
        public static bool replaceSample(int sampleIndex, string path)
        {
            long offset = IVAUDSingle.WIoffset[sampleIndex] + IVAUDSingle.headerSize;

            byte[] dataBefore = new byte[offset - IVAUDSingle.headerSize];
            byte[] dataAfter  = new byte[IVAUD.file.Length - (offset + IVAUDSingle.WInumSamplesInBytes_computed[sampleIndex])];

            //Get data between header and replaced sample
            IVAUD.file.Seek(IVAUDSingle.headerSize, SeekOrigin.Begin);
            IVAUD.file.Read(dataBefore, 0, dataBefore.Length);

            //Get data between replaced sample and eof
            IVAUD.file.Seek(offset + IVAUDSingle.WInumSamplesInBytes_computed[sampleIndex], SeekOrigin.Begin);
            IVAUD.file.Read(dataAfter, 0, dataAfter.Length);

            //Close file
            IVAUD.close();

            //Open WAV file and encode it
            WAVFile wav = new WAVFile();

            wav.Open(path, WAVFile.WAVFileMode.READ);

            MemoryStream ms = new MemoryStream();

            IMAADPCM.ADPCMState state = new IMAADPCM.ADPCMState();
            //byte enc1, enc2;

            byte[] bytes     = new byte[2];
            int    loopValue = ((wav.DataSizeBytes - 8) / wav.BytesPerSample);

            /*Debug.WriteLine((((wav.DataSizeBytes - 8) / wav.BytesPerSample)) / 2);
             * Debug.WriteLine(wav.NumSamples / 2);
             * Debug.WriteLine((((wav.DataSizeBytes - 8) / wav.BytesPerSample)));
             * Debug.WriteLine(wav.NumSamples);*/

            //for (long i = 0; i < wav.NumSamples / 2; i++) {
            for (long i = 0; i < loopValue / 2; i++)
            {
                bytes[0] = IMAADPCM.encodeADPCM(wav.GetNextSampleAs16Bit(), ref state);
                bytes[1] = IMAADPCM.encodeADPCM(wav.GetNextSampleAs16Bit(), ref state);
                ms.Write(BitConverter.GetBytes(Convert.ToInt32(Utils.binaryString(bytes[1], 4) + Utils.binaryString(bytes[0], 4), 2)), 0, 1);
            }

            long originalOffset = offset + IVAUDSingle.WInumSamplesInBytes_computed[sampleIndex];

            //Change header values
            IVAUDSingle.WInumSamplesInBytes[sampleIndex]          = (int)ms.Length;
            IVAUDSingle.WInumSamplesInBytes_computed[sampleIndex] = Utils.getPaddedSize(IVAUDSingle.WInumSamplesInBytes[sampleIndex]);
            IVAUDSingle.WInumSamples16Bit[sampleIndex]            = (int)(ms.Length * 2);
            IVAUDSingle.WIsamplerate[sampleIndex] = (ushort)wav.SampleRateHz;
            if (IVAUDSingle.WIHsize[sampleIndex] > 32)
            {
                IVAUDSingle.WInumSamples16Bit2[sampleIndex] = (uint)(ms.Length * 2);
            }

            //Change later offsets
            long newOffset    = offset + IVAUDSingle.WInumSamplesInBytes_computed[sampleIndex];
            long offsetChange = newOffset - originalOffset;

            for (int i = 0; i < IVAUDSingle.WIHoffset.Count; i++)
            {
                if ((IVAUDSingle.WIoffset[i] + IVAUDSingle.headerSize) > offset)
                {
                    IVAUDSingle.WIoffset[i] += offsetChange;
                }
            }

            wav.Close();

            //Get WAV data
            byte[] dataWAV = new byte[ms.Length];
            ms.Seek(0, SeekOrigin.Begin);
            ms.Read(dataWAV, 0, (int)ms.Length);
            ms.Close();

            //Write header
            FileStream fs = new FileStream(Environment.GetEnvironmentVariable("TEMP") + "\\IVATB\\Current" + Utils.sessionID + ".tmp", FileMode.Open, FileAccess.ReadWrite);

            fs.Seek(0, SeekOrigin.Begin);
            if (!IVAUDSingle.write(fs))
            {
                return(false);
            }

            //Write before-data
            fs.Seek(IVAUDSingle.headerSize, SeekOrigin.Begin);
            fs.Write(dataBefore, 0, dataBefore.Length);

            //Write sample
            fs.Seek(offset, SeekOrigin.Begin);
            fs.Write(dataWAV, 0, dataWAV.Length);

            //Write after-data
            fs.Seek(offset + IVAUDSingle.WInumSamplesInBytes_computed[sampleIndex], SeekOrigin.Begin);
            fs.Write(dataAfter, 0, dataAfter.Length);

            //Fix file length if needed
            if (offsetChange < 0)
            {
                fs.SetLength(fs.Length + offsetChange);
            }

            fs.Close();

            //Replace the file
            //IVAUD.close();
            //File.Copy(Environment.GetEnvironmentVariable("TEMP") + "\\IVATB\\Replace" + Utils.sessionID + ".tmp", Environment.GetEnvironmentVariable("TEMP") + "\\IVATB\\Current" + Utils.sessionID + ".tmp", true);

            //Reload the file
            IVAUD.load(Environment.GetEnvironmentVariable("TEMP") + "\\IVATB\\Current" + Utils.sessionID + ".tmp");

            return(true);
        }
Esempio n. 13
0
        /// <summary>
        /// Export for use as a wavetable array in c
        /// </summary>
        /// <param name="filename">The completely pathed filename of the file to read</param>
        public static String TableFromWav(string filename)
        {
            ArrayList samples = new ArrayList();

            String ret  = "int [] table = {";
            String suff = "};";

            WAVFile file = new WAVFile();

            String retval = file.Open(filename, WAVFile.WAVFileMode.READ);

            if (retval != "")
            {
                throw new WAVFileException(retval, "WAVFile.Convert_Copy()");
            }

            double dur = (double)file.NumSamples / file.SampleRateHz;

            if (dur > 0.5)
            {
                MessageBox.Show("Wav File too long, please use .wavs less than 1 second long.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return("ERROR");
            }

            int  lastZero   = -1;
            bool hasNonZero = false;
            bool runOfZeros = false;

            while (file.NumSamplesRemaining > 0)
            {
                short sample = file.GetNextSampleAs8Bit();
                if (sample != 0)
                {
                    hasNonZero = true;
                    runOfZeros = false;
                }
                else if (sample == 0 && !runOfZeros)
                {
                    lastZero   = ret.Length;
                    runOfZeros = true;
                }

                if (hasNonZero)
                {
                    ret += sample.ToString();
                    ret += ",";
                }
            }

            file.Close();

            //Remove trailing zeros
            ret = ret.Remove(lastZero, ret.Length - lastZero);
            //Remove trailing comma
            if (ret != null)
            {
                ret = ret.TrimEnd(',');
            }

            return(ret += suff);
        }
Esempio n. 14
0
    /// <summary>
    /// Adjusts the volume level of a WAV file, saving the adjusted file as a separate file.
    /// </summary>
    /// <param name="pSrcFilename">The name of the WAV file to adjust</param>
    /// <param name="pDestFilename">The name to use for the volume-adjusted WAV file</param>
    /// <param name="pMultiplier">The value by which to multiply the audio samples</param>
    public static void AdjustVolume_Copy(String pSrcFilename, String pDestFilename, double pMultiplier)
    {
        // If an empty source or destination file were passed in, then throw an exception.
        if (pSrcFilename.Length == 0)
            throw new WAVFileReadException("Blank filename specified.", "WAVFile.AdjustVolume_Copy()");
        if (pDestFilename.Length == 0)
            throw new WAVFileWriteException("Blank filename specified.", "WAVFile.AdjustVolume_Copy()");

        // Open the srouce file
        WAVFile srcFile = new WAVFile();
        String retval = srcFile.Open(pSrcFilename, WAVFileMode.READ);
        if (retval.Length == 0)
        {
            // Check to make sure the input file has a supported number of bits/sample and sample rate.  If
            // not, then throw an exception.
            if (!SupportedBitsPerSample(srcFile.BitsPerSample))
            {
                WAVFileBitsPerSampleException ex = new WAVFileBitsPerSampleException(pSrcFilename +
                                                          " has unsupported bits/sample ("
                                                          + srcFile.BitsPerSample.ToString() + ")",
                                                          "WAVFile.AdjustVolume_Copy()", srcFile.BitsPerSample);
                srcFile.Close();
                throw ex;
            }

            // Open the destination file and start copying the adjusted audio data to it.
            WAVFile destFile = new WAVFile();
            destFile.Create(pDestFilename, srcFile.IsStereo, srcFile.SampleRateHz, srcFile.BitsPerSample);
            if (srcFile.BitsPerSample == 8)
            {
                byte sample = 0;
                for (int i = 0; i < srcFile.NumSamples; ++i)
                {
                    // Note: Only multiply the sample if pMultiplier is not 1.0 (if the multiplier is
                    // 1.0, then it would be good to avoid any binary roundoff error).
                    sample = srcFile.GetNextSample_8bit();
                    if (pMultiplier != 1.0)
                        sample = (byte)((double)sample * pMultiplier);
                    destFile.AddSample_8bit(sample);
                }
            }
            else if (srcFile.BitsPerSample == 16)
            {
                short sample = 0;
                for (int i = 0; i < srcFile.NumSamples; ++i)
                {
                    // Note: Only multiply the sample if pMultiplier is not 1.0 (if the multiplier is
                    // 1.0, then it would be good to avoid any binary roundoff error).
                    sample = srcFile.GetNextSample_16bit();
                    if (pMultiplier != 1.0)
                        sample = (short)((double)sample * pMultiplier);
                    destFile.AddSample_16bit(sample);
                }
            }

            srcFile.Close();
            destFile.Close();
        }
        else
            throw new WAVFileReadException(retval, "WAVFile.AdjustVolume_Copy()");
    }
Esempio n. 15
0
    /// <summary>
    /// Changes the volume of a WAV file.
    /// </summary>
    /// <param name="pFilename">The name of the WAV file to adjust</param>
    /// <param name="pMultiplier">The volume multiplier</param>
    public static void AdjustVolumeInPlace(String pFilename, double pMultiplier)
    {
        // If pMultiplier is 1, then we don't need to do anything.
        if (pMultiplier == 1.0)
            return;

        // Open the file
        WAVFile audioFile = new WAVFile();
        String retval = audioFile.Open(pFilename, WAVFileMode.READ_WRITE);
        if (retval.Length == 0)
        {
            // Check to make sure the input file has a supported number of bits/sample and sample rate.  If
            // not, then throw an exception.
            if (!SupportedBitsPerSample(audioFile.BitsPerSample))
            {
                short bitsPerSample = audioFile.BitsPerSample;
                audioFile.Close();
                throw new WAVFileBitsPerSampleException(pFilename + " has unsupported bits/sample ("
                                                        + bitsPerSample.ToString() + ")",
                                                        "WAVFile.AdjustVolumeInPlace()", bitsPerSample);
            }
            if (!SupportedSampleRate(audioFile.SampleRateHz))
            {
                int sampleRate = audioFile.SampleRateHz;
                audioFile.Close();
                throw new WAVFileSampleRateException(pFilename + " has unsupported sample rate ("
                                                     + sampleRate.ToString() + ")",
                                                     "WAVFile.AdjustVolumeInPlace()", sampleRate);
            }

            // Adjust the file volume
            if (audioFile.BitsPerSample == 8)
            {
                byte sample = 0;
                for (int sampleNum = 0; sampleNum < audioFile.NumSamples; ++sampleNum)
                {
                    sample = (byte)((double)audioFile.GetNextSample_8bit() * pMultiplier);
                    audioFile.SeekToAudioSample(sampleNum);
                    audioFile.AddSample_8bit(sample);
                }
            }
            else if (audioFile.BitsPerSample == 16)
            {
                short sample = 0;
                for (int sampleNum = 0; sampleNum < audioFile.NumSamples; ++sampleNum)
                {
                    sample = (short)((double)audioFile.GetNextSample_16bit() * pMultiplier);
                    audioFile.SeekToAudioSample(sampleNum);
                    audioFile.AddSample_16bit(sample);
                }
            }

            audioFile.Close();
        }
        else
            throw new WAVFileReadException(retval, "WAVFile.AdjustVolumeInPlace()");
    }
Esempio n. 16
0
    /// <summary>
    /// Returns the highest sample value in a WAV file, as a 16-bit value, regardless of
    /// whether the file contains 8-bit or 16-bit audio.  If the sample is coming from
    /// an 8-bit audio file, the sample will be scaled up from 8-bit to 16-bit.
    /// </summary>
    /// <param name="pFilename">The audio file name</param>
    /// <returns>The highest sample value from the file, as a 16-bit value</returns>
    public static short HighestSampleValueAs16Bit(String pFilename)
    {
        short highestSample = 0;

        try
        {
            WAVFile audioFile = new WAVFile();
            if (audioFile.Open(pFilename, WAVFileMode.READ).Length == 0)
            {
                if (audioFile.BitsPerSample == 8)
                {
                    short sample = 0;
                    for (int i = 0; i < audioFile.NumSamples; ++i)
                    {
                        sample = ScaleByteToShort(audioFile.GetNextSample_8bit());
                        if (sample > highestSample)
                            highestSample = sample;
                    }
                }
                else if (audioFile.BitsPerSample == 16)
                {
                    short sample = 0;
                    for (int i = 0; i < audioFile.NumSamples; ++i)
                    {
                        sample = audioFile.GetNextSample_16bit();
                        if (sample > highestSample)
                            highestSample = sample;
                    }
                }

                audioFile.Close();
            }
        }
        catch
        {
            // log exception
        }

        return highestSample;
    }
Esempio n. 17
0
    /// <summary>
    /// Returns the highest sample value in a WAV audio file.
    /// The return value is a byte array and will contain one
    /// byte if the file contains 8-bit audio or 2 bytes if the file
    /// contains  16-bit audio.  The return value will be null if
    /// the file cannot be opened.  If it is known that the audio
    /// file contains 16-bit samples, the byte array can be converted
    /// to a 16-bit integer using BitConverter.ToInt16().
    /// </summary>
    /// <param name="pFilename">The name of the WAV file</param>
    /// <param name="pBitsPerSample">This will contain the number of bits per sample, or 0 if the file wasn't loaded.</param>
    /// <returns>A byte array containing the highest audio sample, or null if the file wasn't loaded.</returns>
    public static byte[] HighestSampleValue(String pFilename, out short pBitsPerSample)
    {
        pBitsPerSample = 0;
        byte[] highestSampleValue = null;

        WAVFile audioFile = new WAVFile();
        try
        {
            if (audioFile.Open(pFilename, WAVFileMode.READ).Length == 0)
            {
                pBitsPerSample = audioFile.mBitsPerSample;

                if (audioFile.mBitsPerSample == 8)
                {
                    byte sample = 0;
                    byte highestSample = 0;
                    for (int i = 0; i < audioFile.NumSamples; ++i)
                    {
                        sample = audioFile.GetNextSample_8bit();
                        if (sample > highestSample)
                            highestSample = sample;
                    }

                    highestSampleValue = new byte[1];
                    highestSampleValue[0] = highestSample;
                }
                else if (audioFile.mBitsPerSample == 16)
                {
                    short sample = 0;
                    short highestSample = 0;
                    for (int i = 0; i < audioFile.NumSamples; ++i)
                    {
                        sample = audioFile.GetNextSample_16bit();
                        if (sample > highestSample)
                            highestSample = sample;
                    }

                    highestSampleValue = BitConverter.GetBytes(highestSample);
                    if (!BitConverter.IsLittleEndian)
                        Array.Reverse(highestSampleValue);
                }

                audioFile.Close();
            }
        }
        catch
        {
            // log exception
        }

        return (highestSampleValue);
    }
Esempio n. 18
0
    /// <summary>
    /// For 8-bit WAV files: Adjusts the volume level and converts it to a 16-bit audio file.
    /// The converted data is saved to a separate file.
    /// </summary>
    /// <param name="pSrcFilename">The name of the WAV file to convert</param>
    /// <param name="pDestFilename">The name to use for the converted WAV file</param>
    /// <param name="pMultiplier">The volume multiplier</param>
    public static void AdjustVolume_Copy_8BitTo16Bit(String pSrcFilename, String pDestFilename, double pMultiplier)
    {
        // If an empty source or destination file were passed in, then throw an exception.
        if (pSrcFilename.Length == 0)
            throw new WAVFileReadException("Blank filename specified.", "WAVFile.AdjustVolume_Copy_8BitTo16Bit()");
        if (pDestFilename.Length == 0)
            throw new WAVFileWriteException("Blank filename specified.", "WAVFile.AdjustVolume_Copy_8BitTo16Bit()");

        // Open the srouce file
        WAVFile srcFile = new WAVFile();
        String retval = srcFile.Open(pSrcFilename, WAVFileMode.READ);
        if (retval.Length == 0)
        {
            // Check to make sure the input file has 8 bits per sample.  If not, then throw an exception.
            if (srcFile.BitsPerSample != 8)
            {
                WAVFileBitsPerSampleException ex = new WAVFileBitsPerSampleException(pSrcFilename +
                                                          ": 8 bits per sample required, and the file has " +
                                                          srcFile.BitsPerSample.ToString() + " bits per sample.",
                                                          "WAVFile.AdjustVolume_Copy_8BitTo16Bit()",
                                                          srcFile.BitsPerSample);
                srcFile.Close();
                throw ex;
            }

            // Open the destination file
            WAVFile destFile = new WAVFile();
            destFile.Create(pDestFilename, srcFile.IsStereo, srcFile.SampleRateHz, 16, true);

            // Copy the data
            short sample_16bit = 0;
            while (srcFile.NumSamplesRemaining > 0)
            {
                // Scale the sample from 8-bit to 16 bits
                sample_16bit = ScaleByteToShort(srcFile.GetNextSample_8bit());

                // Now, apply pMultiplier if it is not 1.0
                if (pMultiplier != 1.0)
                    sample_16bit = (short)((double)sample_16bit * pMultiplier);

                // Save the sample to the destination file
                destFile.AddSample_16bit(sample_16bit);
            }

            srcFile.Close();
            destFile.Close();
        }
        else
            throw new WAVFileReadException(retval, "WAVFile.AdjustVolume_Copy_8BitTo16Bit()");
    }
Esempio n. 19
0
        private void frmReplace_Load(object sender, EventArgs e)
        {
            labelSampleSize.Text          = (sampleSize / 1024).ToString() + " KB";
            labelSampleDuration.Text      = Utils.getDurationString(sampleSamples16Bit, sampleSampleRate);
            labelSampleSampleRate.Text    = sampleSampleRate.ToString() + " Hz";
            labelSampleBitsPerSecond.Text = sampleBitsPerSecond.ToString();
            labelSampleChannels.Text      = sampleChannels.ToString();

            WAVFile wav = new WAVFile();

            wav.Open(WAVPath, WAVFile.WAVFileMode.READ);
            labelFileSize.Text          = (wav.DataSizeBytes / 1024).ToString() + " KB";
            labelFileDuration.Text      = Utils.getDurationString(wav.NumSamples, wav.SampleRateHz);
            labelFileSampleRate.Text    = wav.SampleRateHz.ToString() + " Hz";
            labelFileBitsPerSecond.Text = wav.BitsPerSample.ToString();
            labelFileChannels.Text      = wav.NumChannels.ToString();
            labelFileCodecID.Text       = wav.EncodingType.ToString();
            wav.Close();

            if (labelFileCodecID.Text != "1")
            {
                labelAdvice.Text           = "ERROR! The file you've chosen is not Uncompressed PCM encoded and thus cannot be used as replacement.";
                labelFileCodecID.ForeColor = Color.DarkRed;
                buttonReplace.Enabled      = false;
                return;
            }
            else
            {
                labelFileCodecID.ForeColor = Color.Green;
            }

            if (labelFileBitsPerSecond.Text != "16")
            {
                labelAdvice.Text = "ERROR! The file you've chosen does not have 16 bits per second and thus cannot be used as replacement.";
                labelFileBitsPerSecond.ForeColor   = Color.DarkRed;
                labelSampleBitsPerSecond.ForeColor = Color.DarkRed;
                buttonReplace.Enabled = false;
                return;
            }
            else
            {
                labelSampleBitsPerSecond.ForeColor = Color.Green; labelFileBitsPerSecond.ForeColor = Color.Green;
            }

            if (labelFileChannels.Text != labelSampleChannels.Text)
            {
                labelAdvice.Text              = "ERROR! The file you've chosen does not have the same amount of channels as the original sample and thus cannot be used as replacement.";
                labelFileChannels.ForeColor   = Color.DarkRed;
                labelSampleChannels.ForeColor = Color.DarkRed;
                buttonReplace.Enabled         = false;
                return;
            }
            else
            {
                labelSampleChannels.ForeColor = Color.Green; labelFileChannels.ForeColor = Color.Green;
            }

            if (labelFileDuration.Text != labelSampleDuration.Text)
            {
                labelFileDuration.ForeColor   = Color.DarkGoldenrod;
                labelSampleDuration.ForeColor = Color.DarkGoldenrod;
                labelAdvice.ForeColor         = Color.DarkGoldenrod;
                labelAdvice.Text = "WARNING! The file you've chosen does not have the same duration as the original sample. It is recommended to use a file with somewhat the same duration.";
            }
            else
            {
                labelSampleDuration.ForeColor = Color.Green; labelFileDuration.ForeColor = Color.Green;
            }

            if (labelFileSampleRate.Text != labelSampleSampleRate.Text)
            {
                labelFileSampleRate.ForeColor   = Color.DarkGoldenrod;
                labelSampleSampleRate.ForeColor = Color.DarkGoldenrod;
                labelAdvice.ForeColor           = Color.DarkGoldenrod;
                labelAdvice.Text = "WARNING! The file you've chosen does not have the same sample rate as the original sample. It is highly recommended to use a file with the same sample rate.";
            }
            else
            {
                labelSampleSampleRate.ForeColor = Color.Green; labelFileSampleRate.ForeColor = Color.Green;
            }

            labelSampleSize.ForeColor = Color.Green;
            labelFileSize.ForeColor   = Color.Green;
            buttonReplace.Enabled     = true;

            if (labelAdvice.Text != "Please wait...")
            {
                return;
            }
            labelAdvice.ForeColor = Color.Green;
            labelAdvice.Text      = "This file looks okay as replacement. Click Replace to replace the original sample with it.";
        }
Esempio n. 20
0
    /// <summary>
    /// Converts a WAV file's bits/sample and number of channels to a separate WAV file.
    /// </summary>
    /// <param name="pSrcFilename">The name of the file to convert</param>
    /// <param name="pDestFilename">The destination file name</param>
    /// <param name="pBitsPerSample">The destination's number of bits/sample</param>
    /// <param name="pStereo">Whether or not the destination should be stereo</param>
    /// <param name="pVolumeMultiplier">A multiplier that can be used to adjust the volume of the output audio file</param>
    public static void CopyAndConvert(String pSrcFilename, String pDestFilename, short pBitsPerSample, bool pStereo, double pVolumeMultiplier)
    {
        WAVFile srcFile = new WAVFile();
        String retval = srcFile.Open(pSrcFilename, WAVFileMode.READ);
        if (retval.Length > 0)
            throw new WAVFileException(retval, "WAVFile.Convert_Copy()");

        WAVFile destFile = new WAVFile();
        destFile.Create(pDestFilename, pStereo, srcFile.SampleRateHz, pBitsPerSample);
        if ((srcFile.BitsPerSample == 8) && (pBitsPerSample == 8))
        {
            byte sample = 0;
            if (srcFile.IsStereo && !pStereo)
            {
                // 8-bit to 8-bit, stereo to mono: Average each 2 samples
                while (srcFile.NumSamplesRemaining > 0)
                {
                    sample = (byte)((short)((short)srcFile.GetNextSample_8bit() + (short)srcFile.GetNextSample_8bit()) / 2);
                    if (pVolumeMultiplier != 1.0)
                        sample = (byte)((double)sample * pVolumeMultiplier);
                    destFile.AddSample_8bit(sample);
                }
            }
            else if ((srcFile.IsStereo && pStereo) || (!srcFile.IsStereo && !pStereo))
            {
                // 8-bit to 8-bit, stereo to stereo or mono to mono
                while (srcFile.NumSamplesRemaining > 0)
                {
                    sample = srcFile.GetNextSample_8bit();
                    if (pVolumeMultiplier != 1.0)
                        sample = (byte)((double)sample * pVolumeMultiplier);
                    destFile.AddSample_8bit(sample);
                }
            }
            else if (!srcFile.IsStereo && pStereo)
            {
                // 8-bit to 8-bit, mono to stereo: Write each sample twice
                while (srcFile.NumSamplesRemaining > 0)
                {
                    sample = srcFile.GetNextSample_8bit();
                    if (pVolumeMultiplier != 1.0)
                        sample = (byte)((double)sample * pVolumeMultiplier);
                    destFile.AddSample_8bit(sample);
                    destFile.AddSample_8bit(sample);
                }
            }
        }
        else if ((srcFile.BitsPerSample == 8) && (pBitsPerSample == 16))
        {
            short sample = 0;
            if (srcFile.IsStereo && !pStereo)
            {
                // 8-bit to 16 bit, stereo to mono: Average each 2 samples
                while (srcFile.NumSamplesRemaining > 0)
                {
                    sample = (short)((int)((int)srcFile.GetNextSampleAs16Bit() + (int)srcFile.GetNextSampleAs16Bit()) / 2);
                    if (pVolumeMultiplier != 1.0)
                        sample = (short)((double)sample * pVolumeMultiplier);
                    destFile.AddSample_16bit(sample);
                }
            }
            else if ((srcFile.IsStereo && pStereo) || (!srcFile.IsStereo && !pStereo))
            {
                // 8-bit to 16 bit, stereo to stereo or mono to mono
                while (srcFile.NumSamplesRemaining > 0)
                {
                    sample = srcFile.GetNextSampleAs16Bit();
                    if (pVolumeMultiplier != 1.0)
                        sample = (short)((double)sample * pVolumeMultiplier);
                    destFile.AddSample_16bit(sample);
                }
            }
            else if (!srcFile.IsStereo && pStereo)
            {
                // 8-bit to 16 bit, mono to stereo: Write each sample twice
                while (srcFile.NumSamplesRemaining > 0)
                {
                    sample = srcFile.GetNextSampleAs16Bit();
                    if (pVolumeMultiplier != 1.0)
                        sample = (short)((double)sample * pVolumeMultiplier);
                    destFile.AddSample_16bit(sample);
                    destFile.AddSample_16bit(sample);
                }
            }
        }
        else if ((srcFile.BitsPerSample == 16) && (pBitsPerSample == 8))
        {
            byte sample = 0;
            if (srcFile.IsStereo && !pStereo)
            {
                // 16-bit to 8-bit, stereo to mono: Average each 2 samples
                short sample_16bit = 0;
                while (srcFile.NumSamplesRemaining > 0)
                {
                    sample_16bit = (short)((int)srcFile.GetNextSample_16bit() + (int)srcFile.GetNextSample_16bit() / 2);
                    if (pVolumeMultiplier != 1.0)
                        sample_16bit = (short)((double)sample_16bit * pVolumeMultiplier);
                    sample = ScaleShortToByte(sample_16bit);
                    destFile.AddSample_8bit(sample);
                }
            }
            else if ((srcFile.IsStereo && pStereo) || (!srcFile.IsStereo && !pStereo))
            {
                // 16-bit to 8-bit, stereo to stereo or mono to mono
                while (srcFile.NumSamplesRemaining > 0)
                {
                    sample = ScaleShortToByte(srcFile.GetNextSample_16bit());
                    if (pVolumeMultiplier != 1.0)
                        sample = (byte)((double)sample * pVolumeMultiplier);
                    destFile.AddSample_8bit(sample);
                }
            }
            else if (!srcFile.IsStereo && pStereo)
            {
                // 16-bit to 8-bit, mono to stereo: Write each sample twice
                while (srcFile.NumSamplesRemaining > 0)
                {
                    sample = ScaleShortToByte(srcFile.GetNextSample_16bit());
                    if (pVolumeMultiplier != 1.0)
                        sample = (byte)((double)sample * pVolumeMultiplier);
                    destFile.AddSample_8bit(sample);
                    destFile.AddSample_8bit(sample);
                }
            }
        }
        else if ((srcFile.BitsPerSample == 16) && (pBitsPerSample == 16))
        {
            short sample = 0;
            if (srcFile.IsStereo && !pStereo)
            {
                // 16-bit to 16-bit, stereo to mono: Average each 2 samples
                while (srcFile.NumSamplesRemaining > 0)
                {
                    sample = (short)((int)((int)srcFile.GetNextSample_16bit() + (int)srcFile.GetNextSample_16bit()) / 2);
                    if (pVolumeMultiplier != 1.0)
                        sample = (short)((double)sample * pVolumeMultiplier);
                    destFile.AddSample_16bit(sample);
                }
            }
            else if ((srcFile.IsStereo && pStereo) || (!srcFile.IsStereo && !pStereo))
            {
                // 16-bit to 16-bit, stereo to stereo or mono to mono
                while (srcFile.NumSamplesRemaining > 0)
                {
                    sample = srcFile.GetNextSample_16bit();
                    if (pVolumeMultiplier != 1.0)
                        sample = (short)((double)sample * pVolumeMultiplier);
                    destFile.AddSample_16bit(sample);
                }
            }
            else if (!srcFile.IsStereo && pStereo)
            {
                // 16-bit to 16-bit, mono to stereo: Write each sample twice
                while (srcFile.NumSamplesRemaining > 0)
                {
                    sample = srcFile.GetNextSample_16bit();
                    if (pVolumeMultiplier != 1.0)
                        sample = (short)((double)sample * pVolumeMultiplier);
                    destFile.AddSample_16bit(sample);
                    destFile.AddSample_16bit(sample);
                }
            }
        }

        destFile.Close();
        srcFile.Close();
    }
Esempio n. 21
0
    /// <summary>
    /// Returns the highest number of bits per sample in a set of audio files.
    /// </summary>
    /// <param name="pFilenames">An array containing the audio file names</param>
    /// <returns>The highest number of bits per sample in the set of audio files</returns>
    public static short HighestBitsPerSample(String[] pFilenames)
    {
        short bitsPerSample = 0;

        if (pFilenames != null)
        {
            WAVFile audioFile = new WAVFile();
            String retval = "";
            foreach (String filename in pFilenames)
            {
                try
                {
                    retval = audioFile.Open(filename, WAVFileMode.READ);
                    if (retval.Length == 0)
                    {
                        if (audioFile.BitsPerSample > bitsPerSample)
                            bitsPerSample = audioFile.BitsPerSample;
                        audioFile.Close();
                    }
                }
                catch
                {
                    // log exception
                }
            }
        }

        return bitsPerSample;
    }
Esempio n. 22
0
    /// <summary>
    /// Returns the highest number of channels in a set of audio files.
    /// </summary>
    /// <param name="pFilenames">An array containing the audio file names</param>
    /// <returns>The highest number of channels in the set of audio files</returns>
    public static byte HighestNumChannels(String[] pFilenames)
    {
        byte numChannels = 0;

        if (pFilenames != null)
        {
            WAVFile audioFile = new WAVFile();
            String retval = "";
            foreach (String filename in pFilenames)
            {
                try
                {
                    retval = audioFile.Open(filename, WAVFileMode.READ);
                    if (retval.Length == 0)
                    {
                        if (audioFile.NumChannels > numChannels)
                            numChannels = audioFile.NumChannels;
                        audioFile.Close();
                    }
                }
                catch
                {
                    // log exception
                }
            }
        }

        return numChannels;
    }
Esempio n. 23
0
 //Temporary function
 private void barButtonItem37_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
 {
     WAVFile wavFile = new WAVFile();
     wavFile.Open(@"C:\Users\faris\Documents\Sigsence DeskApp V.1.0\Projects\sigsenceProject\Audio\Record_13-10-2012_18-19-46.wav", WAVFile.WAVFileMode.READ);
     //wavFile.Open(@"C:\Users\faris\Documents\Sigsence DeskApp V.1.0\Projects\sigsenceProject\Audio\doh.wav", WAVFile.WAVFileMode.READ);
 }
Esempio n. 24
0
        static void Main(string[] args)
        {
            //Debug test
            //args = (@"E:\Mijn documenten\Visual Studio 2010\ADPCMEncoder\~24000HZTEST.wav|test").Split(Convert.ToChar("|"));
            //args = (@"E:\Mijn documenten\Visual Studio 2010\ADPCMEncoder\TestFiles\LoadingSNOW.wav|test").Split(Convert.ToChar("|"));

            //Print header
            Console.WriteLine("=================");
            Console.WriteLine("IMA ADPCM Encoder");
            Console.WriteLine(" by Flitskikker");
            Console.WriteLine("=================");
            Console.WriteLine("");

            //Check args
            if (args.Length == 0)
            {
                //No args
                Console.WriteLine("ERROR: No command line arguments passed. Press any key to exit...");
                Console.ReadLine();
                Environment.Exit(1);
            }

            //Check file
            if (!File.Exists(args[0]))
            {
                //File not found
                Console.WriteLine("ERROR: File \"" + args[0] + "\" not found. Press any key to exit...");
                Console.ReadLine();
                Environment.Exit(2);
            }

            //Print file
            Console.WriteLine("File: " + args[0]);
            Console.WriteLine("");

            //Load file
            WAVFile wav = new WAVFile();

            wav.Open(args[0], WAVFile.WAVFileMode.READ);

            //Show WAV info
            Console.WriteLine("WAV Info:");
            Console.WriteLine("\tBits per sample:\t" + wav.BitsPerSample.ToString() + " bits");
            Console.WriteLine("\tBytes per sample:\t" + wav.BytesPerSample.ToString());
            Console.WriteLine("\tBytes per second:\t" + wav.BytesPerSec.ToString());
            Console.WriteLine("\tData size:\t\t" + wav.DataSizeBytes.ToString() + " bytes");
            Console.WriteLine("\tDuration:\t\t" + Math.Round(Convert.ToDecimal((double)wav.NumSamples / (double)wav.SampleRateHz), 2).ToString() + " seconds (" + Utils.getDurationString(wav.NumSamples, wav.SampleRateHz) + ")");
            Console.WriteLine("\tEncoding type:\t\t" + wav.EncodingType.ToString());
            Console.WriteLine("\tFile size:\t\t" + wav.FileSizeBytes.ToString() + " bytes");
            Console.WriteLine("\t# of channels:\t\t" + wav.NumChannels.ToString());
            Console.WriteLine("\t# of samples:\t\t" + wav.NumSamples.ToString());
            Console.WriteLine("\tRIFF type:\t\t" + wav.RIFFTypeString);
            Console.WriteLine("\tSample Rate:\t\t" + wav.SampleRateHz.ToString() + " Hz");
            Console.WriteLine("\tWAV header:\t\t" + wav.WAVHeaderString);
            Console.WriteLine("");

            //Check bits
            if (wav.BitsPerSample != 16)
            {
                //Not 16 bits
                Console.WriteLine("ERROR: WAV should have 16 bits per sample. Press any key to exit...");
                Console.ReadLine();
                Environment.Exit(1);
            }

            //Check bytes per sample
            if (wav.BytesPerSample / wav.NumChannels != 2)
            {
                //Not 2 bytes
                Console.WriteLine("ERROR: WAV should have (wav.NumChannels * 2) bytes per sample. Press any key to exit...");
                Console.ReadLine();
                Environment.Exit(1);
            }

            //Print message
            Console.WriteLine("Ready to go! Press any key when ready...");

            //Wait for input
            Console.ReadLine();

            if (wav.NumChannels > 1)
            {
                //Split channels
                Console.WriteLine("");
                Console.WriteLine("Saving separate channels...");
                Console.WriteLine("");

                List <WAVFile> wavs = new List <WAVFile>();

                for (int c = 0; c < wav.NumChannels; c++)
                {
                    wavs.Add(new WAVFile());
                    wavs[c].Create(Path.GetDirectoryName(args[0]) + "\\" + Path.GetFileNameWithoutExtension(args[0]) + "_" + (c + 1).ToString() + ".wav", false, wav.SampleRateHz, wav.BitsPerSample, true);
                }

                int numSamplesCorrected = ((wav.DataSizeBytes - 8) / wav.BytesPerSample);

                //for (long i = 0; i < wav.NumSamples / wav.NumChannels; i++) {
                for (long i = 0; i < numSamplesCorrected; i++)
                {
                    for (int c = 0; c < wav.NumChannels; c++)
                    {
                        wavs[c].AddSample_16bit(wav.GetNextSampleAs16Bit());
                    }
                }

                for (int c = 0; c < wav.NumChannels; c++)
                {
                    wavs[c].Close();
                }
            }

            //Encode
            Console.WriteLine("");
            Console.WriteLine("Encoding file(s)...");
            Console.WriteLine("");

            IMAADPCM.ADPCMState state = new IMAADPCM.ADPCMState();
            WAVFile             cwav  = new WAVFile();
            int nc = wav.NumChannels;

            for (int c = 0; c < wav.NumChannels; c++)
            {
                Console.WriteLine("Encoding file: " + Path.GetDirectoryName(args[0]) + "\\" + Path.GetFileNameWithoutExtension(args[0]) + "_" + (c + 1).ToString() + ".bin");

                MemoryStream ms = new MemoryStream();
                cwav = new WAVFile();

                // Open splitted WAV
                if (wav.NumChannels > 1)
                {
                    cwav.Open(Path.GetDirectoryName(args[0]) + "\\" + Path.GetFileNameWithoutExtension(args[0]) + "_" + (c + 1).ToString() + ".wav", WAVFile.WAVFileMode.READ_WRITE);
                }
                else
                {
                    cwav = wav;
                    //wav.Close();
                    //cwav.Open(args[0], WAVFile.WAVFileMode.READ_WRITE);
                }

                byte[] bytes     = new byte[2];
                int    loopValue = ((cwav.DataSizeBytes - 8) / cwav.BytesPerSample);

                //Actual encode
                for (long i = 0; i < loopValue / 2; i++)
                {
                    bytes[0] = IMAADPCM.encodeADPCM(cwav.GetNextSampleAs16Bit(), ref state);
                    bytes[1] = IMAADPCM.encodeADPCM(cwav.GetNextSampleAs16Bit(), ref state);
                    ms.Write(BitConverter.GetBytes(Convert.ToInt32(Utils.binaryString(bytes[1], 4) + Utils.binaryString(bytes[0], 4), 2)), 0, 1);
                }

                //Get WAV data
                byte[] dataWAV = new byte[ms.Length];
                ms.Seek(0, SeekOrigin.Begin);
                ms.Read(dataWAV, 0, (int)ms.Length);
                ms.Close();

                //Create file
                FileStream fs = new FileStream(Path.GetDirectoryName(args[0]) + "\\" + Path.GetFileNameWithoutExtension(args[0]) + "_" + (c + 1).ToString() + ".bin", FileMode.Create, FileAccess.ReadWrite);

                //Write sample
                fs.Seek(0, SeekOrigin.Begin);
                fs.Write(dataWAV, 0, dataWAV.Length);

                //Close
                cwav.Close();
                ms.Close();
                fs.Close();

                if (nc == 1)
                {
                    break;
                }
            }

            //Close WAV file
            wav.Close();

            //Print message
            Console.WriteLine("");
            Console.WriteLine("Done! Press any key to exit...");

            //Wait for input
            Console.ReadLine();

            //Exit
            Environment.Exit(0);
        }