     void loopPlaying() {
         drawButtons();
         if (isShowingColors) {
+            const uint8_t progressCounterMaxBit = 2;
             if (currentStep == 0) {
                 buffer.drawText(stringBuffer.start()->load(PSTR("duino says ..."))->get(),16,28,buffer.rgb(255,128,32), &virtualDJ_5ptFontInfo);
             }
             if (currentStep <= currentLevel && currentStep > 0) {
-                const uint8_t w = 4 + progressCounter, h = 4 + progressCounter;
+                const uint8_t w = 4 + progressCounter, h = w;
                 uint8_t col = getColor(currentStep);
-                Button *button = getButton(col);
-                buffer.drawRect(48-w/2,32-h/2,w,h)->filledRect(button->getNormalColor());
-                buffer.drawText(stringBuffer.start()->put(currentStep)->get(),44,52,buffer.rgb(255,128,32), &virtualDJ_5ptFontInfo);
-            }
-            if (progressCounter++ > 30) {
+                Button* button = getButton(col);
+                uint8_t* btnColor = button->getNormalColor();
+                uint16_t rectColor = buffer.rgb(
+                                                btnColor[0] * progressCounter >> progressCounterMaxBit,
+                                                btnColor[1] * progressCounter >> progressCounterMaxBit,
+                                                btnColor[2] * progressCounter >> progressCounterMaxBit);
+                buffer.drawRect(48-w/2,32-h/2,w,h)->filledRect(rectColor);
+                buffer.drawText(stringBuffer.start()->put(currentStep)->put(":")->put(currentLevel)->get(),42,52,buffer.rgb(255,128,32), &virtualDJ_5ptFontInfo);
+                if (progressCounter == 0) {
+                    particleSystem.spawn(4|col, 48,32,800,800, 24);
+                    particleSystem.spawn(4|col, 48,32,800,-800, 24);
+                    particleSystem.spawn(4|col, 48,32,-800,-800, 24);
+                    particleSystem.spawn(4|col, 48,32,-800,800, 24);
+                }
+            }
+            if (progressCounter++ > (1<<progressCounterMaxBit)) {
                 currentStep += 1;
                 progressCounter = 0;
                 if (currentStep > currentLevel) {

    }

    void loopGameOver() {
        buffer.drawText(stringBuffer.start()->load(PSTR("game over"))->get(),16,28,buffer.rgb(255,128,32), &virtualDJ_5ptFontInfo);
        buffer.drawText(stringBuffer.start()->load(PSTR("score: "))->put(currentLevel)->get(),24,38,buffer.rgb(192,192,192), &virtualDJ_5ptFontInfo);
        if (progressCounter < 50) {
            progressCounter++;
        } else {

    const int width = on ? 8 : 6;
    const int height = on ? 24 : 26;
    const int xOffset = isEnabled ? 0 : ((x > 48) * 2 - 1) * 3;
    const uint16_t normalColor565 = duinoSays->buffer.rgb(normalColor[0], normalColor[1], normalColor[2]);

    duinoSays->buffer.drawRect(x - width / 2 + xOffset,y - height / 2,width,height)->filledRect(on ? pressedColor : normalColor565);
    if (on && ScreenButtonState::isButtonActivated(btn)) {
        isPressed = true;
        duinoSays->particleSystem.spawn(btn, x,y,x<48?4000:-4000,0, 8);
