Beispiel #1
0
        //Convert to strm.
        public strm toStrm(bool encode = true)
        {
            strm s = new strm();

            s.head             = new strm.headBlock();
            s.data             = new strm.dataBlock();
            s.head.loop        = 0;
            s.head.nLoopOffset = 0;
            s.head.numChannel  = (byte)fmt.numChannels;
            s.head.nSampleRate = (UInt16)fmt.sampleRate;
            s.head.waveType    = 0;

            if (fmt.bitsPerSample == 8)
            {
                loadPCMChannels();

                //Cut off extra data.
                if (loop && smpl.loopEnd != 0)
                {
                    for (int i = 0; i < fmt.numChannels; i++)
                    {
                        List <byte> newSamples = data.pcm8[i].ToList();
                        while (newSamples.Count() > smpl.loopEnd)
                        {
                            newSamples.RemoveAt(newSamples.Count() - 1);
                        }
                        data.pcm8[i] = newSamples.ToArray();
                    }
                }


                s.data.pcm8 = new byte[fmt.numChannels][];
                for (int i = 0; i < fmt.numChannels; i++)
                {
                    s.data.pcm8[i] = new byte[data.pcm8[i].Length];
                    for (int j = 0; j < s.data.pcm8[i].Length; j++)
                    {
                        s.data.pcm8[i][j] = (byte)(data.pcm8[i][j] - 0x80);
                    }
                }
            }
            else if (fmt.bitsPerSample == 16)
            {
                loadPCMChannels();

                //Cut off extra data.
                if (loop && smpl.loopEnd != 0)
                {
                    for (int i = 0; i < fmt.numChannels; i++)
                    {
                        List <short> newSamples = data.pcm16[i].ToList();
                        while (newSamples.Count() > smpl.loopEnd)
                        {
                            newSamples.RemoveAt(newSamples.Count() - 1);
                        }
                        data.pcm16[i] = newSamples.ToArray();
                    }
                }

                if (encode)
                {
                    s.head.waveType = 2;

                    //Divide to blocks.
                    List <short>[][] samples = new List <short> [(int)fmt.numChannels][];
                    for (int i = 0; i < fmt.numChannels; i++)
                    {
                        int numBlocks = (int)Math.Ceiling((decimal)data.pcm16[i].Length / (decimal)0x3F8);
                        samples[i] = new List <short> [numBlocks];
                        int blockCount = 0;
                        samples[i][0] = new List <short>();
                        for (int j = 0; j < data.pcm16[i].Length; j++)
                        {
                            if (j % 0x3F8 == 0 && j != 0)
                            {
                                blockCount            += 1;
                                samples[i][blockCount] = new List <short>();
                            }
                            samples[i][blockCount].Add(data.pcm16[i][j]);
                        }
                    }


                    //IMA.
                    s.data.imaAdpcm = new strm.dataBlock.imaAdpcmBlock[fmt.numChannels][];
                    for (int i = 0; i < fmt.numChannels; i++)
                    {
                        s.data.imaAdpcm[i] = new strm.dataBlock.imaAdpcmBlock[samples[i].Length];
                    }

                    //Convert blocks.
                    for (int i = 0; i < fmt.numChannels; i++)
                    {
                        for (int j = 0; j < samples[i].Length; j++)
                        {
                            IMAADPCMEncoder e            = new IMAADPCMEncoder();
                            byte[]          encodedBlock = e.Encode(samples[i][j].ToArray());
                            s.data.imaAdpcm[i][j]      = new strm.dataBlock.imaAdpcmBlock();
                            s.data.imaAdpcm[i][j].data = encodedBlock;
                        }
                    }

                    //Head stuff.
                    s.head.nSample          = (UInt32)data.pcm16[0].Length;
                    s.head.nBlockLen        = 0x200;
                    s.head.nBlock           = (UInt32)Math.Ceiling(data.pcm16[0].Length / (decimal)0x3F8);
                    s.head.nBlockSample     = 0x3F8;
                    s.head.nLastBlockLen    = (UInt32)(s.data.imaAdpcm[0][s.data.imaAdpcm[0].Length - 1].data.Length);
                    s.head.nLastBlockSample = (UInt32)(samples[0][samples[0].Length - 1].Count());
                }
                else
                {
                    s.head.waveType = 1;
                    s.data.pcm16    = new short[fmt.numChannels][];
                    for (int i = 0; i < fmt.numChannels; i++)
                    {
                        s.data.pcm16[i] = new short[data.pcm16[i].Length];
                        for (int j = 0; j < s.data.pcm16[i].Length; j++)
                        {
                            s.data.pcm16[i][j] = data.pcm16[i][j];
                        }
                    }
                }
            }

            //Loop.
            if (loop)
            {
                s.head.loop        = 1;
                s.head.nLoopOffset = (UInt32)NearestRound(smpl.loopStart, 0x3F8);
            }

            s.update();
            return(s);
        }
