/// <summary>
        /// The program Loop: CTRL+C to stop it properly
        /// </summary>
        /// <param name="characteristic"></param>
        static void Loop(GattCharacteristic characteristic)
        {
            SoundListener soundListener = new SoundListener();

            Console.CancelKeyPress += delegate(object sender, ConsoleCancelEventArgs e) {
                e.Cancel    = true;
                keepRunning = false;
            };
            LogHelper.Ok("Program running. Press CTRL+C to stop");

            #region variables (prevents reallocation)

            // Rectangle in the middle of the screen
            Rectangle rect      = new Rectangle(1920 / 4, 1080 / 4, 1920 / 4 * 2, 1080 / 4 * 2);
            String    colorCode = "";
            Color     color;
            int       soundLevel;
            String    brightness;
            String    textToWrite;

            #endregion

            #region configuration

            bool   sensitiveToBass  = Configuration.audioSensibility == Configuration.AudioSensibility.BASS_LEVEL;
            bool   dynamicSmoothing = Configuration.smoothingMode == Configuration.SmoothingMode.DYNAMIC;
            bool   valueSmoothing   = Configuration.smoothingMode == Configuration.SmoothingMode.VALUE;
            double smoothness       = Configuration.smoothingValue;

            #endregion

            int current = -1; // Smooth brightness variation
            int cpt     = 0;  // Used to know when to read the screen's pixels
            soundListener.ListenForBass(sensitiveToBass);

            while (keepRunning)
            {
                if (Configuration.audioSensibility != Configuration.AudioSensibility.NONE)
                {
                    soundLevel = (int)((sensitiveToBass ? soundListener.GetBassLevel() : soundListener.GetSoundLevel()) * 100f); // Between 0.0f and 100.0f

                    if (current == -1)
                    {
                        current = soundLevel;
                    }

                    if (dynamicSmoothing)
                    {
                        current = (current + soundLevel) / 2;
                    }
                    else if (current < soundLevel && valueSmoothing && smoothness > 0)
                    {
                        current = Math.Min((int)(current + 100 / smoothness), soundLevel);
                    }
                    else if (smoothness > 0)
                    {
                        current = Math.Max((int)(current - 100 / smoothness), soundLevel);
                    }
                    else
                    {
                        current = soundLevel;
                    }

                    // Format: 7e 00 01 brightness 00 00 00 00 ef
                    // brightness: 0x00-0x64 (0-100)
                    // So we need to convert the soundLevel to hex so that 100.0f is 0x64 and 0.0f is 0x00
                    brightness  = (current).ToString("X");
                    textToWrite = "7e0001" + brightness + "00000000ef";
                    _           = BleUtility.WriteHex(textToWrite, characteristic); // we don't want it to be blocking
                }

                if (Configuration.colorSensibility != Configuration.ColorSensibility.NONE)
                {
                    // We don't want to analyze pixels as fast as we check for the sound level
                    cpt++;
                    if (cpt == 10)
                    {
                        new Thread(() =>
                        {
                            color = ScreenUtils.CalculateAverageScreenColorAt(rect);

                            if (color.GetBrightness() >= 0.85f)
                            {
                                // white
                                colorCode = "86";
                            }
                            else if (color.GetHue() < 25 || color.GetHue() >= 330)
                            {
                                // red
                                colorCode = "80";
                            }
                            else if (color.GetHue() >= 25 && color.GetHue() < 65)
                            {
                                // yellow
                                colorCode = "84";
                            }
                            else if (color.GetHue() >= 65 && color.GetHue() < 180)
                            {
                                // green
                                colorCode = "82";
                            }
                            else if (color.GetHue() >= 180 && color.GetHue() < 200)
                            {
                                // cyan
                                colorCode = "83";
                            }
                            else if (color.GetHue() >= 200 && color.GetHue() < 250)
                            {
                                // blue
                                colorCode = "81";
                            }
                            else if (color.GetHue() >= 250 && color.GetHue() < 330)
                            {
                                // magenta
                                colorCode = "85";
                            }

                            _ = BleUtility.WriteHex("7e0003" + colorCode + "03000000ef", characteristic);
                        }).Start();

                        cpt = 0;
                    }
                }

                Thread.Sleep(50);
            }

            soundListener.Dispose();
        }