Exemple #1
0
        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;
        }
Exemple #3
0
        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;
        }