/// <summary> /// Creates a sample sequence used to demonstrate scope features. /// </summary> private SampleSequence CreateDemoSampleSequence(double duration, int sampleRate, IInterpolator interpolator, int interpolatedSampleRate) { var values1 = FunctionValueGenerator.GenerateSineValuesForFrequency(1, sampleRate, duration, (x, y) => y); var values3 = FunctionValueGenerator.GenerateSineValuesForFrequency(3, sampleRate, duration, (x, y) => y / 2); var values = CollectionUtilities.Zip( objects => ((double)objects[0]) + ((double)objects[1]), values1, values3); if (interpolator != null) { values = interpolator.Interpolate(values, 0, duration, sampleRate, interpolatedSampleRate); sampleRate = interpolatedSampleRate; } // LogDeferredAccess shows us some details about how the values are accessed (see there). return(new SampleSequence(1f / sampleRate, values)); //return new SampleSequence(1/sampleFrequency, LogDeferredAccess(values)); }
public static void GenerateWaveformFile(string outPath) { short channelsCount = 2; int samplesPerSecond = 44100; short bitsPerSample = 16; var frequency = 440; var durationInSeconds = 2; var amplitude = 0.1; var frames = FunctionValueGenerator .GenerateSineValuesForFrequency(frequency, samplesPerSecond, durationInSeconds, (x, y) => { var samples = new [] { amplitude *y, amplitude *y }; return(new WaveForm16BitFrame(samples)); }); var format = new WaveformFormat(channelsCount, samplesPerSecond, bitsPerSample); var waveForm = new MemoryWaveform(format, frames); WriteWaveformFile(outPath, waveForm); }