Я несколько часов бился, чтобы оттенки не отличались друг от друга.
Наверное, всё таки нужно, чтоб они отличались?
Если так, то с таким количеством цветов - это очень тяжелая задача. Если пирог никак нельзя упростить, то в ход нужно пускать текстуры. Их можно комбинировать с цветами. Например, обычный красный = значение №1. Красный с белыми точками = значение №2. Красный с белыми полосками = значение №3. И т.д. Простых, но сильно различающихся текстур/узоров/паттернов очень много: точки, полоски, кружочки, квадратики, треугольники, любая геометрия в общем, плюс их тоже можно комбинировать.
Так обычно поступают, когда заботятся об accessibility (доступности) - не все могут различать хорошо цвета, поэтому нужно дублировать цветовой код вспомогательными элементами.