Beispiel #2
0
        //Convert to swav.
        public swav toSwav(bool encode = true)
        {
            swav s = new swav();

            if (fmt.numChannels < 2)
            {
                s.data = new swav.dataBlock();
                s.data.info.loopFlag    = 0;
                s.data.info.nloopOffset = 0;
                s.data.info.nSampleRate = (UInt16)fmt.sampleRate;

                if (fmt.bitsPerSample == 8)
                {
                    //Cut off extra data.
                    loadPCMChannels();
                    if (loop && smpl.loopEnd != 0)
                    {
                        for (int i = 0; i < fmt.numChannels; i++)
                        {
                            List <byte> newSamples = data.pcm8[i].ToList();
                            while (newSamples.Count() > smpl.loopEnd)
                            {
                                newSamples.RemoveAt(newSamples.Count() - 1);
                            }
                            data.pcm8[i] = newSamples.ToArray();
                        }
                    }
                    unpackPCMChannels();

                    s.data.info.waveType = 0;
                    s.data.pcm8          = new byte[data.data.Length];
                    for (int i = 0; i < s.data.pcm8.Length; i++)
                    {
                        s.data.pcm8[i] = (byte)(data.data[i] - 0x80);
                    }
                    List <byte> pcm8Data = s.data.pcm8.ToList();
                    while (pcm8Data.Count % 4 != 0)
                    {
                        pcm8Data.Add(0);
                    }
                    s.data.pcm8 = pcm8Data.ToArray();
                }
                else
                {
                    //Cut off extra data.
                    loadPCMChannels();
                    if (loop && smpl.loopEnd != 0)
                    {
                        for (int i = 0; i < fmt.numChannels; i++)
                        {
                            List <short> newSamples = data.pcm16[i].ToList();
                            while (newSamples.Count() > smpl.loopEnd)
                            {
                                newSamples.RemoveAt(newSamples.Count() - 1);
                            }
                            data.pcm16[i] = newSamples.ToArray();
                        }
                    }
                    unpackPCMChannels();

                    if (encode)
                    {
                        s.data.info.waveType = 2;
                        MemoryStream     src2    = new MemoryStream(data.data);
                        BinaryDataReader br2     = new BinaryDataReader(src2);
                        short[]          samples = br2.ReadInt16s(data.data.Length / 2);
                        IMAADPCMEncoder  e       = new IMAADPCMEncoder();
                        List <byte>      imaData = e.Encode(samples).ToList();
                        while (imaData.Count % 4 != 0)
                        {
                            imaData.Add(0);
                        }
                        s.data.imaAdpcm = imaData.ToArray();
                    }
                    else
                    {
                        s.data.info.waveType = 1;
                        MemoryStream     src = new MemoryStream(data.data);
                        BinaryDataReader br  = new BinaryDataReader(src);
                        s.data.pcm16 = br.ReadInt16s(data.data.Length / 2);
                        List <short> pcm16Data = s.data.pcm16.ToList();
                        while (pcm16Data.Count % 2 != 0)
                        {
                            pcm16Data.Add(0);
                        }
                        s.data.pcm16 = pcm16Data.ToArray();
                    }
                }
            }
            else
            {
                throw new Exception("Wave file not mono!");
            }


            //Loop.
            if (loop)
            {
                s.data.info.loopFlag = 1;
                switch (s.data.info.waveType)
                {
                case 0:
                    s.data.info.nloopOffset = (UInt16)NearestRound(smpl.loopStart / 4, 4);
                    break;

                case 1:
                    s.data.info.nloopOffset = (UInt16)NearestRound(smpl.loopStart / 2, 4);
                    break;

                case 2:
                    s.data.info.nloopOffset = (UInt16)NearestRound(smpl.loopStart / 8, 4);
                    break;
                }
            }

            return(s);
        }