public static void ExportCustomIndices(List<CustomIndex> customIndices, string exportFolder, Dictionary<SampleGeneratingArgs, SampleSoundGenerator> loadedSamples=null) { foreach (CustomIndex ci in customIndices) { foreach (KeyValuePair<string, HashSet<SampleGeneratingArgs>> kvp in ci.Samples) { if (kvp.Value.Count == 0) { continue; } var samples = new List<ISampleProvider>(); var volumes = new List<double>(); int soundsAdded = 0; if (loadedSamples != null) { foreach (SampleGeneratingArgs args in kvp.Value) { if (SampleImporter.ValidateSampleArgs(args, loadedSamples)) { var sample = loadedSamples[args]; samples.Add(sample.GetSampleProvider()); volumes.Add(sample.VolumeCorrection != -1 ? sample.VolumeCorrection : 1f); soundsAdded++; } } } else { foreach (SampleGeneratingArgs args in kvp.Value) { try { var sample = SampleImporter.ImportSample(args); samples.Add(sample.GetSampleProvider()); volumes.Add(sample.VolumeCorrection != -1 ? sample.VolumeCorrection : 1f); soundsAdded++; } catch (Exception) { } } } if (soundsAdded == 0) { continue; } int maxSampleRate = samples.Max(o => o.WaveFormat.SampleRate); int maxChannels = samples.Max(o => o.WaveFormat.Channels); IEnumerable<ISampleProvider> sameFormatSamples = samples.Select(o => (ISampleProvider)new WdlResamplingSampleProvider(SampleImporter.SetChannels(o, maxChannels), maxSampleRate)); ISampleProvider result = new MixingSampleProvider(sameFormatSamples); if (soundsAdded > 1) { result = new VolumeSampleProvider(result) { Volume = (float)(1 / Math.Sqrt(soundsAdded * volumes.Average())) }; result = new SimpleCompressorEffect(result) { Threshold = 16, Ratio = 6, Attack = 0.1, Release = 0.1, Enabled = true, MakeUpGain = 15 * Math.Log10(Math.Sqrt(soundsAdded * volumes.Average())) }; } // TODO: Allow mp3, ogg and aif export. string filename = ci.Index == 1 ? kvp.Key + ".wav" : kvp.Key + ci.Index + ".wav"; CreateWaveFile(Path.Combine(exportFolder, filename), result.ToWaveProvider16()); } } }
public CallsignSampleProvider(WaveFormat waveFormat, ReceiverSampleProvider receiver) { this.receiver = receiver; WaveFormat = waveFormat; if (waveFormat.Channels != 1) { throw new Exception("Incorrect number of channels. A channel count of 1 is required."); } decoderShortBuffer = new short[frameCount]; decoderByteBuffer = new byte[frameCount * 2]; mixer = new MixingSampleProvider(WaveFormat) { ReadFully = true }; crackleSoundProvider = new ResourceSoundSampleProvider(Samples.Instance.Crackle) { Looping = true, Gain = 0 }; vhfWhiteNoise = new ResourceSoundSampleProvider(Samples.Instance.WhiteNoise) { Looping = true, Gain = 0 }; hfWhiteNoise = new ResourceSoundSampleProvider(Samples.Instance.HFWhiteNoise) { Looping = true, Gain = 0 }; acBusNoise = new ResourceSoundSampleProvider(Samples.Instance.AcBus) { Looping = true, Gain = 0 }; audioInput = new BufferedWaveProvider(new WaveFormat(WaveFormat.SampleRate, 16, 1)) { ReadFully = true, BufferLength = new WaveFormat(WaveFormat.SampleRate, 16, 1).AverageBytesPerSecond * 60 }; //Create the compressor simpleCompressorEffect = new SimpleCompressorEffect(new Pcm16BitToSampleProvider(audioInput)); simpleCompressorEffect.Enabled = true; simpleCompressorEffect.MakeUpGain = -5.5; limiterEffect = new LimiterEffect(simpleCompressorEffect); // Create the voice EQ voiceEq = new EqualizerSampleProvider(limiterEffect, AudioConfig.Instance.VhfEqualizer); BypassEffects = false; DistanceRatio = 1; mixer.AddMixerInput(crackleSoundProvider); mixer.AddMixerInput(vhfWhiteNoise.ToMono()); mixer.AddMixerInput(acBusNoise.ToMono()); if (AudioConfig.Instance.HfSquelch) { mixer.AddMixerInput(hfWhiteNoise.ToMono()); } mixer.AddMixerInput(voiceEq); timer = new System.Timers.Timer(); timer.Interval = 100; timer.Elapsed += _timer_Elapsed; }
public DRCSampleProvider(IWaveProvider waveProvider) : base(waveProvider) { volumeSampleProvider_ = new VolumeSampleProvider(waveProvider.ToSampleProvider()); drcSampleProvider_ = new SimpleCompressorEffect(volumeSampleProvider_); }
public DRCSampleProvider(AudioFileReader audioFileReader) : base(audioFileReader) { audioFileReader_ = audioFileReader; drcSampleProvider_ = new SimpleCompressorEffect(audioFileReader_); }
public static void ExportMixedSample(IEnumerable <SampleGeneratingArgs> sampleGeneratingArgses, string name, string exportFolder, Dictionary <SampleGeneratingArgs, SampleSoundGenerator> loadedSamples = null) { var samples = new List <ISampleProvider>(); var volumes = new List <double>(); int soundsAdded = 0; if (loadedSamples != null) { foreach (var sample in from args in sampleGeneratingArgses where SampleImporter.ValidateSampleArgs(args, loadedSamples) select loadedSamples[args]) { samples.Add(sample.GetSampleProvider()); volumes.Add(Math.Abs(sample.VolumeCorrection - -1) > Precision.DOUBLE_EPSILON ? sample.VolumeCorrection : 1f); soundsAdded++; } } else { foreach (SampleGeneratingArgs args in sampleGeneratingArgses) { try { var sample = SampleImporter.ImportSample(args); samples.Add(sample.GetSampleProvider()); volumes.Add(Math.Abs(sample.VolumeCorrection - -1) > Precision.DOUBLE_EPSILON ? sample.VolumeCorrection : 1f); soundsAdded++; } catch (Exception ex) { Console.WriteLine($@"{ex.Message} while importing sample {args}."); } } } if (soundsAdded == 0) { return; } int maxSampleRate = samples.Max(o => o.WaveFormat.SampleRate); int maxChannels = samples.Max(o => o.WaveFormat.Channels); IEnumerable <ISampleProvider> sameFormatSamples = samples.Select(o => (ISampleProvider) new WdlResamplingSampleProvider(SampleImporter.SetChannels(o, maxChannels), maxSampleRate)); ISampleProvider result = new MixingSampleProvider(sameFormatSamples); if (soundsAdded > 1) { result = new VolumeSampleProvider(result) { Volume = (float)(1 / Math.Sqrt(soundsAdded * volumes.Average())) }; result = new SimpleCompressorEffect(result) { Threshold = 16, Ratio = 6, Attack = 0.1, Release = 0.1, Enabled = true, MakeUpGain = 15 * Math.Log10(Math.Sqrt(soundsAdded * volumes.Average())) }; } // TODO: Allow mp3, ogg and aif export. string filename = name + ".wav"; CreateWaveFile(Path.Combine(exportFolder, filename), result.ToWaveProvider16()); }