コード例 #1
0
        /// <summary>
        /// Combine two stereo files to one quad file
        /// </summary>
        /// <param name="filePathLeft">file path to the left stereo file</param>
        /// <param name="filePathRight">file path to the right stereo file</param>
        /// <param name="combinedFileNamePath">file path to the combined quad file</param>
        /// <returns></returns>
        public static bool CombineStereoToQuad(string filePathLeft, string filePathRight, string combinedFileNamePath)
        {
            WaveFormat waveFormatLeft = GetWaveFormat(filePathLeft);
            WaveFormat waveFormatRight = GetWaveFormat(filePathRight);
            if (!waveFormatLeft.Equals(waveFormatRight)) {
                Console.Out.WriteLine("The two files to combine must have the same format");
                return false;
            }
            if (waveFormatLeft.Channels != 2 || waveFormatRight.Channels != 2) {
                Console.Out.WriteLine("The two files to combine must be stereo");
                return false;
            }

            int sampleRate = waveFormatLeft.SampleRate;

            float[] channel1;
            float[] channel2;
            float[] channel3;
            float[] channel4;
            SplitStereoWaveFileToMono(filePathLeft, out channel1, out channel2);
            SplitStereoWaveFileToMono(filePathRight, out channel3, out channel4);

            // find out what channel is longest
            int maxLength = Math.Max(channel1.Length, channel3.Length);

            using (WaveFileWriter wavWriter = new WaveFileWriter(combinedFileNamePath, WaveFormat.CreateIeeeFloatWaveFormat(sampleRate, 4)))
            {
                // write one and one float (interlaced), pad if neccesary
                for (int i = 0; i < maxLength; i++) {
                    if (i < channel1.Length) {
                        wavWriter.WriteSample(channel1[i]);
                    } else {
                        wavWriter.WriteSample(0.0f);
                    }
                    if (i < channel2.Length) {
                        wavWriter.WriteSample(channel2[i]);
                    } else {
                        wavWriter.WriteSample(0.0f);
                    }
                    if (i < channel3.Length) {
                        wavWriter.WriteSample(channel3[i]);
                    } else {
                        wavWriter.WriteSample(0.0f);
                    }
                    if (i < channel4.Length) {
                        wavWriter.WriteSample(channel4[i]);
                    } else {
                        wavWriter.WriteSample(0.0f);
                    }
                }
            }
            return true;
        }
コード例 #2
0
 public void CanAccessSamplesIndividuallyInAMonoFile()
 {
     var ms =  new MemoryStream();
     using (var writer = new WaveFileWriter( new IgnoreDisposeStream(ms), new WaveFormat(8000, 16, 1)))
     {
         writer.WriteSample(0.1f);
         writer.WriteSample(0.2f);
         writer.WriteSample(0.3f);
         writer.WriteSample(0.4f);
     }
     ms.Position = 0;
     using (var reader = new WaveFileReader(ms))
     {
         Assert.AreEqual(0.1f, reader.ReadNextSampleFrame()[0], 0.001f);
         Assert.AreEqual(0.2f, reader.ReadNextSampleFrame()[0], 0.001f);
         Assert.AreEqual(0.3f, reader.ReadNextSampleFrame()[0], 0.001f);
         Assert.AreEqual(0.4f, reader.ReadNextSampleFrame()[0], 0.001f);
         Assert.IsNull(reader.ReadNextSampleFrame());
     }
 }
コード例 #3
0
 public void CanUseWriteSampleToA16BitFile()
 {
     float amplitude = 0.25f;
     float frequency = 1000;
     using (WaveFileWriter writer = new WaveFileWriter(new MemoryStream(), new WaveFormat(16000, 16, 1)))
     {
         for (int n = 0; n < 1000; n++)
         {
             float sample = (float)(amplitude * Math.Sin((2 * Math.PI * n * frequency) / writer.WaveFormat.SampleRate));
             writer.WriteSample(sample);
         }
     }
 }
コード例 #4
0
        public void CanAccessSamplesIndividuallyInAStereoFile()
        {
            var ms = new MemoryStream();
            using (var writer = new WaveFileWriter(new IgnoreDisposeStream(ms), new WaveFormat(8000, 16, 2)))
            {
                writer.WriteSample(0.1f);
                writer.WriteSample(0.2f);
                writer.WriteSample(0.3f);
                writer.WriteSample(0.4f);

            }
            ms.Position = 0;
            using (var reader = new WaveFileForwardOnlyReader(new ForwardOnlyStream(ms)))
            {
                var f1 = reader.ReadNextSampleFrame();
                Assert.AreEqual(0.1f, f1[0], 0.0001f);
                Assert.AreEqual(0.2f, f1[1], 0.0001f);
                var f2 = reader.ReadNextSampleFrame();
                Assert.AreEqual(0.3f, f2[0], 0.0001f);
                Assert.AreEqual(0.4f, f2[1], 0.0001f);
                Assert.IsNull(reader.ReadNextSampleFrame());
            }
        }
コード例 #5
0
ファイル: Cw_winForm.cs プロジェクト: richmanfx/cw_win_4
 // Сгенерируем Сэмпл определённой длительности, амплитуды и частоты и запишем в звуковой файл
 private void WavPlay(WaveFileWriter writer, int millisec, float amplitude, float frequency)
 {
     for (int n = 0; n < millisec; n++)
     {
        float sample = (float)(amplitude * Math.Sin((Math.PI * n * frequency) / writer.WaveFormat.SampleRate));
        writer.WriteSample(sample);
     }
     return;
 }