Great question. The answer is yes, there are a whole bunch of methods defined on the CRGB class that let you manipulate it as ‘a color’, instead of a collection of three channel values (R, G, B). This page https://code.google.com/p/fastspi/wiki/CRGBreference has reasonably up-to-date documentation.
As for your particular question, “How can I cut the brightness of a CRGB by half, in a single step?”, check out https://code.google.com/p/fastspi/wiki/CRGBreference#Dimming_and_Brightening_Colors
Here are some ways you could do it; I’m going to assume that “leds[i]” is the color in question
// Use the “/=” operator to divide by a constant
leds[i] /= 2; // divide each channel by two
// Use fadeToBlackBy(X) which takes a fade value
// from 0 (no fading) to 255 (total fading)
leds[i].fadeToBlackBy( 128); // fade by 50%
// Note repeatedly using this will fade to black
// Same as leds[i].nscale8( 255 - X );
// Use fadeLightBy(X) which takes a fade value
// from 0 (no fading) to 255 (maximum fading)
leds[i].fadeLightBy( 128); // fade by 50%
// Note repeatedly using this will NOT fade to full black!
// Same as leds[i].nscale8_video( 255 - X);
// Use operator %=, which scales light down
// to a ‘percentage’ of the old value, except that
// the ‘percentage’ is from 0-255, not 0-99:
leds[i] %= 128; // fade to 50% of previous value
// Same as leds[i].nscale8_video( X );
There are a bunch of other “color math” functions that operate on a whole CRGB at a time; most of them are smaller and faster than writing the code out ‘longhand’. If you find a case where that’s not true, please let me know. And if you find a ‘missing function’, something that you’d expect given what we already provide, please speak up about that too.
Finally, please let me know whether or not this helps you get where you wanted to go, and if the methods provided make your code faster to write. That’s one of the things we’re shooting for.