//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); }
//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); }