Max 9: Old patchers open with new colors
All my existing patchers open with this terrible new dark look. I hate drawing on black paper and the first thing I did with Max 9 was to make it bright as it was.
But what about the existing patchers? Can I make them look friendly again without having to set the colours for each one individually?
Sounds like you would like to change the theme.
We're still working on updating all the documentation, but this is available here in Max 9, rather than the interfaces section.
The "max8" or "dark-over-light" themes should give you something close to what you're used to in Max 8.

Ah yes, that's usable.
Thank you!
Hi,
is there a simple way to do it from the patch, to avoid changing the theme when opening old patches, or so that the help patches of the old Distrib open in a readable way, with the max 8 skin?
thanks
Hello!
What about colour differentiation between max and RNBO. It seems like all objects get the same colour treatment. I find the colour switch to RNBO helpful. Is there a way to get this to work in Max 9?
Thanks!
S
When you open a RNBO patch
you can open inspector and change the color to differentiate from MAx
but this are local so you have to change each time you make a new RNBO
can't fidn a way to do this in the preferences or programmatically (this patcher) or Universal

Thank you Wil! I can give that a try!
GREG BELLER salut Greg, did you find a way by any chance?
I have a public package with bpatcher modules (alla Vizzie / BEAP) and hundreds of patches of documentation and examples, with a LOT of text that cannot be easily inverted like black or white, either greyscale or some flashy color highlights. These become a nightmare for readability with the dark setting, especially for people with eye problems like myself.
JOSHUA KIT CLAYTON
Hi Joshua, Is there an easy way to initialize a single patch to open with a Max 8 template when opened in Max 9 (and just stay the same for Max 8 users) ?
I'd rather add a single object with a loadbang in 400+ patches than redesign my whole packages color coding entirely, that was years of work and would at least take months to fix by hand ☹️
Thanks in advance !
Hi WIL
Sorry I just saw your reply (somehow I never got the notif)
Unfortunately that's not a great solution I'm afraid. The setting is global right?
For my own usage it's fine, but my package is public. I cannot change my (modest few dozen…) users' color settings without telling them. It would be a bit ridiculous.
Is there any way to do this but at the level of the patch?
Again I don't mean to change my users' whole Max color experience, only the patches I made, and also a lot of bpatchers alla Beaper/Vizzie (interface set in presentation mode)
JOSHUA KIT CLAYTON Since you mention some things are being documented, do you see any plan for color theme control at the patch level?
Otherwise is this a reasonable feature request?
I have the same question: How to change the color theme at the level of the patch?
Anything new on the color theme front in Max 9?
Some documentation? Video tutorials with tips and tricks to help transition?
I don't think I've seen any public mention of that big dark annoying update, and it's one of the main reason I practically didn't touch Max 9 since I bought it (and that was quite a pricey update…!)
as mentioned if you don't like the default dark color them or the syntax highlighting you can change the theme and disable highlighting in your preferences. If you want to remove that choice from users of your patches then you need to override the default colors of your UI elements with your own colors.
As mentioned beforer : changing the default dark color theme back to "Max 8" doesn't make sense for shared packages. I cannot expect my users to change their theme every time they open my patches and switch back right after. That's ridiculous.
The dark theme is not only a problem of dynamic Max objects. What about if my package uses dozens of UI elements relying on fixed png images for instances? What happens to them?
What about color balance beyond black and white? Dark grey doesn't become light grey in that system apparently… I didn't find any answer on this in the doc ;(
What about lifelong users with lifelong visual impairment? (like myself)
It's not about liking or not. I used dark background quite often in certain patches. But that was always a CHOICE…!
sorry I'm not sure what you're asking that I'm not answering? If you want to lock down your color scheme then you must provide non-default values to your colors. If you want your users to have a choice of color scheme based on their theme setting then you keep the defaults as is.
Sorry I don't understand. Based on whose theme setting?
How do I provide non default values for every single objects in hundreds of patches? (my package has about 900 maxpats / maxhelps)
if you want help stripping non-default color values from a repository of patches, we can offer some guidance there.
That would be fantastic. But that would require to compare each patch side by side in Max 8 and Max 9 with human eyes, that's a lot of work I cannot pay…
Again, it's okay I made my peace with it, I will fix my patches.
But I was asking for documentation, for advices. Like how to do things. Because it's NOT clear where are the informations.
It seems that Max 9 is now requiring to know more about those color issues from now on.
Where can I find tutorials about them? Even better, a video explaining those in detail would be amazing
Thanks in advance !
As previously mentioned on this thread, this is not a new issue. It is only brought more to the foreground now that the default theme has changed. Sorry for the inconvenience. While it might seem like an arbitrary change without consideration of historical defaults, actually, lots of time and energy went in to try and make themes work well for users of all needs and preferences. We started in 8.6 building robust theming support with many more themes available, including the often requested dark objects on dark patcher background theme as well as the ability for Max to follow Live themes. In Max 9 we changed the default theme as encouraged by many users.
In general, patches which make assumptions about theme colors need to be changed to be robustly theme compatible and/or theme agnostic. This has always been the case, but has traditionally been masked by no officially supported theme with a dark background color prior to Max 8.6.
I'll try to outline a variety of options and recommended strategies:
For your own personal projects, you can simply change the theme to your preferred style. For example the "max8" or "dark-over-light" themes will most closely match default Max 8 theme behavior.
For patchers which are intended to be shared with others, there are a number of strategies outlined in the Max 8.6 documentation (some of this has not yet been migrated in the Max 9 documentation reworking and this thread is a helpful reminder to us to work on that). I'll quote here for convenience. In order to make a device properly themed for Ableton (or Max) and robust in regard to theme changes, one of the following options should be followed for each UI element in your device (or patch):
Use the default colors for all of a given UI element's colors. This should always follow the theme according to default theming behavior. If you require always dark or always light colors, please use appropriate dynamic colors that match these needs (see option #2).
Use appropriate dynamic colors for all colors in any given UI element. This is especially important for any foreground and background colors. This allows for robust theme following, with different rules than the standard theme following behavior.
Use fixed custom colors for all colors in any given UI element. This is especially important for any foreground and background colors. In this case, the colors will not adapt based on themes, but they will always use the authored colors and look the same under all themes.
From your description, it sounds like your situation with desired fixed colors is best suited for strategy #3 to be theme agnostic (avoiding dynamic colors and general theme compatibility). You can handle this by setting the default colors in your patcher's patcher inspector, or by making use of patcher styles.
If on the other hand you would like to try using strategy #1, you can in each of your patchers use the "Object -> Set Colors to Default Values" with no objects selected and it will be applied to your entire patcher.
For any of the above 3 strategies, you can use javascript to iterate through your patcher and make changes to set specific colors or set colors to default values as desired. Below I'll include an example that could be used as a basis for further customization that you could place within a patch and execute to manage your colors.
function bang()
{
force_patcher_colors(this.patcher);
// applydeep will call the function on all objects
// and recursively descend into subpatchers
this.patcher.applydeep(apply_colors);
}
function apply_colors(o)
{
var p = o.subpatcher();
if (p) {
force_patcher_colors(p);
}
return true;
}
function force_patcher_colors(p)
{
p.setattr("style", "");
p.setattrdefault("locked_bgcolor");
p.setattrdefault("editing_bgcolor");
p.setattrdefault("accentcolor");
p.setattrdefault("bgcolor");
p.setattrdefault("bgfillcolor");
p.setattrdefault("color");
p.setattrdefault("elementcolor");
p.setattrdefault("selectioncolor");
p.setattrdefault("patchlinecolor");
p.setattrdefault("textcolor");
p.setattrdefault("textcolor_inverse");
p.setattrdefault("clearcolor");
p.setattrdefault("stripecolor");
p.setattrdefault("bubble_bgcolor");
p.setattrdefault("bubble_outlinecolor");
p.setattrdefault("syntax_attrargcolor");
p.setattrdefault("syntax_attributecolor");
p.setattrdefault("syntax_objargcolor");
p.setattrdefault("syntax_objectcolor");
// alternatively could set colors explicitly
// e.g. make the patcher bgcolor and comment
// text color fixed regardless of theme defaults
//p.setattr("locked_bgcolor", [0.7, 0.8, 0.8, 1.]);
//p.setattr("editing_bgcolor", [0.7, 0.8, 0.8, 1.]);
//p.setattr("textcolor", [0.4, 0.1, 0.1, 1.]);
return true;
}
Hopefully this information is helpful.
Oh this is all very helpful, thank you so much Joshua ! I will study the script carefully. The few guidelines are great, exactly what I was hoping for but could never find by myself.
The other part of my question was about non-Max visual elements, coming mostly as .png loaded pictctrl. I designed all my UI elements's colors based on the old default.
Are there any plan to help manage those somehow? Any chance to see some optional "invert color" that could follow those theme changes, at least to facilitate certain objects in the Max 8->9 transitions? (I imagine that's not realistic, but still need to ask) Otherwise I can just imagine to load a different image based on version detection, but that will just double the amount of media in my package. That's already 2Mb on a 50Mb package…
Also I must mention, most of my modules interact with or contain several bach.score / bach.roll objects which will always be full white background. That's how music scores work unfortunately. The older beige background had rather light contrast with the score's white, easy on the eye. But now white on black is extremely violent and tiring. I have trouble to imagine Max users working in bach and computer-aided composition daily will not switch to the Max 8 theme to save their eyeballs…
As for white on black scores I do like them myself, and I tried them with several musicians for generative scores projects over the last years, most of them think they are cool but they are too tiring to look at for long periods…
I attach screenshots before and after of a small subset of my bpatcher modules, so demonstrate the problem. As someone with considerable eye problems, working on this package for 10 years this year, it's a real heartbreaker, just to imagine dealing with these in the years to come.
Finally : you wrote "In Max 9 we changed the default theme as encouraged by many users."
Again as a almost 20 years user (since Max 4.6) I didn't participate in that conversation. All the people I ask are also annoyed by this, especially library / package makers, who often spend years building a readable documentation for complex topics. All things considered, I wish there was much more transparency on this from the get go, and some more public consultation of paying users on this particular turn. The fact this was not even acknowledged when Max 9 came out seems like admitting this was not a great idea to begin with.


Hi Julien,
Unfortunately, there are no automatic options for managing PNG based assets. It sounds like for your application, forcing a light background in the patcher could make the most sense. Beyond your bpatchers chainging their colors to not be the theme default, you can even have one of your bpatchers automatically change the colors of the parent patcher to be harmonious with your needs. This way patches that make use of your patchers could enforce compatible colors, while leaving the user's overall theme in place.
If you do wish to support themes more robustly, I would highly recommend migrating from bitmap based graphics to vector based graphics using jsui/v8ui/jspainter in conjunction with the mgraphics API. From JS you can easily get patcher default colors, or dynamic colors.
Theme compatibility is a very complex beast and we have been and continue to work hard on making things possible for the many differing needs and desires. We understand your and other users frustration. We are also in the situation where we can't make everyone happy by simply doing it one way.
Luckily it is very easy to change the theme for anyone who wishes to do so.
While we're on the topic of Max 9 colors, is there any chance you'd consider changing the default "Slider Range Value" (and potentially "Control On Variant" too)?
Personally, I think the Max 9 default color scheme looks great in 99% of all objects, but with the default "Slider Range Value" in [live.numbox @appearance 2]
, most users find it difficult to see the actual value when the slider covers the text:

would be nice if were a Max Theme Editor, like this on for LIVE https://themecreator.live/
Hi there, I also have a public package that has about 150 patchers or so, which I'm looking to update and just like Julien, I'm looking for the path of least resistance to have them displayed with the intended colors. I'm trying to get my colors fixed (proposed solution #3) but after changing an object's dynamic color in the inspector to another fixed color, and saving it, it just changes back to the preset color of the theme when I reopen the patch. When going back into the inspector, I see the color is now indeed fixed, but to the wrong color (i.e. the color of the theme). I might be missing something here, but can anybody tell me what's going on? I'm on Max 9.0.7.
In any case, changing all interface object's colors in the inspector is going to take a lot (!) of time. I'm hoping for a different solution in the future, such as toggling on/off dynamic colors for all interface objects at the same time...
Hi Benjamin,
For this case, I would highly recommend using a javascript like the example above to automatically adjust the patcher and any specific object colors rather than do it for each color individually by hand.
What it sounds like you are describing, is that you are setting back to fixed colors and those fixed colors actually match the theme default colors and therefore are not saved. This is less than ideal for the force fixed colors approach and we will look at ways to improve this experience in future versions.
For the time being, one workaround would be to fudge that value ever so slightly away from the theme default color. I believe it could be a floating point difference that will not even be detectable when converted to an 8bit 0-255 value. That could be incorporated into the javascript, and I could try to find time to make an example in the coming days.
@JBG re: live.numbox and "Slider Range Value" with text. I hear you. This bothers me too and I'd like to refine it further. Thanks for the feedback.
Maybe it could be something closer what we're generating for "Control Highlight" in the default case. I'll need to check with other places this color is used
Hi Joshua,
Thank you (and all the others) for further replies.
Couple more questions
1) About using vectors instead of png, absolutely I hear you. Luckily I kept most of my originals for UI elements (as svg) so possibility I could just move those to JS.
Now I assume that's jsui will be slowly replaced by v8ui, but I cannot rely on this if I want to remain back compatible with Max 7 / 8… What are Cycling's plans, will jsui keep being maintained in the future? How much work is that to convert an pre-written (svg) object, including multiple state buttons like pictslider, from jsui to v8ui?
2) About using brightened vs darker bpatchers in Max 9 context
Wow thank you I really liked what you suggested, of changing the colors of parent patcher only. I had no idea this was possible, great solution I think. This would definitely allow to improve readability without imposing a global theme change. I will consult my (small) user base to see what they prefer. I'll probably end up with option in my package's preferences to decide to activate this or not.
This leads me to a bigger question similar to what @JBG asked, regarding the default theme itself.
If for some reason I still decided to adapt all my modules to follow Max 9 standard (dark everywhere), one big issue I see with using many bpatchers like Vizzie / Beaper is there is the default black for border color makes the contour almost invisible. For people relying on border for clarity, I think hey should be brighter by default, perhaps not full white but at least brighter grey.
Do you think this can be considered as an official feature request? And if not, would it be possible to at least to expose the border color to users from within the bpatcher itself?
Many thanks again for your reactivity !
Hi Julien and Benjamin,
A few further comments:
Re: jsui -- jsui will remain supported. At some point if we must migrate away from the legacy mozilla jsui engine, we should have a very high majority of backwards compatibility to load in the v8 engine for the jsui object. We kept the current legacy js engine for maximum compatibility until we could make stronger guarantees or were forced to abandon it. Almost everything you would do currently in jsui is already forwards compatible with v8ui. So I don't see much risk here, and keeping things in jsui for legacy compatibility makes sense.
Re: svgs -- it is quite easy to render SVG files in JSUI and automatically replace colors using mapcolor(). You can then animate strokes like dial position or other features with regular vector graphics calls on top of a base SVG. Or you can actually rewrite the text of the SVG in JS as desired and pass it into the SVG constructor or setsvg() method.
Re: bpatcher border color for BEAP/Vizzie -- we have taken the approach #3 of fixed colors for these packages, but we would like to make them more theme aware/compatible at some point in the future. I've added a feature request for the ability to set and customize bpatcher border colors. Thank you for this feedback.
Re: batch processing and forcing fixed colors -- I've included an example with this message that is a variant of the script earlier in this thread that shows how you can apply a color enforcement function to a folder of patchers. It duplicates the contents of the folder and saves copies to avoid losing work, but please use any batch file editing operation like this with care (make your own backups and use at your own risk). There is also an added example for "force_fixed_color". You will want to customize the "force_patcher_colors" to have your desired logic. You can also customize individual object classes, not just patcher default colors, but I am leaving that as an exercise for the reader :)
function force_fixed_color(pat, colorname)
{
var tmpcolor = pat.getattr(colorname);
tmpcolor[0] = tmpcolor[0] + 0.00001;
pat.setattr(colorname, tmpcolor);
}
Hopefully this is helpful.
Small clarification on Vizzie, the modules are a mix of theme aware dynamic colors for "the guts" of the module and static colors for the border panels. I used something similar to Joshua's script to make the interior UI objects and backgrounds theme aware.
Thanks Joshua for all this, I'll study those carefully !
And Rob thank you as well for the info, in fact I didn't notice the Vizzie was changed to follow themes in Max 9.
What I meant about the border was not the panels, but indeed as Joshua understood, the real "border" thing that you choose to add in the bpatcher inspector. It seems you don't use those in Vizzie, but I do find them useful to improve readability, especially when using a lot of them combined with regular objets. Also a matter of taste I guess.
But it's pointless to have a black border to help distinguish a black bpatcher background from a black main patch background… if you see what I mean 😂 Hence my feature request to be able to change that border color from outside and inside the bpatcher
If you need theme aware borders you can include a panel with transparent interior, sized to your module size, and make the border color dynamic.
I'd rather not resize all my modules' content to fit a border that was outside for years :) I assume that to give a default black color to the outside border there must be a non-exposed variable somewhere? I'd rather wait for this if it was possible.
As mentioned, I've added a feature request for setting custom border color and/or better theme compatibility.
Yes I saw this absolutely, thank you Joshua, looking forward to it ! :)
Thanks again, Joshua and Rob for your help on this !
I spent more time tonight fiddling with the js code and it actually helped me understand the color system much better.
I still believe some video tutorial would be useful at some point to introduce everyone to this topic more easily than the online docs, in particular non-native english speakers like myself.
I managed to fix one of my modules to remain exactly the same in Max 8 and look consistent with the new default in Max 9, and through most color themes in fact. I can start to understand the appeal…It's still a lot of work, but in the meantime I can drop in some quick and dirty abstraction to fix 90% readability before I can really fix everything in detail.
One last question to clarify :
I still do need to use v8 (and not the old js) to use that code correct? I will continue to maintain that package in Max 8 for the time being (old computer) : now if I leave in my Package some empty, dummy "v8" objects to avoid error messages, am I guarranted that Max 9 will always find the real v8 in priority, and not use the fake one in my package…?
Hi there,
I had another question : is there a way to be notified of color theme changes?
Either some dedicated object, or some message like ; max getsystem sendname / ; max getversion sendname ?
I made some alternate versions of all of my UI elements to work with darker background (still in png for now).
For now it works well for defaults only : I can identify on loadbang that Max version is either 9 (black default -> say white.png) vs. 8 or older (white default -> black.png). But that tells me nothing about the actual theme that is being used. For instance, if someone uses a light green theme I need to use the second option.
Thanks in advance !