Tetris Font (2020)

7 months ago (erikdemaine.org)

I did kinda the opposite and instead of making a font out of tetris I made a font play Tetris.

I did it with the Harfbuzz shaper which now have experimental support for embedding WebAssembly programs to shape fonts.

Talk where I show it off: https://www.youtube.com/watch?v=Ms1Drb9Vw9M

Source code: https://github.com/Erk-/programmable-fonts

You can also see actual uses of this WebAssembly embedding to show that is not just for fun here: https://github.com/harfbuzz/harfbuzz-wasm-examples

Related: One of the subniche in the Tetris communities is Tetris art / pattern creation, i.e. drawing predefined patterns while playing the game (almost) normally.

One of most practiced pattern is the chevron, where you draw a > shape with holes, but otherwise fill the whose board. This stemmed from the Japanese arcade version of Tetris by Sega (or Segatet for those in the known). This version was hugely popular in the arcade (it stayed for an incredibly 10 years in the top100 earner in some arcade magazine), and some player were destroying the game so much that they invented this challenge. This was recognized in Segatet successor Tetris the Grand Master (TGM3), and formally named "Secret Grade". One example here: https://www.youtube.com/watch?v=ZgzcAkjp0J8 , and another there with TGM3 signature speed https://www.youtube.com/watch?v=32wzKc0cHQU .

But in general, Shuey is the master of arbitrary making pattern. Look at him drawing a Luigi: https://www.youtube.com/watch?v=_tipJDjeKuY .

Note that since then, an algorithm for arbitrary pattern generation has been devised by Michael Birken: https://www.youtube.com/watch?v=PJkHwulsac4

(sort of related: the playing forever algorithm may be interpreted as a pattern creation https://tetris.wiki/Playing_forever )

  • Do these pattern drawings only work with aluck Manipulation?

    • Secret grade is done within the confines of the game with no luck manipulation.

      Note that the piece distribution algorithm is usually not a pure random() function, but one that's optimized to remove or reduce piece repetitions. For TGM it's history based (keep in memory the 4 last pieces type, reroll in case of repetition, with a 4 or 6 reroll limit depending on the game). IIRC Shuey uses a ruleset that uses the standard 7-bag algorithm (it's a Fisher-Yates with 7 elements; put all 7 types in a collection and deplete them one by one, randomly).

The author explains:

"Each letter and digit in this typeface is made up of exactly one of each of the Tetris pieces: (I), (J), (L), (O), (S), (T), and (Z). Furthermore, the letter is designed so that it can actually be constructed by stacking these pieces one at a time and be supported by previous pieces, as in Tetris. These designs were found by hand, aided by the BurrTools software which enabled searching for whether the Tetris pieces could fit inside a candidate outline for a letter. The piece colors roughly follow The Tetris Company's standard colors, or you can switch to black pieces. The initial rotations follow the standard Super Rotation System."

This is cool, and some of Demaine’s other work is amazing too.

https://erikdemaine.org/papers/Origamizer_SoCG2017/paper.pdf

^ provides an algorithm for generating any 3D solid via folding a 2D net (origami style)

Who would want to use the browser’s back button to undo a state change… I had to press back 20 times

  • I find the back/forward buttons useful for undoing/redoing changes, so that I don't lose past cool designs / settings, though I can see it being a controversial approach.

    That said, there were definitely way too much history generated when typing into a text field. I just implemented a planned compromise, where you only get a history event when changing a "committed" text field (meaning you previously defocused the field). Hopefully this is the best of both worlds!

For those who don't know the author:

https://en.wikipedia.org/wiki/Erik_Demaine

From a programming perspective, it would have been cooler if the font generation was automatic at the cost of a bit of quality. This might have allowed for more interesting variation, lowercase, and support of other symbols.

There is nothing less anoying than seeing a really custom font repeat a letter.

Would be nice if the "obscure in URL" feature wouldn't show the text in the textbox when you send it to someone.

  • Good idea! I've gone ahead and implemented this feature: if "obscure in URL" is turned on, the text won't be visible unless you focus on the textbox (e.g. to edit it).

  • Well noticed. Good point ...

    (Or an additional "Obscure in textbox" checkbox or something along those lines ...)

I don't understand the limitation to use all of the pieces exactly once, I'd say the rule to keep valid Tetris moves only is enough. I'm curious what could be built with just that in place.

Right now I especially dislike letters: 'B', 'G', 'I', 'N'. For comparison, I like 'F' and '1', they both look very natural to me; 'A' and 'S' get a pass too. 'Q' gets a special mention for its long tail.

That being said, the project is super cool and looks great already.

Feels like there should be many ways to make a particular letter, and it'd be neat if it was random each time. I tried "Hello" and noticed the L's are the same. Considering it's just for fun I think it'd add a little more fun if it was actually unique letters.

Also, can we get a checkbox for "pause after animation"? I want to take a minute to check out the letters before it starts animating again. I know you can click off Animate after it finishes, but if I share this, others may not be so keen.

  • Regarding the first question, I've gone ahead and implemented random build orders, so at least the two Ls in HELLO will usually produce different animations (depending on random choices). Designing completely different glyphs for the same letter is quite challenging (finding these already took a lot of work).

    Regarding the second question, there's already a 2-second delay. I wonder if there should be a slider to specify the delay?

This is really cool! As a big Tetris and typography fan this is such a novel combination, especially as they're all buildable in-game.

  • Quite the "rabbit hole", trying different texts, punctuation (sadly, none that I could produce, which - if you think about it, makes sense) ...

Ah I learned dynammic programming from watching this guy's lectures. Child prodigy who went on to become an MIT professor!

I have to admit I did not know where it was going at first but was thoroughly delighted once it finished stacking up haha

I think there’s a small bug where the speed change isn’t reflected in the downloaded gif (it’s very slow by default)

  • I couldn't reproduce this bug. Perhaps the program you're using to display the GIF doesn't support the GIF frame delay feature? (E.g., Chrome seems to display them fine.) Feel free to open an issue on the repo if I'm missing something: https://github.com/edemaine/font-tetris

    • Ah, fwiw was using my iPhone for the test, so perhaps it’s just scoped to that. Not like that’s a use case you really need to support with this :)

Wow! But can you vary how you build each type - all letters seem to follow the same recipe

Coming soon near you:

- Game of life using Tetris

- Logic gates using Tetris

- Full microprocessor using Tetris

- Full computer emulation using Tetris ... :)