public void RefreshCalculations(int?frameLength = null, int?beStart = null, int?beStop = null)
        {
            if (frameLength.HasValue)
            {
                this.FrameLength = frameLength.Value;
            }
            if (beStart.HasValue)
            {
                this.BEFrequencyStart = beStart.Value;
            }
            if (beStop.HasValue)
            {
                this.BEFrequencyStop = beStop.Value;
            }
            BEFrequencyStart = Math.Max(BEFrequencyStart, 0);
            BEFrequencyStop  = Math.Max(BEFrequencyStop, 0);
            if (BEFrequencyStop < BEFrequencyStart)
            {
                (BEFrequencyStart, BEFrequencyStop) = (BEFrequencyStop, BEFrequencyStart);
            }
            //Eagerly calculate FFT per frame as it's needed in every parameter
            fftPerFrame = new float [samples.Length / FrameLength] [];
            _           = Parallel.For(0, samples.Length / FrameLength, (i) => fftPerFrame [i] = FastFourierTransform.SelectedFrameFFT(GetSamples(), SampleRate, i, FrameLength, false));
            //First batch of tasks - independent from one another
            var taskList = new Task <float []> []
            {
                Volume.Calculate(this),
                FrequencyCentroid.Calculate(this),
                BandEnergy.Calculate(this),
                SpectralFlatnessMeasure.Calculate(this),
                SpectralCrestFactor.Calculate(this)
            };

            Task.WaitAll(taskList);
            volume                  = taskList [0].Result;
            frequencyCentroid       = taskList [1].Result;
            bandEnergy              = taskList [2].Result;
            spectralFlatnessMeasure = taskList [3].Result;
            spectralCrestFactor     = taskList [4].Result;
            //Second batch - previously calculated parameters are needed here
            taskList = new Task <float []> []
            {
                EffectiveBandwidth.Calculate(this),
                BandEnergyRatio.Calculate(this)
            };
            Task.WaitAll(taskList);
            effectiveBandwidth = taskList [0].Result;
            bandEnergyRatio    = taskList [1].Result;
        }