Field guide · 17 September 2026 · Abstract Fly Walk

How the fly
makes art

A music video is light. A documented circuit walks on a sheet of paper. Six feet leave the pigment. One playthrough makes one plate, and the fly did not compose any of it.

I wanted to know what a real fly's wiring would do if you sat it in front of fifty years of music video. This page is the whole explanation. How the circuit works, where every colour comes from, why no two plates look alike, and the things I won't claim about any of it. Every number here I measured off the actual files rather than guessing.

52
plates, one per year from 1976 to 2026
2.55M
pigment marks laid by six tarsi
7,346
neurons in the running subgraph
4.2h
of music video watched start to finish
Collect on Transient Watch the 52 films The source songs Gallery
The stage: neural activity panel on the left, music video on the right, the fly walking on a paper plate between them
The stage, partway through a song. On the left is the live activity of the MaleCNS subgraph: the fly's visual field on its real retinotopic lattice, the descending pool, and six blocks of leg motor neurons. On the right is the clip the eyes are reading. In the middle is the fly, and the plate as it stood at that second. All of it renders in one WebGL canvas, which is the reason the panel shows up in recordings when a browser overlay never could.

01 / Premise

The loop

The piece is a loop with three stops, and nothing skips a stop. Culture goes in as a music video. A documented circuit reads it and walks. What comes out the other end is residue.

Culture
A music video

Fetched as a local file, then drawn to an offscreen canvas. Never an embed. An iframe is CORS opaque, so you can't read its pixels at all.

Circuit
MaleCNS subgraph

7,346 real neurons wired by 238,189 real synaptic edges, run as a leaky rate model. Light goes in one end, steering comes out the other.

Residue
The plate

6144 by 4608 pixels of piled up footprints. No composition step, no target image, no model of the canvas. Just where the feet were.

Because the light differs, the plates differ. A brown 1978 film gives brown ropes. Blue monochrome war footage gives a midnight plate. A short pale video gives a sparse one. I could flatten all that out and make everything match, but then the instrument would be lying about the songs. There's no house style here and I don't want one.

02 / Mechanism

What happens in one frame

The same six steps run every frame, about forty times a second. None of them ever look at the painting, and none of them plan ahead.

Six steps from a music video frame to pigment on the plate: the frame is drawn, twelve rays sample it, light enters 1,477 retinotopic cells, a 7,346-neuron subgraph steps through 238,189 synaptic edges, steering updates the walk, and touching feet leave pigment
The whole chain in one picture. Everything below is the same six steps with the detail filled in.
1

The clip gets drawn

Onto an offscreen 960 by 540 canvas. This is the only thing the eyes ever read. Not the plate, not the 3D scene, not the interface.

2

Twelve rays sample it

Six per eye, fanned around a gaze column that slides left and right with the fly's heading. Each side gives back a colour, a brightness and a saturation. How much the brightness changed since last frame is flicker.

3

Light enters the connectome

It goes into the 1,477 cells that carry a real retinotopic coordinate. Each one samples its own point of the frame, and the two eyes sit offset so there's a left to right difference in the first place.

4

The circuit steps

One leaky rate tick through 238,189 edges. Then the descending steering population gets read back as a left versus right contrast.

5

The walk integrates

That steering, plus the walk's own saccades, dwell and edge fence, turns into a new position and heading on the sheet.

6

Six feet land or lift

Any tarsus touching the sheet lays one bead of whatever pigment that side is carrying. Once it's down it stays down.

Nothing plans the picture. There's no composition step, no target image, no sense of balance, no retouching and no second pass. The plate is just a record of where six feet happened to be. If one of them looks composed to you, that's you doing the composing.

03 / The brain

The circuit

The wiring is MaleCNS v1.0, the finished connectome of an adult male fruit fly's central nervous system. Roughly 166,700 neurons and 125 million synapses, released by FlyEM and HHMI Janelia along with the University of Cambridge, the MRC Laboratory of Molecular Biology and Google Research, under CC BY 4.0.

