Exemplo 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);
        }
Exemplo n.º 2
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);
        }
Exemplo n.º 3
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();
    }
Exemplo n.º 4
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);
        }
Exemplo n.º 5
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);
        }