예제 #1
0
        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());
                }
            }
        }
예제 #2
0
        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;
        }
예제 #3
0
 public DRCSampleProvider(IWaveProvider waveProvider)
     : base(waveProvider)
 {
     volumeSampleProvider_ = new VolumeSampleProvider(waveProvider.ToSampleProvider());
     drcSampleProvider_    = new SimpleCompressorEffect(volumeSampleProvider_);
 }
예제 #4
0
 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());
        }