-
-
Notifications
You must be signed in to change notification settings - Fork 1.3k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Mixxx palette Hotcue colors non-ideal #11045
Comments
It looks like you want to use integer truncation instead of rounding. If we round our palette properly to 6 bit will look like this: Te user can define any color and they should not be limited to 6 bits. |
It's not clear to me what you are suggesting exactly. I agree that the user should not be limited in what colors they choose, they take responsibility if the colors they choose look bad on their hardware, but our in-built palette should look good out of the box. The colors I propose also lead to the same result when truncating, but are "less invasive". |
You propose to change "0xbe" to "0xc0" in the green value. It is "1011.1110" and "1100.000" both are "11" after rounding and |
right, I tried rounding, the problem with that is that suddenly the lower bits of the other channels get rounded up and become significant enough to completely change the color to be unrecognizable compared to what its supposed to look like. |
Which color is affected? |
Ah I see It is hard to judge from a picture, but the related picture looks good. Here is what it means with values: Truncation + 0x1f dither
On my monitor the proposed colours do longer have an optimal distance to their neighbours. I have added the lightness numbers as well. You see that all colours have a different value. That was by the way the reason to not use hardware specific RGB codes in our fist version of the colour feature. |
Right, but even rounding with
Optimal distance in what terms? IIRC we optimized the colors to be usable for people with color vision deficiencies, which I don't think is related to your metric.
The picture is non-ideal, as I said, the purple and green are both just
I somewhat agree, but as far as I can tell, serato controllers have this standardized color schema, and this issue does not apply to the hardware directly but to the schema. So this fix likely applies to all recent serato controllers.
As outlined, the issue is likely not specific for my hardware but to all serato controllers. I don't understand why these slight changes to our color palette would be so severe. |
The problem with this issue it that it describes a solution and original not a problem which would be better. I am not certain if I already fully understand the issue. Did I get it right that the underlying issue can be summarized as Unfortunately, I cannot confirm it from the picture Changing the pallet color is strictly speaking an breaking API change. The pallet colors are picked to look good on a sRGB Monitor after a few loops of optimization. They are not intended to pass to the controller in the first place. The normal way is to use the ColorMapper to match them to a set of good looking colors on the controller. For me this is a solution for your controller which supports only 64 colors, with the majority of them too faint. You can select a set of good looking colors and the mapping script will work reasonable for all cures, from the Mixxx palette and imported from third party tools. I wonder how Serato DJ Pro itself solves the problem. Their greens are even darker than the one in the Mixxx palette. Ideal the a track imported from Serato should result to the same color on the button when loaded via Mixxx or via Serato. |
Sort of, I am hypothesizing that its rather "green and purple look faint all Serato controllers which implement this color encoding scheme", which is why I am proposing to make the adjustment in mixxx rather than the mapping script of my specific controller.
I'll try to retake the picture under better conditions when I get home later today. The original picture is so overexposed that the difference in lightness is only really noticeable because the actual bright colors have some bloom to them while green and purple don't.
So are they part of the API or strictly cosmetic?
Not really, we specifically designed the API so controller also gets access to the full color if it wants. For example when you can send the color in higher resolution using sysex messages (consult the novation launchpad programmers manual for an example). The ColorMapper on the other hand was created for controller that only have a limited palette with fixed IDs, (novation launchpad also is capable of that, or the Roland DJ 505 is also an example).
I assume they have a fixed palette which manufactures match to their hardware, that was also the very first implementation of hotcue colors in mixxx but we figured out pretty soon that that approach was too limited. |
I would also like to request input from @ronso0 here since IIRC they came up with the current colors in the palette. |
For me this is a controller issue, because your controller supports only 64 colors, where only a subset of them are fully saturated and not faint. Maybe the good looking colors are the 18 that are ins the Serato palette.
Not necessary, I trust you that you see the issue.
because they are the input of the ColorMapper. But this is only a minor detail, that should not prevent a solution.
your controller cannot do it. The main issue with this solution is that it is only a band aid for two colors in the MIxxx hotcue color palette. As a general purpose solution. If we assume that Serato has a fixed palette. We can be quite sure that the hardware is optimized for these. So a general purpose solution here would be to use the color mapper to map these colors. This will make any color good looking. |
Right, but I argue that this applies to a significant portion of serato controllers. Not just my hardware.
This is not what the color mapper was designed for IMO! ColorMapper is not just a glorified LUT. You're supposed to give it an approximation of the colors supported by your controller and it chooses the closest matching one. Hardcoding specific colors of the mixxx-inbuilt color-palettes is exactly what we wanted to avoid.
No controller likely can because our colors have 8-bit of precision per channel but even if you send each channel in a single "byte" per sysex, you only have 7-bits. The problem is that our palette does not work well with downsampling its colors! Which is an issue unrelated to my specific hardware.
Well it will only make the colors good looking which I select, to make appropriate use of the entire palette, I would map all colors, which would be built programmatically from the color schema, so then we're back to the beginning where the color mapper would select a suboptimal color because our palette is suboptimal. |
fyi autogenerating the colormapper palette upfront fixes green and purple, but now pink is being interpreted as white... |
Do you have access to a Serato installation? |
he/him is fine : ) IIRC I gave my 2ct when @Holzhaus refined the Mixxx track color palette. Which I think works well in the GUI. Besides that, I rarely use hotcue colors, and never on controllers, simply beause mine only have red LEDs (and blue pitch center indicators : ) so I can't judge the issue your discussing here.
If that is the issue we should indeed simply adjust the palette. |
Yes. |
Can you please create one or two files with cues of all colors? I am curious if our Serato palette is correct in terms of file tags or if we have only picked the visual appearance in the skin. |
I forgot about it yesterday and I'm not sure when I'll get around to it. Feel free to ping me if I don't get to it until Monday. |
Ok, no stress. For reference, here is our original discussion where we have optimized our palette, and verified it on various devices. It took some interaction to come to our current palette. I am afraid that your proposal leads to a regression, while it is only a band aid for our default palette. |
Are the cues of the loaded track created by Serato? |
Yes. The screenshot is for colors 9-16. |
Ah I see. I should have looked up our code before. In case of Serato there is already a mapping form the pure colors in the track metadata (and the controller) to the colors used in the GUI and in the Mixxx control objects:
I have just checked if the kSeratoDJProHotcueColorPalette matches the pure colors from kSeratoTrackMetadataHotcueColorPalette if it is rounded as proposed. GUI _____ Serato _____ Mixxx Unfortunately some cues leads to to the same colors in Mixxx and while in case of Serato there is always one color 0xCC for full brightness this is not the case for the resulting colors of Mixxx. This means some cues have a different color on the controller when it played via Mixxx. This must not happen IMHO. Conclusion, the simple rounding of Display colors does not work. Except white, I expect that the color mapper filled with the kSeratoTrackMetadataHotcueColorPalette works perfectly for the Mixxx cue colors because they have a good distance. So you probably only need to add white or a non dazzling gray that is than picked for white. |
You only confused me even more now. To me this is another indicator that our color palettes are suboptimal. |
What is the point of confusion? The last post is only about the Serato colors. We aim to follow Serato, so there is not much a point of optimizing colors in this case. |
Instead of adding the half value 0x1F, I have adjusted the rounding to match the Serato metadata values: |
So what are you suggesting? Should we change the mixxx color palette? Or should I change my mapping (well knowing that many others that map their serato controller encounter the same issue). |
I think we need a special color mapper for all
Problems:
Idea: (Not verified)
This should work for all serato cues. What do you think? |
I can't really give proper judgement here. Especially since this discussion now conflates two different topics (the colors of the tracks exported from serato and the colors produced on serato hardware with the mixxx color palette) each other. As the former case is very niche, I don't think it makes much sense to care about. This issue is only supposed to address the latter one (since I feel like its the most common case). As I already mentioned, the truncation would likely work best for many serato controllers if our color palette was just chosen with the truncation in mind. |
Do you mean the colors on the controller look bad if you connect a controller to Serato using the shipped Serato mapping and and create cues with Serato? |
That is interesting. Thank you. I see the following:
Conclusion: It confirms my table above, playing the same track with Serato shows the Serato colum while playing it with Mixxx it will show the Mixxx column using a simple trunkation: For the Mixxx palette it means via truncation:
|
This shows possible results of a Serato color mapper following Serato's ideas: mixxx -------- trunc ------- Serato GUI Serato Meta Tweaked version |
This has been produced with: Conclusion:
The alternative proposed solution to change the GUI colors for the Mixxx palette does only help for the Mixxx palette. I think the source of this issue is that our color CO caries the GUI colors and not the stored colors. We can do the same for the Traktor and Rekordbox colors. What do you think? |
I disagree. The ColorMapper is supposed to decouple the hardware from the actual palette colors. I strongly object to any proposal that involves forming any kind of dependency between the colors available in mixxx and the colors that can be displayed by the controller (this is also the reason for my previous outrage where you suggested our palette colors are part of our API). The controller is simply supposed to declare what colors it can display and ColorMapper chooses the closest matching one. I'm still getting confused why you relate this to the way serato cue colors are being written into the metadata or how they are translated when imported. |
I think we've been talking past each other for the last 7 days. So let me rephrase my problem: What exactly is the problem you are talking about? |
We have two problems:
Did you look into the linked branch? IMHO it solves the problem entirely. If not please describe the case where it fails. |
I somewhat disagree with you. The notion of truncating the colors for sending to the controller is universal across controller hardware. It seems to be that truncating to two bits is common, but hardware could truncate more or less bits. Since two bits is common, my fix is two make sure our default color palette saturates the two upper bits in their dominant channel.
Can you elaborate on? As I said, controllers are not supposed to have a direct dependency on palette colors because those may be subject to change.
I disagree with the assumption that only a subset of the colors are useful. It all depends on whats done with colors, so it depends on the palette being used.
Roundtrip from/through what exactly?
I'll try to ASAP. |
I read the code in your branch and I don't know what to do with it to be honest. I don't understand why you truncate like you do, I don't understand why you are converting a color from the mixxx palette to a stored serato metadata color with a function that was only supposed to be used in the serato palette (judging by its name and usage examples). Whatever issue your code solves, I consider it a non-issue. |
I can confirm that. The question is however how the device manufacturer recreates the missing bits. We control this using a color mapper populated with the manufacturer full resolution color.
This is true for green, but our purple has already a main channel fully saturated. We also have intentionally picked colors with different saturation/brightness to make them optimal distinguishable an human recognisable/nameable. We have explicitly not choosen fully saturated colors for the GUI.
Oh, this was my takeway from your posts. For my understanding all not fully saturated colors are not suitable for you. So why you dismiss green green than?
After migration to from Serato to Mixxx and using the trunkated colors, all you cues are looking different on the controller. Some cue buttons are quite dark and colors are even swapped see #11045 (comment)
That is an unfair judgement, without understanding the code. We have a fixed table to turn GUI colors into controller colors for Serato. The proposed trunkation does not work, so we use a lookup table in the existing code. My code now matches all colors from our GUI domain to the closest Srato color also from the GUI domain. Than it uses the lookup table to get the matching Controller color. Since you think there are more colors usefull, we may add them to this model as well. Currently at least white and pink are missing. |
Well since purple is a secondary color, its "main channel" really rather meant both the red and the blue channel (and the red channel is inadequately saturated).
The issue I have with the green (as well as the purple) is that they both seem like they're fully saturated, but aren't when truncated. The less saturated/dimmer colors are still useful on the controller (for example when the color palette has a green which is really that dimm (the serato palette is an example of that )).
I don't think thats really a problem since as I pointed out (see the three pictures), these colors already look worse when they come from serato compared to when they come from mixxx.
I apologize for the tone.
I don't really understand this. IIUC we convert the exported serato colors to the gui serato colors on import. When those are truncated, the colors produced by the controller are also non-ideal? I'd say thats then also an issue with the serato color palette. Creating a special mapping that irons out these deficiencies doesn't really help, nor does it work really in the general case where a library contains tracks with colors from different palettes. The problem with the serato gui colors is really a problem in their palette (that is evident by the fact that even serato outputs three different shades of green as the exact same color to the controller). Because of that, I don't see any reason why we should try to perfect this niche case when even serato hardware coupled with serato software creates worse results. |
It seems a common way of encoding an led color as midi is by taking the most significant two bits and packing that into the lower six bits of the velocity byte. Our color palette largely works for that, though the colors for green and purple are not ideal. I'd like to propose to slightly correct those colors so when they're truncated for sending to the controller, the appropriate bits are set.
Concretely, I'd like to change the green from
![green comparision](https://user-images.githubusercontent.com/12380386/200341069-e09243a7-e164-4e46-a81d-bfdcf98e2ff5.png)
![purple comparision](https://user-images.githubusercontent.com/12380386/200341224-0dabbb53-9964-4e97-853f-850a19f6fc8b.png)
#32be44
to#32c044
and purple from#af00cc
to#c000cc
. I believe both changes are imperceptible enough to go unnoticed by the average user and also do not degrade the experience for people with color vision deficiencies.The text was updated successfully, but these errors were encountered: