-#define random_rgb() rand() /* ~ (0...255) << 7 */
-#define random_time() (rand() >> 7) /* 0...255 */
-#define min_incolor_time() 100
-#define min_fade_time() 100
+#define STEP_SIZE 64 /* ms */
+#define MIN_INCOLOR_STEPS 16
+#define MAX_INCOLOR_STEPS 57600
+#define MAX_FADE_STEPS 480
+#define reset_steps() do { incolor_steps = 1; fade_steps = 0; } while (0)
+#define rand_u8() (rand() >> 7)
+#define rand_u16() (rand() << 8 + rand() >> 7)
+#if 1
+#define rand_incolor_steps() MIN_INCOLOR_STEPS * 2
+#define rand_fade_steps() 16
+#else
+#define rand_incolor_steps() (MIN_INCOLOR_STEPS + rand_u16() % \
+ (MAX_INCOLOR_STEPS - MIN_INCOLOR_STEPS))
+#define rand_fade_steps() (1 + rand_u16() % MAX_FADE_STEPS)
+#endif
+#define leds_set(r,g,b,w) rgb_set((r).value >> 8, \
+ (g).value >> 8, \
+ (b).value >> 8, \
+ (w).value >> 8)
+
+typedef struct {
+ unsigned value;
+ unsigned increment;
+ unsigned char remainder;
+} led_t;
+#define INIT_LED { 0, 0, 0 }