I don't run all of it, and I never say I do. The files come down from the official bucket and get hashed when they load. If a hash fails, the app stops claiming it's running MaleCNS and says so in its own footer.

What actually runs
Neurons in the subgraph7,346
Synaptic edges between them238,189
Cells carrying a true retinotopic column1,477
left eye / right eye1,135 / 342
Descending neurons, brain to nerve cord1,306
DNa family, used for steering52
Leg motor neurons mapped to T1/T2/T3 by side327
Cells with no incoming edge, so never firing10
Model parameters
Neuron modelleaky rate
Membrane time constant τ80 ms
Integration step, capped≤ 50 ms
Synaptic gain after row normalisation0.72
Rate ceiling8
Yaw blend, subgraph vs stand-in65% / 35%
Colour hold per side220 ms
Activity panel refresh~11 Hz

τ of 80 ms against a 50 ms cap keeps dt/τ at 0.625 or below, so the explicit Euler step stays stable no matter how badly a frame hitches.

Three honest choices

A connectome is a map of connections. Getting from that map to something that actually runs takes a pile of decisions, and those decisions are mine. Three of them matter. I'd rather name them than bury them, because every one is a spot where I could have quietly cheated.

Choice 1

Scaling the weights

Published weights are raw synapse counts. The median is 2 and the largest is 1,086. The obvious move is to divide the whole table by its maximum, which leaves a mean weight of 0.002 and kills the signal before it can cross a quarter of a million edges. So instead, every cell's inputs get normalised by that cell's own total, then scaled by one global gain. That gain has to stay under 1. With normalised rows the recurrent loop multiplies by it on every pass, so at 1.35 every single cell pins to the ceiling. Both yaw pools then read a flat 8 and the fly still doesn't steer. 0.72 sits in the live band.

Choice 2

Where the light goes in

The obvious answer is the photoreceptors, and it doesn't work. Not one photoreceptor in this table carries a retinotopic column, so there's no way to say which part of the frame any of them is looking at. Light goes in one stage downstream instead, at the 1,477 lamina and medulla cells that do carry assignedOlHex1/2 coordinates. Each samples its own point of the image, and the two eyes sit slightly offset so there's a left to right difference to steer on. Other people working with this data have run into the same wall. The gap is in the dataset itself.

Choice 3

Reading the steering back out

The motor pools sit three stages downstream and live somewhere around 0.001 to 0.01. Any fixed threshold throws that entire signal in the bin. So steering reads as a contrast instead: right minus left, over right plus left, across the DNa pools. That responds to the difference between the two eyes rather than to how loud the circuit happens to be at that moment. Wetness uses a tanh calibrated to the range I actually observed.

The circuit was silent for a long time, and I'd rather say so. For a good stretch of this project all three of those were wrong at once. The connectome was genuinely loaded and genuinely stepping, and it contributed nothing but a bit of drag. What gave it away was the panel reading yaw 0.00 / 0.00 with about ten cells firing. I found it by instrumenting the thing instead of trusting it. Plates made before that fix were painted with a dead circuit, their metadata records a different build, and they aren't mixed in with these fifty-two.

04 / Vision

Where the colour comes from

Every colour on every plate came out of the video. Nothing gets picked from a palette, matched against a reference, or corrected afterwards.

Twelve rays read the clip each frame, six per eye. They fan around a gaze column that slides with the fly's heading, so a fly mid turn really is looking at a different part of the screen. Each side averages its six samples down to one colour, and that becomes the pigment its three feet are carrying.

Two details do most of the visible work.

The ink holds for 220 ms

Colour follows the clip through a leak with a 220 millisecond time constant rather than snapping to every frame. A foot lays down a rope of one hue instead of averaging everything that flew past it. Back when that constant was 18 milliseconds, plates came out as a tangle of near identical muddy hues. Measurably less colourful, and to the eye it just reads as blur, even though every individual bead was perfectly sharp.

Saturation gets pushed, hue doesn't

