 {
 	int16_t hue = ((tick >> t->speed_adjust) + t->offset) % 360;
 	t->current = hsv2rgb((double)hue, 1.0, 1.0);
+}
+
+/*
+ * Picks a random color and switches to it.
+ *
+ * By default it switches every tick. Slow this by 2^n by setting Ticker's
+ * speed_adjust to n.
+ *
+ * This tick function does not use any targets
+ */
+void random_tick(Ticker *t, unsigned long tick)
+{
+	if (tick % (1 << t->speed_adjust)) {return;}
+	t->current = {red: random(0,1023), green: random(0,1023), blue: random(0,1023)};
 }
 
 /*

	attachInterrupt(digitalPinToInterrupt(BUTTON_PIN), trigger_change, FALLING);

	// Initialize tickers
	mode_nebula();
}

void loop()

	// Use targeting tickers constrained to be colors with strong blue channels
	// to make a flickering "nebula" effect.
	for (int i = 0; i < NUM_LEDS; ++i) {
		Tickers[i] = Ticker(&targeted_tick, 3, 0, i * 5 + 1);

		Tickers[i].targets[0] = {red: random(0,1023), green: random(0,1023), blue: random(0,1023)};
		Tickers[i].targets[1] = {red: 0, green: 0, blue: 511};
		Tickers[i].targets[2] = {red: 1023, green: 1023, blue: 1023};
	}
}

void mode_sparkle()
{
	for (int i = 0; i < NUM_LEDS; ++i) {
		Tickers[i] = Ticker(&random_tick, 0, 2, i);
	}
}

void mode_christmas_lights()
{
	for (int i = 0; i < NUM_LEDS; ++i) {
		// Slow by 2^6
		Tickers[i] = Ticker(&cycling_tick, 4, 6, i);

		//TODO: Adjust these values to taste to simulate christmas lights
		Tickers[i].targets[0] = {red: 1023, green:    0, blue:    0}; // Red
