/// <summary> /// Helper function to go from IWaveProvider to a SampleProvider /// Must already be PCM or IEEE float /// </summary> /// <param name="waveProvider">The WaveProvider to convert</param> /// <returns>A sample provider</returns> public static ISampleProvider ConvertWaveProviderIntoSampleProvider(IWaveProvider waveProvider) { ISampleProvider sampleProvider; if (waveProvider.WaveFormat.Encoding == WaveFormatEncoding.Pcm) { // go to float if (waveProvider.WaveFormat.BitsPerSample == 8) { sampleProvider = new Pcm8BitToSampleProvider(waveProvider); } else if (waveProvider.WaveFormat.BitsPerSample == 16) { sampleProvider = new Pcm16BitToSampleProvider(waveProvider); } else if (waveProvider.WaveFormat.BitsPerSample == 24) { sampleProvider = new Pcm24BitToSampleProvider(waveProvider); } else { throw new InvalidOperationException("Unsupported operation"); } } else if (waveProvider.WaveFormat.Encoding == WaveFormatEncoding.IeeeFloat) { sampleProvider = new WaveToSampleProvider(waveProvider); } else { throw new ArgumentException("Unsupported source encoding"); } return sampleProvider; }
public static SampleSource CreateFromWaveFile(string fileName) { using (var reader = new WaveFileReader(fileName)) { ISampleProvider sp; int sourceSamples; if (reader.WaveFormat.Encoding == WaveFormatEncoding.Pcm) { if (reader.WaveFormat.BitsPerSample == 16) { sp = new Pcm16BitToSampleProvider(reader); sourceSamples = (int)(reader.Length / 2); } else if (reader.WaveFormat.BitsPerSample == 24) { sp = new Pcm24BitToSampleProvider(reader); sourceSamples = (int)(reader.Length / 3); } else { throw new ArgumentException("Currently only 16 or 24 bit PCM samples are supported"); } } else if (reader.WaveFormat.Encoding == WaveFormatEncoding.IeeeFloat) { sp = new WaveToSampleProvider(reader); sourceSamples = (int)(reader.Length / 4); } else { throw new ArgumentException("Must be PCM or IEEE float"); } float[] sampleData = new float[sourceSamples]; int n = sp.Read(sampleData, 0, sourceSamples); if (n != sourceSamples) { throw new InvalidOperationException(String.Format("Couldn't read the whole sample, expected {0} samples, got {1}", n, sourceSamples)); } SampleSource ss = new SampleSource(sampleData, sp.WaveFormat); return ss; } }
/// <summary> /// Helper function to go from IWaveProvider to a SampleProvider /// Must already be PCM or IEEE float /// </summary> /// <param name="waveProvider">The WaveProvider to convert</param> /// <returns>A sample provider</returns> public static ISampleProvider ConvertWaveProviderIntoSampleProvider(IWaveProvider waveProvider) { ISampleProvider sampleProvider; if (waveProvider.WaveFormat.Encoding == WaveFormatEncoding.Pcm) { // go to float if (waveProvider.WaveFormat.BitsPerSample == 8) { sampleProvider = new Pcm8BitToSampleProvider(waveProvider); } else if (waveProvider.WaveFormat.BitsPerSample == 16) { sampleProvider = new Pcm16BitToSampleProvider(waveProvider); } else if (waveProvider.WaveFormat.BitsPerSample == 24) { sampleProvider = new Pcm24BitToSampleProvider(waveProvider); } else { throw new InvalidOperationException("Unsupported operation"); } } else if (waveProvider.WaveFormat.Encoding == WaveFormatEncoding.IeeeFloat) { sampleProvider = new WaveToSampleProvider(waveProvider); } else { throw new ArgumentException("Unsupported source encoding"); } return(sampleProvider); }
public static ISampleProvider ConvertWaveProviderIntoSampleProvider(IWaveProvider waveProvider) { ISampleProvider result; if (waveProvider.WaveFormat.Encoding == WaveFormatEncoding.Pcm) { if (waveProvider.WaveFormat.BitsPerSample == 8) { result = new Pcm8BitToSampleProvider(waveProvider); } else if (waveProvider.WaveFormat.BitsPerSample == 16) { result = new Pcm16BitToSampleProvider(waveProvider); } else if (waveProvider.WaveFormat.BitsPerSample == 24) { result = new Pcm24BitToSampleProvider(waveProvider); } else { if (waveProvider.WaveFormat.BitsPerSample != 32) { throw new InvalidOperationException("Unsupported bit depth"); } result = new Pcm32BitToSampleProvider(waveProvider); } } else { if (waveProvider.WaveFormat.Encoding != WaveFormatEncoding.IeeeFloat) { throw new ArgumentException("Unsupported source encoding"); } if (waveProvider.WaveFormat.BitsPerSample == 64) { result = new WaveToSampleProvider64(waveProvider); } else { result = new WaveToSampleProvider(waveProvider); } } return(result); }
/// <summary> /// Initialises a new instance of SampleChannel /// </summary> /// <param name="waveProvider">Source wave provider, must be PCM or IEEE</param> public SampleChannel(IWaveProvider waveProvider) { ISampleProvider sampleProvider; if (waveProvider.WaveFormat.Encoding == WaveFormatEncoding.Pcm) { // go to float if (waveProvider.WaveFormat.BitsPerSample == 8) { sampleProvider = new Pcm8BitToSampleProvider(waveProvider); } else if (waveProvider.WaveFormat.BitsPerSample == 16) { sampleProvider = new Pcm16BitToSampleProvider(waveProvider); } else if (waveProvider.WaveFormat.BitsPerSample == 24) { sampleProvider = new Pcm24BitToSampleProvider(waveProvider); } else { throw new InvalidOperationException("Unsupported operation"); } } else if (waveProvider.WaveFormat.Encoding == WaveFormatEncoding.IeeeFloat) { sampleProvider = new WaveToSampleProvider(waveProvider); } else { throw new ArgumentException("Unsupported source encoding"); } if (sampleProvider.WaveFormat.Channels == 1) { sampleProvider = new MonoToStereoSampleProvider(sampleProvider); } this.waveFormat = sampleProvider.WaveFormat; // let's put the meter before the volume (useful for drawing waveforms) this.preVolumeMeter = new MeteringSampleProvider(sampleProvider); this.volumeProvider = new VolumeSampleProvider(preVolumeMeter); }
private void DoNormalize(string baseFilename, Action<string> addLogMessage, Action<long> sourceLengthCallback, Action<long> progressCallback) { Debug.Assert(addLogMessage != null); Debug.Assert(sourceLengthCallback != null); Debug.Assert(progressCallback != null); addLogMessage("Running compressor..."); float maxValue = 0f; var tempFile = Path.ChangeExtension(baseFilename, ".temp"); // Try to remove files, use some memory stream using (var reader = new WaveFileReader(baseFilename)) { sourceLengthCallback(reader.Length); var sampleReader = new Pcm16BitToSampleProvider(reader); var compressor = new FastAttackCompressor1175(sampleReader); var aggregator = new MaxSampleAggregator(compressor); //SimpleCompressorStream aggregator.MaximumCalculated += (s, a) => maxValue = Math.Max(maxValue, a.MaxSample); var sampleWriter = new SampleToWaveProvider16(aggregator); FileCreator.CreateWaveFile(tempFile, sampleWriter, progressCallback); } File.Delete(baseFilename); addLogMessage("Found max: " + maxValue.ToString()); addLogMessage("Normalizing..."); using (var reader = new WaveFileReader(tempFile)) { sourceLengthCallback(reader.Length); var sampleReader = new Pcm16BitToSampleProvider(reader); var normalizer = new NormalizeProvider(sampleReader, .98f, maxValue); var sampleWriter = new SampleToWaveProvider16(normalizer); FileCreator.CreateWaveFile(baseFilename, sampleWriter, progressCallback); } File.Delete(tempFile); }
public static SampleSource[] CreateFromWaveFile(string fileName) { using (var reader = new WaveFileReader(fileName)) { ISampleProvider sp; int sourceSamples; if (reader.WaveFormat.Encoding == WaveFormatEncoding.Pcm) { if (reader.WaveFormat.BitsPerSample == 16) { sp = new Pcm16BitToSampleProvider(reader); sourceSamples = (int)(reader.Length / 2); } else if (reader.WaveFormat.BitsPerSample == 24) { sp = new Pcm24BitToSampleProvider(reader); sourceSamples = (int)(reader.Length / 3); } else { throw new ArgumentException("Currently only 16 or 24 bit PCM samples are supported"); } } else if (reader.WaveFormat.Encoding == WaveFormatEncoding.IeeeFloat) { sp = new WaveToSampleProvider(reader); sourceSamples = (int)(reader.Length / 4); } else { throw new ArgumentException("Must be PCM or IEEE float"); } float[] sampleData = new float[sourceSamples]; int n = sp.Read(sampleData, 0, sourceSamples); if (n != sourceSamples) { throw new InvalidOperationException(String.Format("Couldn't read the whole sample, expected {0} samples, got {1}", n, sourceSamples)); } SampleSource[] result = new SampleSource[9]; // Normal pitch int normal = 4; result[normal] = new SampleSource(sampleData, sp.WaveFormat); int pitch = 5; for (int currentPitch = 0; currentPitch < normal; currentPitch++, pitch--) { float[] changedPitchData = new float[sampleData.Length/pitch]; for (int j = 0, i = 0; i < sampleData.Length && j < changedPitchData.Length; i++) { if (i % pitch == 0) { changedPitchData[j] = sampleData[i]; j++; } } result[currentPitch] = new SampleSource(changedPitchData, sp.WaveFormat); } pitch = 2; for (int currentPitch = normal+1; currentPitch < result.Length; currentPitch++, pitch++) { float[] changedPitchData = new float[sampleData.Length * pitch]; for (int j = 0, i = 0; i < sampleData.Length && j < changedPitchData.Length; j++) { changedPitchData[j] = sampleData[i]; if (j % pitch == 0) { i++; } } result[currentPitch] = new SampleSource(changedPitchData, sp.WaveFormat); } return result; } }