public override void Dispose()
 {
     VisualizersData.Clear();
     foreach (var item in Brushes)
     {
         item.Value.Brush.Dispose();
     }
 }
 private void Initialize(AudioPlayer audioPlayer, SpectrumVisualizer element)
 {
     Task.Run(() =>
     {
         var track         = audioPlayer.CurrentlyPlaying;
         var callerElement = element;
         var result        = audioPlayer.CalculateSpecterumData(callerElement.BandCount);
         lock (VisualizersData)
         {
             if (!VisualizersData.TryGetValue(track, out List <TimeSpectrumData> data))
             {
                 VisualizersData.Add(track, result);
             }
             else
             {
                 VisualizersData[track] = result;
             }
         }
     });
 }
        protected override void InternalRender(SpectrumVisualizer element, AudioPlayer audioPlayer, DrawGraphicsEventArgs renderArgs)
        {
            if (audioPlayer.CurrentlyPlaying != CurrentlyPlaying)
            {
                CurrentlyPlaying = audioPlayer.CurrentlyPlaying;
                Initialize(audioPlayer, element);
            }

            if (!VisualizersData.TryGetValue(audioPlayer.CurrentlyPlaying, out List <TimeSpectrumData> spectrumData))
            {
                return;
            }

            if (!(spectrumData?.Any() ?? false))
            {
                return;
            }

            var currentTime = audioPlayer.CurrentTime.TotalMilliseconds;
            TimeSpectrumData playingSpectrumPart = null;

            for (int i = 0; i < spectrumData.Count - 1; i++)
            {
                if (spectrumData[i + 1].Time > currentTime && spectrumData[i].Time <= currentTime)
                {
                    playingSpectrumPart = spectrumData[i];
                    break;
                }
            }
            playingSpectrumPart = playingSpectrumPart ?? spectrumData[spectrumData.Count - 1];

            var gfx = renderArgs.Graphics;

            foreach (var drawer in SpectrumDrawers)
            {
                if ((drawer.Key & element.VisualizationType) == 0)
                {
                    continue;
                }

                float startingPosition = element.BandSpace;
                if (element.VisualizationType == SpectrumVisualizationType.Bottom ||
                    element.VisualizationType == SpectrumVisualizationType.Top)
                {
                    startingPosition += element.Location.X;
                }
                else
                {
                    startingPosition += element.Location.Y;
                }

                for (int index = 0; index < playingSpectrumPart.SpectrumData.Length; index++)
                {
                    var band = playingSpectrumPart.SpectrumData[index];
                    if (!Brushes.TryGetValue(element, out IBrush brush))
                    {
                        brush = gfx.CreateSolidBrush(element.BandColor.ToOverlayColor());
                        Brushes.Add(element, brush);
                    }

                    drawer.Value(element, band * element.Multiplier, startingPosition, gfx, brush);
                    startingPosition += element.BandWidth + element.BandSpace;
                }
            }
        }