weeknotes: Maine, screenprinting, FeatherEditor

2025-08-17

Travelogue

With summer ending, I took the Amtrak up to Portland, Maine. Being from one of the Portlands, I’ve heard about the other Portland all my life, so I enjoyed visiting and meeting people whose ‘other Portland’ was my Portland. The stay was incredibly refreshing: The water is speckled with colorful lobster buoys, and I woke up to a cardinal making its pew pew pew laser sound.

Screenprinting

The Media Lab has been pretty quiet, but we stepped over into ACT to learn screen printing! After taking How to make almost anything, it’s cool to see a new medium and its constraints and think of ways to combine it with my work.

FeatherEditor

Since I was on the move, I started a new exploration of using user input. I’m continuing to be fascinated by birds’ flight feathers, like how neighboring feathers subtly share color and form. In bird.rs, I’ve been writing equations to define the shape of all of the bird feathers. I’m proud of how close they are, but it is a pain to adjust them, and I think it stands out because the feathers of real birds line up so precisely. So I worked on something to help me draw the feathers.

Ever since I saw the bidirectional SVG editor SVG-PCB, I’ve been wondering about ways to connect user input back to my config file. Like choosing a point on a screen and working backwards so that it updates the underlying ‘genotype’ to create something to match.

(Since the way I work breaks out the livecode configuration file as an intermediate, I’ve also been trying out calling the configuration file a “genotype” to borrow from genetic algorithms. I’m thinking that term is more inspiring, and then I can talk about how the system converts the genotype to the phenotype of what the output looks like or how it moves.)

So I can find original feathers from either featherbase or The Feather Atlas from the U.S. Fish and Wildlife Service. Right now, I choose the bounds of the feathers, position the tops and bottom of the feathers, and then choose a few control points to adjust, like on the first and last feather. I click the “fit” button, and it interpolates the features of the other feathers! Then I can go back and forth and adjust the points that look far off. It’s pretty satisfying to have one change adjust others to fall into place.

This took some long walks to sort out how I could do it, but I ended up with something like this: I already have MurreletGen that converts my structs into vectors of numbers between 0 and 1. I also have a way to fix points at certain places, so if I’ve gone through the effort of positioning them, they aren’t immediately flung across the screen. The positions of the points I haven’t fixed are not counted towards the final weight. And then it’s just good old closed-form linear regression with some feature engineering!

I thought about doing computer vision things to learn the curves, but started with this route. I kind of like it: there aren’t too many feathers to fit by hand, and I can make adjustments as I go that I don’t think my computer vision model would have known about.

aligning the rachis (stem) of the feather

To be honest, I’m a little wary of creating user input tools like these that create asset files, in part because it breaks my live coding of them, and it’s more risky that it’ll fall out of date when I’m going between Rust and JavaScript. I made an exception here because I could test out an idea (fitting those functions), and I’d been caching the feathers during rendering anyway.