private void InitializeBars() { ISpectrumPlayer player = ActiveSpectrumPlayer; if (player == null) { _barWidth = 1; _maximumFrequencyIndex = -1; _minimumFrequencyIndex = 0; return; } if (!_refreshShapes || _spectrumCanvas == null) { return; } int maxIndex; int minIndex; bool res = player.GetFFTFrequencyIndex(MaximumFrequency, out maxIndex); res |= player.GetFFTFrequencyIndex(MinimumFrequency, out minIndex); if (!res) { return; } _maximumFrequencyIndex = Math.Min(maxIndex + 1, FREQUENCY_BUFFER_SIZE - 1); _minimumFrequencyIndex = Math.Min(minIndex, FREQUENCY_BUFFER_SIZE - 1); _barWidth = Math.Max(((_spectrumCanvas.ActualWidth - (BarSpacing * (BarCount + 1))) / BarCount), 1); int actualBarCount = _barWidth >= 1.0d ? BarCount : Math.Max((int)((_spectrumCanvas.ActualWidth - BarSpacing) / (_barWidth + BarSpacing)), 1); _channelPeakData = new float[actualBarCount]; int indexCount = _maximumFrequencyIndex - _minimumFrequencyIndex; int linearIndexBucketSize = (int)Math.Round(indexCount / (double)actualBarCount, 0); List <int> maxIndexList = new List <int>(); List <int> maxLogScaleIndexList = new List <int>(); double maxLog = Math.Log(actualBarCount, actualBarCount); for (int i = 1; i < actualBarCount; i++) { maxIndexList.Add(_minimumFrequencyIndex + (i * linearIndexBucketSize)); int 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(); FrameworkElementCollection canvasChildren = _spectrumCanvas.Children; canvasChildren.StartUpdate(); try { canvasChildren.Clear(); double height = _spectrumCanvas.ActualHeight; double peakDotHeight = Math.Max(_barWidth / 2.0f, 1); for (int i = 0; i < actualBarCount; i++) { // Deep copy the styles to each bar Style barStyleCopy = MpfCopyManager.DeepCopyCutLVPs(BarStyle); Style peakStyleCopy = MpfCopyManager.DeepCopyCutLVPs(PeakStyle); double xCoord = BarSpacing + (_barWidth * i) + (BarSpacing * i) + 1; Control barControl = new Control { Width = _barWidth, Height = height, Style = barStyleCopy }; Canvas.SetLeft(barControl, xCoord); Canvas.SetBottom(barControl, height); _barShapes.Add(barControl); canvasChildren.Add(barControl); Control peakControl = new Control { Width = _barWidth, Height = peakDotHeight, Style = peakStyleCopy }; Canvas.SetLeft(peakControl, xCoord); Canvas.SetBottom(peakControl, height); _peakShapes.Add(peakControl); canvasChildren.Add(peakControl); } } finally { canvasChildren.EndUpdate(); } ActualBarWidth = _barWidth; _refreshShapes = false; }
/// <summary> /// Create and layout the bars /// </summary> private void UpdateBarLayout() { if (soundPlayer == null) { return; } if (DoSpectrumGraph) { UpdateSpectrumShapes(); return; } barWidth = Math.Max(((double)(this.Width - (BarSpacing * (BarCount + 1))) / (double)BarCount), 1); maximumFrequencyIndex = Math.Min(soundPlayer.GetFFTFrequencyIndex(MaximumFrequency) + 1, 8191); minimumFrequencyIndex = Math.Min(soundPlayer.GetFFTFrequencyIndex(MinimumFrequency), 8191); bandWidth = Math.Max(((double)(maximumFrequencyIndex - minimumFrequencyIndex)) / this.Width, 1.0); int actualBarCount; if (barWidth >= 1.0d) { actualBarCount = BarCount; } else { actualBarCount = Math.Max((int)((this.Width - BarSpacing) / (barWidth + BarSpacing)), 1); } channelPeakData = new float[actualBarCount]; int indexCount = maximumFrequencyIndex - minimumFrequencyIndex; int linearIndexBucketSize = (int)Math.Round((double)indexCount / (double)actualBarCount, 0); List <int> maxIndexList = new List <int>(); List <int> maxLogScaleIndexList = new List <int>(); double maxLog = Math.Log(actualBarCount, actualBarCount); for (int i = 1; i < actualBarCount; i++) { maxIndexList.Add(minimumFrequencyIndex + (i * linearIndexBucketSize)); int 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(); barShapes.Clear(); peakShapes.Clear(); double height = this.Height; double peakDotHeight = Math.Max(barWidth / 2.0f, 1); for (int i = 0; i < actualBarCount; i++) { double xCoord = BarSpacing + (barWidth * i) + (BarSpacing * i) + 1; Rectangle barRectangle = new Rectangle() { X = (int)xCoord, Y = (int)height, Width = (int)barWidth, Height = 0, }; barShapes.Add(barRectangle); Rectangle peakRectangle = new Rectangle() { X = (int)xCoord, Y = (int)(height - peakDotHeight), Width = (int)barWidth, Height = (int)peakDotHeight, }; peakShapes.Add(peakRectangle); } ActualBarWidth = barWidth; }
private void UpdateBarLayout() { if (_soundPlayer == null || _spectrumCanvas == null) { return; } _barWidth = Math.Max(((double)(_spectrumCanvas.RenderSize.Width - (BarSpacing * (BarCount + 1))) / (double)BarCount), 1); _maximumFrequencyIndex = Math.Min(_soundPlayer.GetFFTFrequencyIndex(MaximumFrequency) + 1, 2047); _minimumFrequencyIndex = Math.Min(_soundPlayer.GetFFTFrequencyIndex(MinimumFrequency), 2047); _bandWidth = Math.Max(((double)(_maximumFrequencyIndex - _minimumFrequencyIndex)) / _spectrumCanvas.RenderSize.Width, 1.0); int actualBarCount; if (_barWidth >= 1.0d) { actualBarCount = BarCount; } else { actualBarCount = Math.Max((int)((_spectrumCanvas.RenderSize.Width - BarSpacing) / (_barWidth + BarSpacing)), 1); } _channelPeakData = new float[actualBarCount]; int indexCount = _maximumFrequencyIndex - _minimumFrequencyIndex; int linearIndexBucketSize = (int)Math.Round((double)indexCount / (double)actualBarCount, 0); List <int> maxIndexList = new List <int>(); List <int> maxLogScaleIndexList = new List <int>(); double maxLog = Math.Log(actualBarCount, actualBarCount); for (int i = 1; i < actualBarCount; i++) { maxIndexList.Add(_minimumFrequencyIndex + (i * linearIndexBucketSize)); int 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(); _barHeights = new double[actualBarCount]; _peakHeights = new double[actualBarCount]; _spectrumCanvas.Children.Clear(); _barShapes.Clear(); _peakShapes.Clear(); double height = _spectrumCanvas.RenderSize.Height; double peakDotHeight = Math.Max(_barWidth / 2.0f, 1); for (int i = 0; i < actualBarCount; i++) { double xCoord = BarSpacing + (_barWidth * i) + (BarSpacing * i) + 1; Rectangle barRectangle = new Rectangle() { Margin = new Thickness(xCoord, height, 0, 0), Width = _barWidth, Height = 0, Style = BarStyle }; _barShapes.Add(barRectangle); Rectangle peakRectangle = new Rectangle() { Margin = new Thickness(xCoord, height - peakDotHeight, 0, 0), Width = _barWidth, Height = peakDotHeight, Style = PeakStyle }; _peakShapes.Add(peakRectangle); } foreach (Shape shape in _barShapes) { _spectrumCanvas.Children.Add(shape); } foreach (Shape shape in _peakShapes) { _spectrumCanvas.Children.Add(shape); } ActualBarWidth = _barWidth; }