The sampled colour gets a saturation push before it becomes pigment. That deepens what's already in the clip. It never invents a hue the video didn't have. You can't get magenta out of 1978 brown film stock and I'm not going to fake it. What you get instead is a very committed brown.

Why I went back on widening the fan. Spreading the rays wider looks like it should see more of the video. It does, and then it averages it, which drags every sample toward the mean grey of the frame. Measured colourfulness dropped about 16 percent, so I put it back. A narrow fan holding one saturated local colour beats a wide fan reporting the average of the whole screen.

05 / The plate

The marks themselves

A 1000 by 750 pixel crop of a plate at full resolution, showing individual beads of pigment
A true 1:1 crop. 1000 by 750 actual pixels out of a 6144 by 4608 plate, with no resampling at all. Individual beads, individual ropes, hard edges. This image is my answer to anyone who asks whether it's blurry.

Each bead is a radial stamp with a fixed 2.6 pixel antialias edge, the same width at every plate size. That one choice is the reason the marks stay sharp. Proportional falloff turns big beads into soft coins, and honestly that's the mechanism behind most generative work that people call blurry.

Bead width grows with wetness and with how hard the fly is turning. Opacity grows with wetness too. A foot that just refreshed its pigment writes a fat wet mark, and the rope thins out as it dries. That's why they taper.

One bead per foot per frame, laid at the new position, skipped entirely if the foot hasn't travelled far enough to earn it.

I stopped chasing coverage. I tried interpolating extra beads along each foot's path and it worked exactly the way I predicted. Marks nearly tripled and coverage went from 60 to 77 percent on the same song. I put it back anyway. The ropes filled in and the plate lost the open beaded texture that makes the walk readable. Denser turned out to be worse.
6144 × 4608
plate resolution, 28MP, prints large
~160/s
beads laid per second of song
52.4 to 90.1%
coverage range across the 52

06 / Documentation

The films

Every plate has a film sitting next to it. The whole playthrough, with the song, the clip on one screen, the live circuit on the other, and the painting building up in between. The plate is the work. The film is the studio document that shows how the work happened.

Video comes straight off the WebGL canvas and audio gets tapped out of the Web Audio graph, so picture and sound are from the same run, then they get muxed to H.264 and AAC. The activity panel is drawn into the 3D scene rather than sitting on the page as an overlay, specifically so it survives into the recording.

Fourteen seconds of 1976, Dancing Fly. The panel is live, the fly is walking, and the ropes appearing under it are the ones on the finished plate. Silent here on purpose; the films themselves carry the song.
Film still, 1983
1983. The longest clip in the set, and the densest plate.
Film still, 2009
2009. Heavily saturated video, pigment to match.
Film still, 2001
2001. Firelight and dark frames, read faithfully.

Two things the films taught me

Headless rendering corrupts frames

Recording in a headless browser gave me scattered frames where solid objects flashed the wrong colour. It's a driver level fault that turns up when video decode runs alongside WebGL. Every film gets recorded in a real, visible browser window on a real display now. I checked: zero corrupt frames across a full film, against dozens per film headless.

A resized window is a visible jolt

If the window manager nudges the browser after recording has started, the camera's aspect ratio changes mid shot and the whole frame jumps. The window gets pinned at launch now, with a settle period before rolling, and an automatic scan checks every finished film for exactly that kind of break.

08 / Questions

Things people ask

If you're here for the art

