Repository navigation
Releases
v0.1.0
The first release of Zoetrope: your clip on a strobe-lit spinning disc, for Resolume Arena and Avenue, as an FFGL effect (SW Zoetrope, ZT01). The clip is printed onto the cards of a disc as each card passes a print head, the disc turns, and you only see it when a strobe fires: on the beat or a subdivision of it, on hits in the music, at a set rate, or when you press Fire. It's the oldest trick in moving pictures, run backwards, and it flashes, so mind anyone in the room who's sensitive to that.
The one idea: nothing is animated by the plugin. Turn the disc exactly one card per flash and the figures stand still and play the clip. Turn it a touch slower and they crawl backwards; a touch faster and they crawl forwards, which is the wagon-wheel effect doing to your clip what it does to film of stagecoaches. Every card was printed when it passed the head, so the ring is also a delay line you can see. The disc can be a motor locked to Resolume's tempo, a motor at so many RPM, or a hand that pushes it on the beat while a bearing slows it down. The flash has a length, so long flashes smear; the camera has a shutter, so a strobe faster than the frame rate catches two flashes in one frame and none in the next; and a Persistence control adds the eye's afterimage. A Drum view is the Victorian original: the cards inside a drum, seen through slits in its wall, squeezed sideways by the geometry.
Downloads: a universal macOS bundle (Apple silicon and Intel) as a .dmg or .zip, and a Windows x64 installer (-setup.exe) or .zip. Every download carries the one effect: Zoetrope.bundle on macOS, Zoetrope.dll on Windows. The macOS build is Developer ID-signed and notarised by the fleet's signing agent once the release is published. The Windows build isn't signed, so SmartScreen warns once.
What is measured (offline, by tools/verify.sh on an Apple Silicon Mac, driving the plugin's own class in a headless GL context at two rasters and on Apple's software renderer):
- The strobe and the disc. A disc locked to the beat stands still to 4e-7 rad over 100 flashes (0.0001 px at the ring). A crawl advances by the wrapped turn per flash, ωT mod one card, to 3e-8 rad over eight Slips from 0.6 to 2. Every flash lands on its beat, half, quarter or eighth beat or bar to 2e-15 s.
- The light. A flash's smear is ω τ R long to 0.002 px in 40, and centred where the disc was mid-flash. One flash carries the same light at 10 µs and at 20 ms (1.000000). What each frame's shutter catches matches the closed form of its window to 2e-7 of a flash (157 Hz through 200°: 127 frames catch one flash, 108 catch two). Persistence keeps exp(−T/τ) of the last frame.
- The cards. 88 of 88 cards, read off the picture as frame numbers, show the frame printed when they passed the head; 8 of 8 survive a change of raster.
- The hand. The hand-spun disc's closed form for a bearing's viscous and Coulomb friction matches an independent RK4 solve to 3e-11 rad, and the picture follows it to 1.2e-7 rad and stops when the closed form says, 6.419108 s.
- The drum. The figures stand within 0.01 px of an independent ray trace of the drum and its slits, squeezed to 0.66955 of their width against the geometry's 0.66956.
- The checks can fail. 17 deliberately wrong models and 13 one-character mutants of the shipped GLSL and C++ are all caught. All 22 controls the sweep can move change the picture; the 23rd, Audio, is the input Threshold is swept through. The bundle is universal, and
oxbowrenders 120 frames through it.
Windows, in Resolume Arena 7.27.1 (win-lab, Mesa llvmpipe: software rendering, no GPU, no sound device): the x64 build loads, registers and renders, and passed all 9 of the fleet's Arena checks that can run there, twice (the audio one is skipped). Every control is as declared and Arena's log stays clean. With the picture held under a locked 157 Hz strobe with Persistence, so the cards stand still between the gate's grabs, 18 controls measurably changed the picture in the first run and 19 in the second. Push and Print At came back too close to call both times, and Friction once: Push and Friction only act on a hand-spun disc in motion, and Print At only moves the small print-head marker over a still clip. Audio and Threshold need sound. Software rendering says nothing about a GPU or about speed.
On macOS it's never been loaded into Resolume; the fleet's test host, oxbow, is the only host it's run in there.
What is assumed, or unconfirmed. No host anywhere has played it any music, so Trigger Onset on Resolume's own FFT is untested, and nobody has measured what level Resolume's bins carry, so Threshold's scale is a guess. A card is printed up to a frame after the moment it stands for, more than eight flashes in one exposure are dropped, and the drum's hand-spun disc is inverted on a 16-piece table rather than in closed form.
Cost: GPU time, the median of 120 frames on an Apple Silicon GPU shared with other work. At the defaults it's 0.08 ms at 720p, 0.12 ms at 1080p and 0.60 ms at 4K. The worst case I could build, a 150 Hz strobe of 20 ms flashes on a disc at 600 RPM with Persistence, takes 1.9, 3.6 and 8.9 ms. Nothing was timed inside Resolume.
Not done. No presets and no OpenFX port.
- User guide: https://stoatworks-labs.com/software/zoetrope/guide/
- Project page: https://stoatworks-labs.com/software/zoetrope/
- Browser demo (the plugin's own C++ as WebAssembly): https://zoetrope-demo.stoatworks-labs.com/
- Video: https://www.youtube.com/watch?v=1PS0Qz8vy00