OpenType primer?

Hi, is there a good spot to learn how to implement OpenType features in Glyphs? I’m trying to add alternates to a hand-drawn looking typeface.

I’ve searched around and haven’t found anything meaningful. Thanks!

A simple way is to follow Glyphs naming schemes and create features automatically, e.g., creating an a.ss01 glyph and going to the Features tab in Font Info (Command-I) and pressing the Update button to generate/update automatic features. That will create Stylistic Set 1 to substitute glyph /a.ss01 for /a when feature ss01 is selected. See this tutorial:

Also, here are the various tutorials on the Glyphs site tagged with opentype features:

Also, look at the Glyphs Handbook:
Take a look at Section 6.6.2 Naming Glyphs and Appendix 17.1 Automatic Feature Generation. Other details are spread throughout.

For general OpenType feature code understanding, take a look at Tal Leming’s

1 Like

That’s helpful, thanks! Would you have any guidance on how I could get different versions of an A to show up if someone typed something like AARDVARK?

There are lots of different ways to code that in OpenType features. One example is in the tutorials mentioned above:

I believe there has been other discussion about it in the forums and elsewhere. Good luck.

1 Like

Following links can help you with more complex substitutions:

I seem to be having some trouble implementing something from @comperjk’s link. It seems that Glyphs is expecting a closing bracket when I’m defining my classes. When I enclose things in brackets, the error still shows.

Can someone help me understand what I’m doing wrong?

Here’s the code:

This is not how you set up classes in OT feature code. In the Font Info window, you add a class to the sidebar and put the glyph names in the top right text field. This is described in the tutorial. There is a screenshot that shows the setup.

What may be misleading is where the content of the classes is described the first time. I will see how I can improve this.

I get it now, thanks! My brain was looking for another screenshot of the classes screen showing how they were all set up.

Another question: I’m getting an alternate which appears at an unintended time. If I write the word “ban,” the “n” is an alternate.

My Con0 class is:
B C D F G H J K L M N P Q R S T V W X Y Z b c d f g h j k l m n p q r s t v w x y z

My Con1 class is:
B.ss01 C.ss01 D.ss01 F.ss01 G.ss01 H.ss01 J.ss01 K.ss01 L.ss01 M.ss01 N.ss01 P.ss01 Q.ss01 R.ss01 S.ss01 T.ss01 V.ss01 W.ss01 X.ss01 Y.ss01 Z.ss01 b.ss01 c.ss01 d.ss01 f.ss01 g.ss01 h.ss01 j.ss01 k.ss01 l.ss01 m.ss01 n.ss01 p.ss01 q.ss01 r.ss01 s.ss01 t.ss01 v.ss01 w.ss01 x.ss01 y.ss01 z.ss01

My Voc0 and Voc1 classes are laid out similarly. This implementation seems to say the second time any consonant comes up, use the alternate even if it’s the first instance of that letter.

Am I setting these up inefficiently or incorrectly? I’d like to have the first instance of each letter appear before the alternates.

This would be very inefficient, and probably impossible to compile. What you could do is split it up in more cycles (e.g., two different consonant cycles), but careful, I would not suggest to do one cycle per letter, because the feature code will get very complex and too large at one point.