Feature idea/suggestion: "Instance Designer"

Hi folks!
Yesterday I was experimenting with adding a width axis to a typeface I’m working on. I had already done the normal weight masters. I added two more narrow masters and adjusted the width but didn’t adjust the weight. So as you can probably guess, as the bold instances got narrower they got cramped and felt relatively bolder.

Either I can change the new masters to be lighter, or do some weight tweaks in the instances. Tweaking the instances seems quicker. Which leads my to the question: “How do I progressively reduce the weight value as the instances get narrower?”

The quickest solution would probably be to do some manual tweaking/testing of different weights, and then do manual interpolation math and change the weight value in each narrower instance. But I thought it would be fun and challenging to come up with a UI for it.

Here we go :slight_smile:

So I’m aware of mekkablue’s Insert Weight Instances. It works well for getting the weight distribution right, and has some features I want. It doesn’t support multi axis and shifting.

There is also Superpolator(Retired) which I don’t know that much about. And then there is Skateboard which is somehow related, and is a tool for RoboFont.

So, like I said I wanted a little UI design challenge: I decided to create a mockup of tool that would solve my problem. Inspired by some features from Insert Weight Instances and Superpolator, and came up with this:


(See detailed descriptions in image)

It’s essentially an instance editor, with some fixed assumptions of how to lay out instances, and with a few options to tweak the results.
There’s probably a bunch of problems to the concept that I haven’t thought of, the terms are probably a little off, and it might be an overkill of an interface. Maybe, maybe not. :slight_smile:

Either way It was a good one-evening challenge and I thought it might inspire someone to create a plug-in/application that can make it easier to create multi axis(oh well, 2-axis) font systems.

Happy to discuss and explain if someone is interested.

9 Likes

That are some great ideas. Enough for more than one tool.

1 Like

Thanks Georg!

I suggest a new label for Corner Offset; it doesn’t have anything to do with corners. Maybe Weight Offset or Weight Adjustment?

I like the concept.

hi @tderkert - I have written (and not yet published) a few scripts that help me with some of these things, without a UI, including a python port of a java tool by linus romer that generalizes lucas de groot’s formula to allow for a middle value between axis points (think about e.g. optical axes, where a font might change a lot between, for example, 8pt and 14 pt, but not much between 16pt and 72pt+). also some mastering tools that insert axis locations and things like this.

I have been writing/publishing scripts as I feel a need for them (and where they haven’t already been created) while working on a large multiaxis font in glyphs 3, and filling in what I perceive as gaps in the tooling ecosystem. the reason I haven’t published anything RE: axes yet comes down to time and priority. I need to finish this darned font, which means there are 3 or 4 other scripts I am currently working on that I need to finish first. after that (I have no idea when) I would love to revisit your ideas here as there is some overlap in my own thinking, and I feel this kind of tool has a lot of value.

what I would encourage you to do is envision not just the end state but the modular bits and pieces of a tool like this, and how they work together. a “beta” version of these ideas with a simpler UI based on the vanilla library without extensive visualizations might be a good first step, for example. I find it is helpful to validate the actual utility of a tool and its parts before investing in the work on a highly polished UI.

3 Likes

The term might not be the best, and the mockup might not be obvious.
But I do think it is corners in some sense. It’s where the master “axes” cross(4 masters), creating a “rectangle”. I know it’s an infinite space, but these are just sensible base reference points.

It might make more sense to just input absolute coordinates for the “corners” of the “interpolation rectangle”; the “rectangle” which the instances are distributed within. Rather

It makes sense in my head, but I could still have some concepts and terms a little wrong. Does it make sense, or do you still think corners is a bad term?

Sounds interesting. I looked up Linus Romer and I guess you’re referring to Stepinterpolator. That’s an aspect that I’ll think about if I continue with the concept. Your example makes sense to me.

Creating nice and functional tools definitely takes time away from other things. Especially for me, as I’m not that great at scripting more complex things. And that’s why I started with a mock-up to see if I could articulate a UI for what I needed. :slight_smile:
Would love to see what you have come up with, if you intend to publish your tools at some point.

Thanks for the advice, I totally agree that it makes sense to create an MVP version of a tool that solves the main challenge, and then build on that if deemed valuable.

