During my artist’s residency this summer, I built a tool to generate a variety of fern SVGs. There were two parts to this tool: a frond generator and a 3D scene to place fronds in. I’m releasing the first part today. You can play with the frond generator here: The Fern Synthesizer!

Why ferns? I’ve been drawn to their natural beauty for some time now. On hikes, I noticed ferns of all different sizes and complexities. But all ferns seem to be variations on a theme. Each fern looked recursive: each frond was made of ever-smaller branches that resembled the entire frond. I was curious: could I represent that in code? Could I use recursion to generate ferns that I could plot using my AxiDraw? In order to try, I would need references. I started collecting specimens and making cyanotypes with them.

cyanotype

The cyanotypes captured a life-sized silhouettes of each specimen, giving me a perfect reference for my code. I had prints of a few different species of ferns: beech ferns, marginal wood ferns, maidenhair ferns. The cyanotypes gave me their exact scale and number of leaflets. I wrote a basic Processing sketch that outlined a branch and leaf pattern, a generic fern based mostly on the marginal wood fern. I started experimenting with parameters. Could I make it so the same code could generate each species I had collected?

The differences between the real life ferns became my parameter set: angle of leaflet attachment, attachments being opposite or offset, the depth of recursion. I noticed differences in the shape of the leaflets, the length of stem between leaflets, the width and density of fronds. At first these parameters were simple global variables that I edited alongside my other code. But as I developed further, I made them editable via keyboard to shorten the feedback loop. This is when I started thinking of this tool as a synthesizer.

A music synthesizer does not use prerecorded audio to make its sounds. Instead, it allows a musician to generate pure waveforms, shaping them with filters, envelopes, and modulation. My tool did the same: it generated a basic frond and gave me options to shape it. The reason I wanted to copy real ferns from nature was this mutability. My goal was not to create artwork that exactly represented the ferns I collected. I needed those examples to show me the range that could be expressed in a fern. I wanted to create never before seen ferns.

screenshot

Affordances were important: I needed to be able to make changes to the fern as seamlessly as possible. I started with a tool but I really wanted a toy. It did what I wanted, but felt slow and clunky. If I made it easier to use, I would play with it mindlessly. I wanted to see what I could create with an open-ended set of parameters, easily tweaked with keyboard controls and instantly refreshed. Only then is there the possibility of emergent behavior. This is a goal I have for almost all of my generative art. Through combining the efforts of both human and computer, something new and unexpected emerges. To me this is more exciting than faithfully executing my vision from start to finish.

The UX could always be improved. At some point I’d like to experiment with physical inputs, dials or sliders. I’m also thinking about what it means for an interface to be “intuitive”: while I played with the fern synthesizer, what bothered me? What felt tedious or irritating?

One of the very first keyboard controls I added was one to save the current fern as an SVG. My AxiDraw only takes SVG files, so exporting one is the first thing for any generative art I create. I added the export option before the fern was very developed at all. From experience, I know that my early stabs at rendering can be interesting in their own right. They may not look much like my original vision, but they might spawn a fun idea or end up a different artwork entirely.

test-prints

I try to make test prints at every stage of writing the code. Since my ultimate output will be physical art, I want to get that pipeline working end-to-end ASAP. I set myself a new goal: to plot a new fern frond every day. I was less focused on the final artwork I was creating and more focused on my process and pipeline. What what I noticing as I played with my toy? How could I make things run smoother for me tomorrow?

As I created more and more fronds, I started to feel limited by their flatness. I thought part of it was the lack of context for the frond. In nature, the recursion of the frond is underscored by the number of ferns, sometimes a huge field of plants. This lead to writing another Processing sketch, a 3D fern simulator that would take the unique fronds I generated and place them in a realistic scene. I had to update the fern synthesizer for creating assets for a 3D file. Moving from 2D to 3D made some issues obvious like needing the frond to always be fully aligned on at least one axis. More pipeline issues cropped up from importing and re-exporting SVGs. I had to add controls to the 3D scene as well. I framed up my images like photographs, exporting SVGs of ferns from all angles.

3d-test-prints

I was starting to get really excited about some of the results. The original fronds were an interesting starting point but the results looked a bit too perfect, simple ink on paper. Once translated into 3D and then plotted, my hand on the rudder became more clear. The ink tracing the wireframes in perspective left interested blobs and smudges which fit in with the textured backgrounds I created with monoprinting techniques. I continued my process of focusing on quantity over quality, asking myself daily: “What do I like about what I made yesterday? What could be improved?”

After about a month of daily work a style began to emerge: neon geometric wireframe ferns on a pure gradient background. Both natural (organic edges, ink smears, and subject matter) and unnatural (neon lime ink, videogame-esque wireframes). At this point the work was still what could be completed in a single day. My experiments were converging and the work was starting to get repetitive as I perfected my process. I brainstormed a larger piece to combine all that I had learned. I started preparing a canvas for a large single painting, 30” x 40”. It would be called “Miller Fork”, an homage to one of my favorite climbing and fern-gathering areas, and depict a natural grove of hundreds of ferns nestled around sandstone boulders.

To make this many ferns, I would need a faster process. The 3D ferns I was generating were taking upwards of an hour each to plot. The painting I had in mind would feature hundreds of ferns - and I had less than a month to submit for an upcoming show. Once again I updated my original fern synthesizer code, this time focusing on simplifying the frond itself. I updated my 3D code as well, adding a utility to remove overlapping lines and optimize the line ordering for plotting. Instead of having the plotter fill in the ferns completely, I monoprinted gradients of color by hand and only plotted the outline of a fern. These I hand-trimmed and collaged onto the canvas. The monoprint and hand trimming process added a human touch which gave the final piece variation and texture.

As ferns plotted, I created more colored gradients, trimmed finished prints, and mounted them to canvas. This assembly line approach made me glad of the UX work I had been doing all along. I made additional improvements, smoothing over friction points in my pipeline. I was racing the clock: I applied to the upcoming exhibition with the piece only 80% finished.

miller-fork

But despite its unfinished state, it was accepted! I finally finished “Miller Fork” in the days before PRHBTN XV. I filled in a few blank spots with even more ferns, touched up some edges, and added a hanging wire. I worked right up to the final deadline, mounting the last fern the same day I dropped the piece off for the show. After that I could do no more. It was out of my hands. Would I have appreciated another couple of weeks to work on it? Sure…but I was glad to have a deadline to realize my vision. On opening night, I was pleased to find my painting chosen for a place of prominence. Right inside the front door, visible as soon as you entered.

The Fern Synthesizer is now available on this website. You can try out the parameters and export SVGs of generated fern fronds.