 	current->blue  += stepToward(target->blue,  current->blue,  step_size);
 }
 
+/*
+ * As targeted_tick except the minima and maxima are given in HSV coordinates.
+ * This is a very lazy bit of copypasta from targeted_tick -- only the
+ * constraints are actually HSV colors; the current and target colors are still
+ * RGB and the steps occur in RGB space.
+ */
+void hsv_targeted_tick(Ticker *t, unsigned long tick)
+{
+	// speed_adjust keeps us from ticking on certain cycles
+	if (tick % (1 << t->speed_adjust)) {return;}
+
+	TickerRgb* current = &t->current;
+	TickerRgb* target  = &t->targets[0];
+	TickerRgb  minima  = t->targets[1];
+	TickerRgb  maxima  = t->targets[2];
+	int step_size = t->offset;
+
+	if (   current->red   == target->red
+		&& current->green == target->green
+		&& current->blue  == target->blue)
+	{
+		// We've reached the target! Pick a new one. We're lying here and using
+		// the "red", "green", and "blue" data members of minima and maxima for
+		// "hue", "saturation", and "value" respectively.
+		double hue        = (double)random(minima.red,   maxima.red)   / (double)1023;
+		double saturation = (double)random(minima.green, maxima.green) / (double)1023;
+		double value      = (double)random(minima.blue,  maxima.blue)  / (double)1023;
+		*target = hsv2rgb(hue, saturation, value);
+
+		// And just for fun let's also randomize the fade speed!
+		t->offset       = skew(random(1, 100), 5, 50, 100);
+		t->speed_adjust = random(0, 1);
+	}
+	// Still working towards the target. Take a step in the right direction
+	current->red   += stepToward(target->red,   current->red,   step_size);
+	current->green += stepToward(target->green, current->green, step_size);
+	current->blue  += stepToward(target->blue,  current->blue,  step_size);
+}
+
 /*** HELPER FUNCTIONS ***/
 
 /*

	sb.begin();
	sb.show();

	// Set up mode-change button
	pinMode(BUTTON_PIN, INPUT_PULLUP);
	attachInterrupt(digitalPinToInterrupt(BUTTON_PIN), trigger_change, FALLING);

	// Initialize tickers
	mode_stealth();

 * MODE SETUP FUNCTIONS *
 ************************/
void trigger_change() {
	if (millis() - switch_last_triggered > 600) {
		switch_last_triggered = millis();
		mode_change_requested = 1;
	}
}