Just a couple of thoughts to consider:
In the variable font setup “shifted” instances would be confusing, it may be more practical and easier to just shift the master rather than instances (and then probably make master of the instance in the corner etc).

And also the instance shift idea seems to rely on one of the formulas, but none of them is quite perfect :slightly_smiling_face:

OK, then perhaps Offset from Master? Using Corner, to me at least, is misleading.

I also wonder about the usefulness of the grid display.

You’re right, you might get the same effect by just adjusting the values on the masters. Haven’t thought about what it means for variable fonts, but you’re right, might be confusing or problematic. My idea is that I want the weight to equal the stems, hence relative shifting to keep them “intact”. Might just be a vain idea :slight_smile:

Regarding the formulas, you’re right. Perhaps you if you could use it as a starting point and then adjust the curve manually to your needs. Your settings could be saved and reiterated on during the process when testing.

This all hinges on the idea that shifting/distorting the “rectangle” like this is useful, or if you want non-linear interpolation on both axes. Not sure if this is a good idea yet :slight_smile:

Yeah, you’re right Offset from Master makes much more sense in this case.

Now I’m also starting to think that it probably shouldn’t be relative at all, but absolute coordinates. The initial coordinates might start at the coordinates of the masters.
Making them absolute doesn’t make it easier to name though :slight_smile:

This looks really good. As mentioned earlier, working out the more modular parts would be a great help in envisioning the feasibility of the idea, or rather how to package it. My questions are: How would you want this to work with a variable amount of axes? How does this look for a one-axis setup, for three, four, etc.? What elements stay the same and which change based on the number of axes? I had one written a script aimed at a similar thing – visualising the instances before inserting them, either as instances or intermediate layers, but just for that, and I really like your fleshed-out idea.

The idea of “corner offset” had never occured to me, as I personally design condensed masters with reduced stem weight, but at the same weight axis location, for exactly the same reason of visual consistency. Depending on how others here practice this, I would question the necesessity of this corner offset. Please forgive me if I have misunderstood!

Thanks. It could technically scale to multiple axes, but in my mockup i stayed with just two. The space visualization would have to become 3d. Waterfall preview is not obvious for multi-axes, but could make work with some options.

Visualizing the instances before inserting them would be a neat feature when playing around with the settings. Is your script public? Perhaps I could have peak and see if I can learn from it.

I think you got it right. The “corner offset” feature, like you say, might just solve a problem in a bad design process. Having the option doesn’t hurt, and could maybe be good when experimenting. Not sure :slight_smile:

I listened to your advice to test the concept and I’ve managed to write a simple UI and script for “Axis Distribution” feature.

Features:

  • Fetches the two axes (it’s pretty strict at the moment)
  • Fetches the min/max values for each master and adds them in each “corner”
  • You can change steps for each axis
  • Interpolation options: Linear is the only available since I didn’t fully understand how to implement the others based on mekkablue’s script
  • Output: Array with coordinates in Macro console

Notes:
The graph is just a still image to visualize the axes. The “corner offset”/“skewed space” is possible to achieve with the absolute values. If you would want that, that’s up to you :slight_smile:

Example output:

[60, 100], [87, 100], [114, 100], [141, 100], [168, 100], 
[60, 50],  [87, 50],  [114, 50],  [141, 50],  [168, 50], 
[60, 0],   [87, 0],   [114, 0],   [141, 0],   [168, 0]]

I’ll keep working on it to make it more usable by actually creating instances from the values, as well as adding more interpolation options since linear alone won’t cut it. Another thing to tackle is naming.

Would be cool to control the instances with a bezier curve (instead of fixed formulas). Like just get Y from given X on the curve.

I agree, not sure how I’d implement an interactive curve editor though. I had an idea about using a bunch of vertical sliders to get granular control of each point in the distribution as a quick “hack”. The benefit of that is that it’d be possible to do any possible shape of the “curve”. The formulas could be used as a starting point for tweaking.

Here are some explanations about drawing stuff: Drawing in Vanilla
Maybe I’ll give it a try myself a bit later, if no one will have it before.

A bunch of sliders sounds no different from just text input values :slight_smile: