I wonder it if might be possible to get better colour resolution by pulse-width modulating the LED drivers.
Just thinking about getting better than 16-bit colour rendition, let's guess the current scan rate is 80Hz, each column is active for 12.5ms, and the current drivers can modulate the LED brightness to 64 levels (according to the LED2472G datasheet) - probably with some mapping to get matching brightness levels from the RGB outputs (that will account for the sensehat's 5,6,5 bits of RGB resolution) by varying the current in the LED2472 driver.
However let's say that within the 12.5ms a column is active, the output was further updated on/off at four possible points that would give some more bits of brightness control - for the Green which has six bits resolution the first level that produces any ouput is 4, but I could get a level 1 by outputting 4 for a quarter of the active time, similarly 2 as a half of four, and 3 as a quarter of 12. I would get level 5 using a quarter of 20, 6 by a half of 12, couldn't do level 7, 9 by a quarter of 36, 10 by a half of 20, 11 by a quarter of 44, and so on. Gets harder for higher numbers, but this scheme does seem like it could give more control at low brightness. If instead of having four points we had eight, that would mean more levels were possible, for example 7 would be an eighth of 56.
Or instead of on-off, could modulate between two levels. So you could get level 7 (average) by displaying 8-8-8-4 - that would make it easier to work out the displayed values because with this approach the actual output levels are the mutliple of four below and above, in this example. I suppose this is just averaging at a higher scanning rate, no indication that the LED driver can't do it, AFAICT the update rate is determined by how fast the AVR can drive it.
Any AVR experts out there want to try updating the display code https://github.com/raspberrypi/rpi-sense
? At the moment the routines output the 5- or 6-bit current value then wait for the scan time to finish. The scan rate would have to be quadrupled, or octupled, which should just be an update to the timer initialization, more complex is working out how each requested value maps to actual drive outputs, looks that that will need some extra data generating. An easy way of doing it for the two-level modulation, assuming the outputs are already straight 8-bit values per LED, would be to increment the value each time it is output. So 7 would become 8/9/10 on the following outputs, automatically outputting the correct average of 4/8/8/8. Makes sense to me, anyway.