Did a fly really make this?
No living fly was involved and no fly chose anything. What's real is the wiring. It's a published map of which neurons connect to which, taken from an actual fruit fly under an electron microscope. I run that map as a simple dynamical model, it reacts to the video, and what comes out of it steers a walk. The sentence I stamp on every edition is "the fly did not compose this" and I mean it literally.
Why do the plates look so different from each other?
Because the songs do. The only source of colour is the video, so a dark clip makes a dark plate and a neon one makes a neon plate. Length matters just as much as palette. A fourteen minute film lays roughly three times the marks of a three minute one, so it reads dense while the short one stays open and sparse. I thought about normalising all that and decided against it. Flattening it would mean the instrument lying about the songs.
Why is there always cream showing around the edges?
A fly walking on a sheet doesn't spread itself out evenly. It works the middle and turns back at the edges. There's a soft fence keeping it on the paper, and what you get is a dense centre with some breathing room around it. I could force full bleed coverage, but only by scripting the walk, and that breaks the one rule this project has.
Can you make it draw a flower, or a face?
I tried, in the only way that stays honest. Rather than scripting the pen I animated a light for the fly to chase, so I'd be leading the animal instead of drawing for it. It tracked the lure properly. But a rose curve reverses direction through its own centre, and no walking fly can take that corner, so the shape smeared. The code is still in the repo, permanently switched off. The conclusion is the good part: a walk can't become a drawing without ceasing to be a walk.
Why does it sometimes look blurry?
Nearly always the problem is colour. I measured this properly against an early plate I liked. The newer ones actually had higher local contrast but 2.4 times less colourfulness. A tangle of near identical hues reads as mush no matter how crisp each bead is. The fix was holding each colour longer and pushing saturation. I never touched sharpening. The 1:1 crop further up the page is the evidence.
How big can these print?
Each plate is 6144 by 4608, which is about 28 megapixels at 4:3. That's roughly 20 by 15 inches at 300 dpi, or a good deal bigger at gallery viewing distance. The marks hold up because the bead edge is a fixed pixel band instead of a proportional fade.
Are these minted, sold, or on a blockchain?
Yes. All fifty-two are minted on Transient, one token per plate. What a token holds is the plate itself, the 6144 by 4608 image, along with the provenance that was already sitting in the metadata file: the source clip, the runtime, the mark count, the coverage and the instrument build that made it.

What it doesn't hold: the films are free to watch and always will be, the walk itself isn't on chain, and none of this changes the licence on the underlying data. MaleCNS v1.0 is CC BY 4.0, it stays CC BY 4.0, and that attribution travels with every token.
Can I pick a song?
Mechanically yes. The pipeline takes a spreadsheet of songs and turns out a folder per track without me sitting there. The interesting part is that you still can't predict what you'll get. Choosing the song is the only authorial move available to you, and it's a much weaker lever than it feels like.

If you're here for the brain

