protected override RGBValue my_callback(RGBValue rgb_template, byte[] specArray, int min_slider, int max_slider, int min_trigger)
        {
            byte[] rgb = new byte[colors];

            // Now convert these 16 lines (from 0 to 255) to 3 RGB-Colours (from 0 to 255)
            byte right = (byte)(max_slider + 1);
            byte left  = (byte)min_slider;

            byte stepsPerColor = (byte)((right - left) / 3);

            for (byte rgbIndex = 0; rgbIndex < colors; rgbIndex++)
            {
                for (int i = left + (stepsPerColor * rgbIndex); i < left + (stepsPerColor * rgbIndex) + stepsPerColor; i++)
                {
                    // Only take values that are higher than that value given by the vertical slider
                    if (specArray[i] > min_trigger)
                    {
                        rgb[rgbIndex] += specArray[i];
                    }
                }

                rgb[rgbIndex] = (byte)(rgb[rgbIndex] / stepsPerColor); // Calculate Average
            }
            rgb_template.SetArray(rgb);
            return(rgb_template);
        }
        protected override RGBValue my_callback(RGBValue rgb_template, byte[] specArray, int min_slider, int max_slider, int min_trigger)
        {
            bool with_avg = true;

            byte right_max = (byte)(max_slider + 1);
            byte left_max  = (byte)min_slider;
            int  diff      = (right_max - left_max) / colors;
            byte peak_volume; // TODO slider too much to the right -> exception

            byte[] rgb = new byte[colors];

            int left;
            int right;

            for (int i = 0; i < colors; i++)
            {
                left  = left_max + (diff * i);
                right = left_max + (diff * (i + 1));

                int maximumIndex = get_maximum_peak_index_range(left, right, specArray);

                if (with_avg)
                {
                    // To avoid OutOfBounds
                    if (maximumIndex <= left)
                    {
                        maximumIndex += 1;
                    }
                    else if (maximumIndex >= right)
                    {
                        maximumIndex -= 1;
                    }
                    // TODO maybe too much casting right now
                    peak_volume = (byte)((int)((int)specArray[maximumIndex - 1] + (int)specArray[maximumIndex] + (int)specArray[maximumIndex + 1]) / 3);
                }
                else
                {
                    peak_volume = specArray[maximumIndex];
                }
                if (peak_volume < min_slider)
                {
                    peak_volume = 0;
                }

                rgb[i] = peak_volume;
            }

            rgb_template.SetArray(rgb);
            return(rgb_template);
        }
        protected override RGBValue my_callback(RGBValue rgb_template, byte[] specArray, int min_slider, int max_slider, int min_trigger)
        {
            byte[] rgb = new byte[colors];

            // Now convert these lines (from 0 to 255) to 3 RGB-Colours (from 0 to 255)
            int right = ((int)max_slider) + 1;
            int left  = (int)min_slider;

            int rCount = 0, gCount = 0, bCount = 0;

            for (int i = left; i < right; i++)
            {
                if (i < 5)
                {
                    rgb[0] += specArray[i];
                    rCount++;
                }
                else if (i < 10)
                {
                    rgb[1] += specArray[i];
                    gCount++;
                }
                else
                {
                    rgb[2] += specArray[i];
                    bCount++;
                }
            }
            if (rCount != 0)
            {
                rgb[0] = (byte)(rgb[0] / rCount);
            }
            if (gCount != 0)
            {
                rgb[1] = (byte)(rgb[1] / gCount);
            }
            if (bCount != 0)
            {
                rgb[2] = (byte)(rgb[2] / bCount);
            }

            rgb_template.SetArray(rgb);
            return(rgb_template);
        }
        protected override RGBValue my_callback(RGBValue rgb_template, byte[] specArray, int min_slider, int max_slider, int min_trigger)
        {
            byte right_max = (byte)(max_slider + 1);
            byte left_max  = (byte)min_slider;
            int  diff      = 5; // Slidermax / colours ;  TODO change in code! // (right_max - left_max) / colors;
            byte peak_volume;

            byte[] rgb = new byte[colors];

            int left, search_left;
            int right, search_right;

            for (int i = 0; i < colors; i++)
            {
                left  = left_max + (diff * i);
                right = left_max + (diff * (i + 1));

                if (left < left_max)
                {
                    search_left = left_max;
                }
                else
                {
                    search_left = left;
                }
                if (right > right_max)
                {
                    search_right = right_max;
                }
                else
                {
                    search_right = right;
                }

                int maximumIndex = get_maximum_peak_index_range(search_left, search_right, specArray);

                if (maximumIndex < left || maximumIndex > right)
                {
                    rgb[i] = 0;
                }


                if (with_avg)
                {
                    // To avoid OutOfBounds
                    if (maximumIndex <= left)
                    {
                        maximumIndex += 1;
                    }
                    else if (maximumIndex >= right)
                    {
                        maximumIndex -= 1;
                    }
                    // TODO maybe too much casting right now
                    peak_volume = (byte)((int)((int)specArray[maximumIndex - 1] + (int)specArray[maximumIndex] + (int)specArray[maximumIndex + 1]) / 3);
                }
                else
                {
                    peak_volume = specArray[maximumIndex];
                }
                if (peak_volume < min_trigger)
                {
                    peak_volume = 0;
                }

                rgb[i] = peak_volume;
            }


            rgb_template.SetArray(rgb);
            return(rgb_template);
        }