/// <summary> /// Заменяет заданный канал в аудио другим каналом /// </summary> /// <param name="audio">Аудио</param> /// <param name="num">Номер заменяемого канала</param> /// <param name="channel">Массив данных канала</param> /// <returns></returns> public static UInt32[,] ReplaceChannel(UInt32[,] audio, Int32 num, UInt32[] channel) { UInt32[,] naudio = new UInt32[audio.GetLength(0), audio.GetLength(1)]; for (int ch = 0; ch < naudio.GetLength(1); ch++) { for (uint i = 0; i < channel.Length; i++) { if (i != num) { naudio[i, ch] = audio[i, ch]; ch++; } else { naudio[i, ch] = channel[i]; } } } return(naudio); }
/// <summary> /// Распарсит массив байт .wav файла и вернёт объект типа DotWaveInfo /// </summary> /// <param name="bytes">Одномерный массив байт аудио</param> /// <returns></returns> public static DotWaveInfo GetWaves(byte[] bytes) { UInt16 numChannels = BitConverter.ToUInt16(bytes, 22); UInt32 sampleRate = BitConverter.ToUInt32(bytes, 24); UInt16 bitsPerSample = BitConverter.ToUInt16(bytes, 34); UInt32[,] WData = new UInt32[(bytes.Length - 44) / (numChannels * (bitsPerSample / 8)), numChannels]; for (uint block = 0; block < WData.GetLength(0); block++) { for (uint ch = 0; ch < numChannels; ch++) { byte[] part = new byte[4]; for (uint i = 0; i < bitsPerSample / 8; i++) { part[i] = bytes[44 + block * (numChannels * (bitsPerSample / 8)) + ch * (bitsPerSample / 8) + i]; } if (bitsPerSample <= 8) { if (part[0] < 127) { part[0] += 127; } else { part[0] -= 127; } } UInt32 upart = BitConverter.ToUInt32(part, 0); upart = (UInt32)((double)upart / Math.Pow(256, bitsPerSample / 8) * (double)UInt32.MaxValue); WData[block, ch] = upart; } } return(new DotWaveInfo(WData, sampleRate, bitsPerSample)); }