Is this a simulation of a fly brain?
No, and the difference matters. A connectome is an anatomical map. It records that A connects to B and with how many synapses. It says nothing about neurotransmitter dynamics, ion channels, neuromodulation or plasticity. What I run is a leaky rate model over that graph, where each cell has one scalar activity decaying toward a weighted sum of its inputs with τ of 80 ms. That's a defensible way to let real topology shape a signal. Calling it a brain would be a stretch. People at Janelia have been clear that a genuine functional upload of even a fly is years to decades out, and I'm not going to pretend I've skipped ahead.
Why only 7,346 of 166,700 neurons?
The subgraph gets built by finding the visual and motor cell types that exist in this annotation table, so photoreceptor, lamina, medulla, the descending families and the motor neuron types, capping each type so no single class dominates, then pulling in the strongest one hop partners of the visual set. It has to run in a browser at 40 fps next to video decode and WebGL, which is the real constraint. This is a documented cut, and the cut is the biggest limitation in the whole project.
Is the connectome actually doing anything?
It is now. For a long time it wasn't, which is probably the most useful thing I can tell anyone doing this. A connectome can be loaded correctly, stepped correctly, and still contribute nothing at all while every log line looks healthy. I had three separate faults stacked together: weights scaled down to insignificance, light injected at nine cells that couldn't localise it, and a readout threshold sitting above the entire signal range. None of them were visible on their own. Instrument the thing and read the actual numbers. That's the whole reason the activity panel exists.
How do you handle synaptic weights?
Per target row normalisation. Each cell's incoming weights get divided by that cell's own input total, then scaled by a global gain of 0.72. The alternative, normalising by the global max, sounds neutral and is catastrophic, because one 1,086 synapse connection against a median of 2 crushes everything else to nothing. The gain has to stay below 1. With normalised rows it's effectively a spectral scaling on the recurrent loop, and above 1 the whole population saturates at the ceiling.
Why not inject light at the photoreceptors?
Because in this table not a single photoreceptor carries a retinotopic column assignment, so there's no principled way to say which pixel any of them sees. Inject anyway and you get a brightness signal with no spatial structure, which means no left to right contrast, which means nothing to steer with. Injection happens one stage downstream at the 1,477 cells that do carry assignedOlHex1/2. Other projects have hit this same wall independently. It's a property of the data.
Why is the visual field lopsided, 1,135 left against 342 right?
Because annotation coverage in the source data is lopsided, and the panel shows that rather than balancing it for looks. It's a real asymmetry and the walk inherits it. I disclose it for the same reason I disclose the silent cell count. A project whose whole stance is "I don't overclaim" doesn't get to quietly tidy up its own inputs.
Are there dead neurons in there?
Ten of the 7,346 have no incoming edge anywhere inside the subgraph and get no direct drive, so they never fire. That's the unavoidable cost of cutting a subgraph out of a 166,700 neuron connectome. Their inputs exist in the full animal and got left outside the cut. I leave them in and report the number rather than pruning them, because pruning would hide what the cut costs.
How much of the movement is really the connectome?
Steering is blended 65 percent subgraph, 35 percent stand-in, and the rest of the walk, meaning saccade timing, dwell, the edge fence and the gait, is ordinary procedural code the connectome never touches. So the honest summary is that the circuit steers and the scaffolding does the rest. If someone tells you a connectome is autonomously producing complex behaviour, they're either running something far larger than this or they aren't counting their own scaffolding.
What would you fix first?
Widen the cut. Steering currently leans on a small descending population, and more of the real descending pathways would give the walk a richer signal than any parameter sweep ever will. After that, a seeded random source so a plate could be re-derived exactly, and a published on versus off pair, the same song with the circuit live and then bypassed. That negative control is the thing almost nobody in this space publishes.

09 / Integrity

What I claim and what I don't

True, and I'll say it

  • 52 abstract plates, 1976 to 2026, one instrument, one unbroken playthrough each.
  • A subgraph of MaleCNS v1.0 with 7,346 neurons and 238,189 edges, from officially hashed files, CC BY 4.0.
  • The colour belongs to the clip. The variation between plates is the work.
  • Light enters at the 1,477 cells carrying a retinotopic column, because no photoreceptor here does.
  • Yaw is a left versus right contrast across descending cells, blended 65 / 35 with a stand-in.
  • Six tarsi stamp. The picture is whatever residue that leaves.

Never said

"The fly brain", or 166,700 neuronsI run 7,346 and the footer says so.
The fly wanted, learned, enjoyed or composedNone of that is in the model.
The connectome painted itIt steered. Procedural code writes the rest.
What a fly would drawUnanswerable, and not what this is.
Comparisons across buildsDifferent builds. Recorded per plate.

There's a whole genre of connectome demo where the punchline is "the fly is doing X". Playing a game, running a business, scoring a date. My punchline is "a circuit walked through this song, and this is what the feet left behind". Here the music video is the thing going in. The fly already has a job. It watches the TV and it walks the sheet.

10 / Where this lives

Four places

The plates are the work. The films show how each one happened. The songs are what the fly actually watched, in order.

Collect
Transient

All fifty-two minted on Ethereum, one token per plate, each carrying its own marks, coverage and instrument build.

View the collection
Watch
The 52 films

Every playthrough in full, the live circuit on one screen and the plate filling in between them. Chronological, 1976 to 2026.

Open the playlist
Listen
The source songs

The fifty-two tracks the fly watched, in the order it watched them. The input to the whole collection, as a playlist.

Play on Spotify
Browse
The gallery

The plates on the wall at along7gallery, alongside the rest of the collection.

Visit the gallery

Everything is also on the YouTube channel.