Inspiration
Fishpond started with a simple idea: make the code editor a musical instrument. Live coding makes it possible to improvise by changing code while music is playing, but many existing workflows depend on a separate sound engine. I wanted to build a standalone live-coding DAW where musicians could use Sardine-style Python patterns to control the VST3 instruments they already own.
What it does
Fishpond lets musicians: Write and evaluate Python in a persistent live-coding session. Use Sardine-style players, pattern strings, timing, and quantized replacement. Route notes directly to named instrument channels using syntax such as Pa >> n("C2 C3 {Eb3 G3}", target="bass", p=0.5). Load and replace VST3 instruments while audio continues playing. Control tempo and master volume from code. Monitor transport state, output, errors, and execution feedback. Use safe stop and panic controls to prevent hanging notes.
How we built it
Fishpond is a native JUCE/C++ desktop application with an embedded CPython runtime. Sardine informed the live-coding model, while BespokeSynth informed the embedded-Python and plugin-hosting architecture. The system separates Python evaluation, UI operations, plugin lifecycle work, and real-time audio processing. Python never executes on the audio callback. Musical events move through bounded thread-safe queues and are delivered to hosted plugins at the correct audio-block boundary. We used a specification-driven workflow with requirements, technical design, traceability IDs, deterministic fixtures, callback instrumentation, and phase-based validation. Codex and GPT-5.6 helped turn the initial idea into this architecture, implement focused increments, investigate failures, and document the evidence for each milestone.
This was used to build fishpond: https://github.com/whatevergeek/genflex
Challenges we ran into
The hardest problems were protecting the real-time audio callback, coordinating asynchronous VST3 lifecycle operations, and keeping audio stable when Python evaluation or plugin loading fails. Plugin formats and bus layouts also vary considerably. Fishpond had to handle mono and stereo outputs, multi-class VST3 bundles, instrument classification, and loading a replacement instrument without interrupting the current performance.
Accomplishments that we're proud of
We built a working live-coding loop from Python evaluation to hosted VST3 audio. Fishpond now supports Sardine-style player replacement, pattern strings, brace-based chord groups, quantized changes, source-linked errors, safe panic behavior, and multiple independently routed instrument slots. We are especially proud that a new VST3 instrument can be created asynchronously and swapped at an audio-block boundary while the existing instrument continues playing. The standard deterministic suite passes 39/39 tests, the embedded-Python suite passes 51/51 tests, and manual macOS testing confirms audible VST3 playback, multi-instrument loading, and uninterrupted replacement.
What we learned
We learned that live-coding audio is as much a concurrency and reliability problem as it is a language-design problem. UI responsiveness, Python execution, musical timing, plugin lifecycle, and audio processing all need explicit ownership boundaries. We also learned that preserving the feel of a musical language matters as much as preserving its syntax. Named players, pattern strings, quantized replacement, and immediate feedback are essential to the improvisational workflow.
What's next for Fishpond
The next milestones are a searchable plugin catalogue, richer mixer controls, effect inserts, parameter automation through ctl(), project save and restore, project trust controls, broader platform support, and accessibility improvements. The long-term goal is a complete creative environment where musicians can learn Python by making music, perform with their own plugins, and move from experimenting with patterns to building complete live sets.
Log in or sign up for Devpost to join the conversation.