private void UpdateBarLayout() { if (_soundPlayer == null || _spectrumCanvas == null) { return; } _barWidth = Math.Max(((_spectrumCanvas.RenderSize.Width - (BarSpacing * (BarCount + 1))) / BarCount), 1); _maximumFrequencyIndex = Math.Min(_soundPlayer.GetFftFrequencyIndex(MaximumFrequency) + 1, 2047); _minimumFrequencyIndex = Math.Min(_soundPlayer.GetFftFrequencyIndex(MinimumFrequency), 2047); int actualBarCount; actualBarCount = _barWidth >= 1.0d ? BarCount : Math.Max((int)((_spectrumCanvas.RenderSize.Width - BarSpacing) / (_barWidth + BarSpacing)), 1); _channelPeakData = new float[actualBarCount]; var indexCount = _maximumFrequencyIndex - _minimumFrequencyIndex; var linearIndexBucketSize = (int)Math.Round(indexCount / (double)actualBarCount, 0); var maxIndexList = new List <int>(); var maxLogScaleIndexList = new List <int>(); var maxLog = Math.Log(actualBarCount, actualBarCount); for (var i = 1; i < actualBarCount; i++) { maxIndexList.Add(_minimumFrequencyIndex + (i * linearIndexBucketSize)); var logIndex = (int)((maxLog - Math.Log((actualBarCount + 1) - i, (actualBarCount + 1))) * indexCount) + _minimumFrequencyIndex; maxLogScaleIndexList.Add(logIndex); } maxIndexList.Add(_maximumFrequencyIndex); maxLogScaleIndexList.Add(_maximumFrequencyIndex); _barIndexMax = maxIndexList.ToArray(); _barLogScaleIndexMax = maxLogScaleIndexList.ToArray(); _spectrumCanvas.Children.Clear(); _barShapes.Clear(); _peakShapes.Clear(); var height = _spectrumCanvas.RenderSize.Height; var peakDotHeight = Math.Max(_barWidth / 2.0f, 1); for (var i = 0; i < actualBarCount; i++) { var xCoord = BarSpacing + (_barWidth * i) + (BarSpacing * i) + 1; var barRectangle = new Rectangle() { Margin = new Thickness(xCoord, height, 0, 0), Width = _barWidth, Height = 0, Style = BarStyle }; _barShapes.Add(barRectangle); var peakRectangle = new Rectangle() { Margin = new Thickness(xCoord, height - peakDotHeight, 0, 0), Width = _barWidth, Height = peakDotHeight, Style = PeakStyle }; _peakShapes.Add(peakRectangle); } foreach (var shape in _barShapes) { _spectrumCanvas.Children.Add(shape); } foreach (var shape in _peakShapes) { _spectrumCanvas.Children.Add(shape); } ActualBarWidth = _barWidth; }