public IRiffContainer Encode(ISound sound, int samplesPerBlock) { var sampleRate = sound[NumericData.Rate]; if (sampleRate == null) { var sampleRates = sound .Samples .Select(s => s[NumericData.Rate]) .Where(r => r != null) .Distinct() .ToArray(); sampleRate = sampleRates.SingleOrDefault(); } if (sampleRate == null) { sampleRate = 44100; } var channels = sound.Samples.Count; var byteRate = sampleRate * channels * 2 / 4; //not accurate but not far off var container = new RiffContainer { Format = "WAVE", Chunks = new List <IRiffChunk>() }; var extraFormat = new MicrosoftAdpcmFormat { Coefficients = MicrosoftAdpcmConstants.DefaultCoefficients, SamplesPerBlock = 500 }; var format = new RiffFormat { Format = 2, SampleRate = (int)sampleRate, Channels = channels, ByteRate = (int)byteRate, BitsPerSample = 4, BlockAlign = _microsoftAdpcmEncoder.GetBlockSize(samplesPerBlock, channels), ExtraData = extraFormat.ToBytes() }; container.Chunks.Add(_formatEncoder.Encode(format)); container.Chunks.Add(new RiffChunk { Id = "data", Data = _microsoftAdpcmEncoder.Encode(sound, samplesPerBlock) }); return(container); }
public RiffDescriptorChunk(RiffFormat format = RiffFormat.WAVE, uint fileLength = 36) { ChunkID = BitConverter.GetBytes((uint)RiffChunkId.RIFF).Reverse().ToArray(); ChunkSize = BitConverter.GetBytes(fileLength); Data = BitConverter.GetBytes((uint)format).Reverse().ToArray(); }
public IRiffContainer Encode(ISound sound) { var sampleRate = sound[NumericData.Rate]; if (sampleRate == null) { var sampleRates = sound .Samples .Select(s => s[NumericData.Rate]) .Where(r => r != null) .Distinct() .ToArray(); sampleRate = sampleRates.SingleOrDefault(); } if (sampleRate == null) { sampleRate = 44100; } var channels = sound.Samples.Count; var byteRate = sampleRate * channels * 2; var container = new RiffContainer { Format = "WAVE", Chunks = new List <IRiffChunk>() }; var format = new RiffFormat { Format = 1, SampleRate = (int)sampleRate, Channels = channels, ByteRate = (int)byteRate, BitsPerSample = 16, BlockAlign = channels * 2, ExtraData = new byte[0] }; container.Chunks.Add(_formatEncoder.Encode(format)); var totalSamples = sound.Samples.Max(s => s.Data.Count); using (var stream = new MemoryStream()) using (var writer = new BinaryWriter(stream)) { for (var i = 0; i < totalSamples; i++) { for (var j = 0; j < sound.Samples.Count; j++) { var sample = sound.Samples[j]; var source = sample.Data; var sourceValue = i < source.Count ? source[i] : 0f; var value = Math.Round(sourceValue * 32767f); if (value > 32767f) { value = 32767f; } else if (value < -32767f) { value = -32767f; } writer.Write((short)value); } } container.Chunks.Add(new RiffChunk { Id = "data", Data = stream.ToArray() }); } return(container); }