Repository navigation
v0.4.1
transit v0.4.1
This is a point release two days after v0.4.0. It turns the dependency graph on for sessions with sidechain keys, gives you a way out when a plug-in stops responding, and polishes what testers hit first. transit is alpha-quality software and the session format may still change, so back up anything you care about.
Highlights
- Sidechained sessions on the render workers, by default. A session with sidechain keys now renders through the workers as a task graph: one task per strip, with edges to every strip that supplies it a key. A key that misses its deadline skips the strips that depend on it for that block instead of feeding them a stale key. On the keyed reference session (eight hosted instruments on a Focusrite Scarlett at 64 frames, a compressor keyed from another strip), over-budget callbacks fell from 14,388 to 364 in ten minutes, the longest callback from 42.1 ms to 2.1 ms, and the compressor never missed its key. Start transit with
TRANSIT_RENDER_GRAPH=0to keep the old path, which renders keyed sessions on the audio thread (#174, ADR 0029). - Two new gates prove it is correct. The compressor's gain-reduction trace follows the intended key within 0.001 dB of the detector's own equations, in both render modes, across fourteen keyed topologies, and a key one block or one sample early or late fails it (#179). The graph render equals a serial render with the same blocks muted, bit-exact, with plug-in state fingerprints equal at every block boundary, under seeded worker-stall schedules (#210). Its first run found a defect in the graph path before the default flipped: the early-key delay ran when the key was filled, not when the strip rendered. That is fixed, and the minimal failing schedules stay as named regression tests.
- A way out when a plug-in stops responding. When a plug-in host thread stops returning from a plug-in call (Guitar Rig 7 browsing presets), transit names the plug-in and the call in the log every 60 seconds and in Copy diagnostics, audio keeps running, and a window offers Save now, Give up and Later. Give up quarantines the stuck thread and its plug-ins; the ghost window stays until transit exits, and K90 says what Give up cannot do on Windows (#205, ADR 0018).
- An unresponsive marker where you look. A plug-in that is stuck or given up on, or hung inside a render worker, is marked in the mixer insert row, the device card and the track header, so a silent track explains itself. For a stuck host thread, the hover text names the plug-in and the stuck call, how long it has been stuck, and offers Later or Give up; after Give up it says you gave up. For a render worker that has not returned for two seconds, it says a plug-in on that track is stuck. The marker clears when the call returns (#213, #190).
- Shorter window title bars and status messages that clear. Internal window titles use a smaller text style and the title bar drops from 35 to 23 px at 1.0 scale, with a larger close button (#206, ADR 0010). A status message clears after eight seconds, a newer one replaces it at once, and Copy diagnostics keeps the last one with its time (#203). A progress line such as an import at 0% no longer blinks when its text stays the same (#216).
- Browser Locations from the tree, and multi-clip copy-drag. Right-click a folder in the Files tree for Add to Locations, a location row for Remove from Locations, or drag a folder onto the Locations header (#212). Ctrl- or Alt-drag now copies the whole clip selection by the same offset as one Copy undo step, and Shuffle makes room like paste (#214).
- Long takes are refused loudly and kept reachable. A recorded take over the decode limit is refused before it is read, the log and the message say its length and the limit in hours, and the session records the unplaced take and lists it on every open and in Copy diagnostics. The recording itself is intact on disk (#192, K91; disk-backed sources in #187 are the real fix).
- How we decide, in the open. The README now has a "How we decide" section pointing at the benchmark decisions table, the ADRs and the escape records, and two new ADRs set the direction for built-in instruments: a port of the Mutable Instruments family starting with Plaits, MIT-licensed and credited to Émilie Gillet, gated by null tests against the original C++ (ADR 0033), and racks that sum a group of chains with shared MIDI, macros and key or velocity zones (ADR 0034).
Fixes
- Mixer sidechains: a strip's early-key delay ran when its key was filled, before the strip was published, so a strip taken back unstarted could see its key one block ahead; found by the #210 gate and fixed before the default flipped (#174, #210).
- Diagnostics: the render worker figures count strips skipped because an upstream key missed, attributed to the strip that missed, and a strip that was only skipped says so in the top line (#174).
- Tests: the status-line tests no longer depend on the eight-second aging window or wall-clock timing (#203). Two worker-set tests released a stalled fake before the worker had read its behavior; they now wait for the stall they release (#189). A render-worker test inherited the default strip deadline and failed on a slow CI runner; such tests now set the deadline themselves, and a new test proves a late strip's panic is never lost on a worker.
- Plug-ins: a parameter value set while a plug-in skipped a block (a busy host, a parked instance) is now delivered on its next processed block; the insert stays awake until the host reports nothing pending, instead of waiting for the automation lane to change. A state load that lands while values are queued wins over them, on both the VST3 and CLAP hosts (#78). Two limits remain and are tracked as #219: a bypassed insert receives no values, and a Save As right after a skipped block can still read the previous value.
- Tests: the autosave tests wait on the writer's flush instead of polling the clock (#189), and CI compiles the engine crates without the testing feature (#215, item 2).
- Repository: the compressor and sidechain suites check the detector equations and plug-in state at block boundaries rather than thresholds alone (#179, #210). These have no user-facing change.
Known issues
Full list: docs/known-issues.
- K88: with the workers on, the auxes, busses and masters still render serially on the audio thread after the strips, until the graph's slice 2 (#174). Strips that read the live input or hardware (monitored audio tracks, External Instruments, hardware inserts) stay on the audio thread, and a strip pinned there that is keyed from a late strip is left silent for that block.
TRANSIT_RENDER_GRAPH=0andTRANSIT_RENDER_POOL=0are the opt-outs. - K89: a plug-in that hangs inside a render worker keeps its track silent and refuses session changes until you close the device or Reconnect. The hung-worker track shows the Unresponsive marker after two seconds; the engine cannot name which plug-in on that track hangs.
TRANSIT_RENDER_POOL=0keeps such a plug-in off the workers. - K90: Give up cannot remove the ghost window of a thread that never returns, and it makes a hang permanent if the plug-in would have recovered once you answered its own dialog, so choose Later first. End Task on the ghost ends transit. Reopening the plug-in can wedge another host thread. After Give up the marker stays and says you gave up.
- K91: a take longer than about 6.2 hours of mono audio at 48 kHz is not placed in the session (stereo or 96 kHz halves the limit); the file stays on disk and is listed under unplaced takes (#187, #192).
- #184: one recording on an overloaded machine showed a 4.7 s stretch of exact zeros in both armed inputs; a one-hour recording under heavier compile load did not reproduce it. Input stalls are not yet counted or marked on the take (v0.5.0). Please report it if you see it.
- #215: items 1 and 3 remain. The scheduling gate's deterministic seam cannot produce every miss outcome yet, and the testing feature's coverage of the fingerprint seam is incomplete. Item 2 has landed: CI compiles the engine crates without the testing feature.
- Linux: plug-in editor windows are not hosted yet; parameters are reachable through the automation picker, MIDI Learn and the header strip (#147).
Downloads
Assets are attached to this release.
| Platform | Asset |
|---|---|
| Windows (x86_64) installer | transit-v0.4.1-windows-x86_64.msi |
| Windows (x86_64) portable | transit-v0.4.1-windows-x86_64.zip |
| macOS (Apple silicon) | transit-v0.4.1-macos-arm64.dmg (holds transit.app) |
macOS (Apple silicon), bare binary with audio-bench |
transit-v0.4.1-macos-arm64.tar.gz |
Linux (x86_64) tarball with audio-bench |
transit-v0.4.1-linux-x86_64.tar.gz |
| Linux (x86_64) AppImage | transit-0.4.1-linux-x86_64.AppImage |
| Linux (x86_64) Debian and Ubuntu package | transit-0.4.1-linux-x86_64.deb |
| Linux (x86_64) Fedora and RPM package | transit-0.4.1-linux-x86_64.rpm |
A .AppImage.zsync file sits next to the AppImage for delta updates. Every archive carries audio-bench, which measures your interface (round trip, jitter, xruns).
All builds are unsigned. On Windows, SmartScreen shows "More info", then "Run anyway"; the Windows build includes native WASAPI and native ASIO. The macOS app is ad-hoc signed and not notarized; if macOS blocks it, run xattr -dr com.apple.quarantine /Applications/transit.app, or right-click it and choose Open. On Linux, make the AppImage executable (chmod +x) and run it, or install the .deb or .rpm with your package manager; none of the Linux packages are signed. The Linux builds carry the native JACK backend (#55): it talks to a running JACK 2 or PipeWire server (transit never starts one), and Auto prefers it when a server is up. On Debian and Ubuntu with PipeWire, start transit as pw-jack transit so PipeWire's JACK library is found. More Linux reports are wanted in #55: run transit --report and tell us how it went.
Checksums
SHA-256 of each asset:
a628e97252ecfa84305380d5f6a0ea418c2e78c041df94cfd1b8cb730039910a *transit-0.4.1-linux-x86_64.AppImage
0aa35edf6f58379541e1f0546ded9746a2d628f88452065f56ff227430eca5dd *transit-0.4.1-linux-x86_64.AppImage.zsync
a589a62a1949cb322e8916156ca3cf63f047b28dc447086fec8cbd049379d324 *transit-0.4.1-linux-x86_64.deb
ce6792d00d6db3027217139f9f281497d7204cc74e6a5fc880e34536d0b2b8cf *transit-0.4.1-linux-x86_64.rpm
2fdb6c886837f4ac9de2ceeee2296f83ebdb2f50bf923c8f80a8888d12b74b5b *transit-v0.4.1-linux-x86_64.tar.gz
a4376d19b3c4991aaba83a783387bcd30873879b8077e614abc491a23fa7d350 *transit-v0.4.1-macos-arm64.dmg
56bb57ba53e3dd3cb1b62b063cc7c4f876eb7bf227bc95a9e87f48647cf606cc *transit-v0.4.1-macos-arm64.tar.gz
6a5ed1a33926e92644de990d92ffc64b43863d60f583286db04f4a992ea1c12a *transit-v0.4.1-windows-x86_64.msi
9f74488dd5b170d3379f514a5c065900afde4d68ac27a0e3aa18ac8be9967cfb *transit-v0.4.1-windows-x86_64.zip