Esempio n. 1
0
        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);
        }