Skip to content

jeremycg/coalescent

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

94 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Coalescent

Coalescent is a set of strange oscillators for VCV Rack 2: gliding stochastic tones, scanned physical bodies, spiking neuron voices, three-phase genetic circuits, and predator–prey ecologies. Built around one idea: let a small dynamical system run, and listen to it. Each module is a different system — stochastic, physical, neural, genetic, or ecological — driven hard enough to make sound. They're grouped as the Fluctuations series (a label used throughout the docs, not a separate brand); the same plugin has room for other series later.

Module System Character
GENDYN Xenakis dynamic stochastic synthesis (GENDY3) a piecewise-linear waveform whose breakpoints random-walk each cycle — directed glissandi and living timbres
Haptik scanned synthesis (mass–spring ring) a ring of masses scanned at audio rate; pitch and timbre decoupled — pluck it, freeze it, or resonate it
Neuron · Axon FitzHugh–Nagumo neuron a spiking relaxation oscillator that crosses from drone to one-shot percussion on a single CURRENT knob
Neuron · Soma Hindmarsh–Rose neuron Axon's three-variable sibling: tonic spikes → bursts → chaos, all from injected current
Operon Elowitz–Leibler repressilator (gene ring) three genes repressing each other in a ring, ~120° out of phase — a native three-phase oscillator, LFO, and clock
Bunnies Lotka–Volterra / Rosenzweig–MacArthur predator & prey chasing each other a quarter cycle apart — a two-phase oscillator, LFO, and clock

Coalescent — GENDYN, Haptik, Axon, Soma, Operon, Bunnies

Which module should I use?

  • Evolving digital noise / stochastic textures and glissandi?GENDYN
  • Plucked, struck, or resonant string-like bodies you can freeze?Haptik
  • Pingable spikes and rubbery, excitable neuron percussion or drones?Axon
  • Bursting, slow-fast, chaotic motion?Soma
  • Three-phase tones, three-phase LFOs, or a three-phase clock?Operon
  • Two-phase boom-bust motion, or a two-phase clock?Bunnies

The neuron pair

Axon and Soma are conceptual twins — the FitzHugh–Nagumo and Hindmarsh–Rose spiking-neuron models — and they're built that way: both live in src/neuron/ over a shared src/dsp/rk4.hpp (a generic coalescent::rk4<N> step + pitch-adaptive substepping, where the HR model extends the FHN one with a third, slow adaptation equation). They share a name prefix so they sort together in the browser and an accent/panel language so the kinship reads visually; they're also the only two modules tagged Polyphonic (up to 16 voices), so a browser filter narrows to exactly the pair.

Modules — full documentation

  • GENDYN — dynamic stochastic synthesis
  • Haptik — scanned synthesis
  • Axon — FitzHugh–Nagumo neuron (+ polyphony notes)
  • Soma — Hindmarsh–Rose neuron
  • Operon — Elowitz–Leibler repressilator (three-phase)
  • Bunnies — Lotka–Volterra / Rosenzweig–MacArthur predator–prey

Demo patches

The patches/ folder holds ready-to-load .vcv demos for every module (free-run, sync, polyphony, playable MIDI, and per-module character patches), plus coalescent_gallery.vcv — a gallery of modules side by side for a quick look. These demos are generated by the scripts in tools/ and, on WSL, are also copied into the Windows Rack patches folder when present. Separately, patches/community/ holds bigger, fully-produced patches contributed by users (hand-built, not script-generated) — see its README for credits and setup. To regenerate the demos:

python3 tools/make_patches_neuron.py        # Axon + Soma
python3 tools/make_patches_haptik.py        # Haptik
python3 tools/make_patch_gendyn.py          # GENDYN 16-voice
python3 tools/make_patch_gendyn_2voice.py
python3 tools/make_patch_gendyn_cluster.py
python3 tools/make_patch_operon.py          # Operon (repressilator)
python3 tools/make_patch_bunnies.py         # Bunnies (predator-prey)
python3 tools/make_patch_gallery.py         # gallery view

Install

From the VCV Library (recommended). Coalescent is in the official VCV Library — subscribe there, then in Rack use Library → Update all (or Sync on Rack Pro). This keeps the plugin updated automatically and is the easiest path for most users.

Manual (development builds / unreleased changes). Download the .vcvplugin bundle for your platform from the latest GitHub Release, drop it into your Rack user folder's platform-specific plugins directory — since Rack 2.5 this is plugins-<os>-<cpu>/ (for example plugins-lin-x64/, plugins-win-x64/, plugins-mac-arm64/), not a bare plugins/ — which you can open via Rack → Help → Open user folder. Then restart Rack.

Build

Download the VCV Rack 2 Plugin SDK and point RACK_DIR at the extracted path.

# Linux (native)
make RACK_DIR=~/Rack2-SDK/Rack-SDK dist

# Windows cross-compile (from WSL, MinGW-w64)
RACK_DIR=~/Rack2-SDK-win/Rack-SDK \
  CC=x86_64-w64-mingw32-gcc-posix CXX=x86_64-w64-mingw32-g++-posix \
  STRIP=x86_64-w64-mingw32-strip MACHINE=x86_64-w64-mingw32 make dist

make dist writes a .vcvplugin bundle to dist/. CI (.github/workflows/build.yml) builds Linux x64, Windows x64 and macOS arm64 on every push, and attaches the bundles to a GitHub Release on a v* tag.

Tests

make check parses plugin.json (a jq syntax check) and runs every module's standalone kernel replica (stability/calibration) plus the RK4 equivalence check — no Rack SDK needed. It's the same guardrail CI gates releases on. A second target, make check-simd, proves the float_4 (poly-SIMD) path matches the scalar kernel; it needs the Rack headers, so CI runs it after the SDK download.

make check                                 # SDK-free stability/calibration/RK4
make check-simd RACK_DIR=~/Rack2-SDK/Rack-SDK   # SIMD equivalence (needs Rack headers)

Each replica can also be built and run on its own:

g++ -O2 -o /tmp/t tools/stability/axon.cpp   && /tmp/t   # FitzHugh–Nagumo
g++ -O2 -o /tmp/t tools/stability/soma.cpp   && /tmp/t   # Hindmarsh–Rose
g++ -O2 -o /tmp/t tools/stability/haptik.cpp && /tmp/t   # scanned-synthesis ring

Known character, not bugs

These are intended behaviours, called out so they don't read as defects:

  • GENDYN aliases at high center frequencies / extreme settings — it's a raw piecewise-linear oscillator, not band-limited. Part of the GENDY3 sound.
  • Haptik Slow mode steps the lattice every 256 samples by design (tactile, haptic-rate morphing); the readout is interpolated so it doesn't sound stepped.
  • Axon/Soma are excitable systems — they click and spike on purpose, and their pitch is open-loop (CURRENT/EPS/BURST/ADAPT pull it a little).
  • Soma's chaotic region sits around the documented CURRENT; nearby values shift with rate, drive, and modulation — chaos isn't a fixed point on the dial.
  • GENDYN and Haptik preserve their evolved internal state with the patch (the running waveform / frozen lattice), so a sound you let run or freeze reloads as itself. Axon, Soma, Operon and Bunnies restart from their defined initial conditions; all knob and menu settings persist everywhere.

License

GPL-3.0-only. © Jeremy Gray.

About

VCV Rack 2 oscillators built from stochastic, physical, neural, and ecological dynamical systems

Topics

Resources

License

Stars

2 stars

Watchers

0 watching

Forks

Packages

 
 
 

Contributors