Repository navigation
The headline is muser live: an agent plays music through this machine's sound card and keeps writing it a section at a time while people listen and ask for changes. Around it: tempo and tuning changes per section, a distortion effect, an effect panel and fuller exports in muser view, and everything muser prints is now in English.
Upgrade notes
- muser speaks English now: CLI output,
--help, error and validation messages,analyze/mix-reportreports, MCP tool descriptions and results, built-in loop and plugin profile descriptions, and the docs (SKILLS.md,TOOLS.md,skills/) are English only. Themuser viewand live pages keep their 中文 / EN switch andREADME.zh-CN.mdstays. Agents answer in the user's language as before; scripts that matched the old Chinese messages need updating. Cached sound cards are re-probed once (their summaries were Chinese). - SFZ controller curves: SFZ instruments that use the built-in curves (
tune_curveccN=1and the like) now play as designed. Ixox Flute, for one, was 50 cents sharp before and is in tune now, so projects using such libraries sound different (better). - Relative
@statepaths (plugin instruments and plugin effects) are relative to the project file, as audio files are. Before, they were relative to the directory muser was started in, so a project only rendered from its own folder. - Building from source needs Rust 1.89 (documented as 1.85 before): with the current
Cargo.lock, uuid 1.29 needs 1.89 and darling 0.24 / rmcp 3.7 need 1.88. Thanks to @Stella-Mira for reporting it, and for addingLICENSE-MIT/LICENSE-APACHE(#1).
Live performance (muser live)
- A resident live session:
muser live start <template> --detachkeeps playing through the sound card while an agent writes the music a section at a time (send), and never goes silent: when nothing new has arrived, the last section loops. Each section has its own bars, time signature, tempo and tuning; tracks, effects (effects_add/effects_off), automation, buses and the master can change mid-song without a gap, since the engine swaps in the grown project while keeping every instrument's and effect's state.status/wait(runway, autoplay time limit) let an agent play on its own for a while and stop on a loop-friendly phrase; the whole session is written to--record, every submission to<name>.changes.jsonl. Seven MCP tools (live_start…live_stop), three templates insamples/live/, andskills/live.md. - Changing what is playing:
"at": "now"switches at the next bar line;"at": "patch"rewrites the current section from the next bar while staying at the same place in its form (for when someone is singing along);muser live mix <track|bus|master> <dB>moves a fader within 0.3 s without a new section.statuslists every fader with its loudness right now (mix), and warns about dropouts with the heaviest tracks (load) and slow moments in the playback thread (slow). - The live page: the session title, what plays now and next with each section's one-line
note(it flashes on a change), a timeline whose ruler stays on top while track rows scroll (tracks playing on screen first), levels, a fixed status bar, karaoke for sections with"lyrics", a Stop button, and a 中文 / EN switch. - Big sampled sounds join without a stall: a new
sfz:sound is loaded in the request thread before its section is placed, so adding Salamander mid-set no longer stops the audio for 9 s (the reconcile takes 0.35 ms now; thesendwaits instead, and the section starts on time after it). Looking ansfz:instrument up no longer parses the whole file (~5 ms instead of ~250 ms per change), and a plugin's parameter check is remembered within the process (each change with Kontakt took ~1 s). - Steadier with plugins:
live stopexits without running C++ exit destructors once a plugin is loaded, so Kontakt no longer crashes on the way out ("muser quit unexpectedly"); silent tracks and effect chains rest; the live playback queue is ~340 ms.
Composition
- Tempo changes: a section can carry
"tempo"(the new BPM from its first beat on, kept by later sections) and"tempo_ramp_bars"to get there gradually (accelerando / ritardando, linear in time; 0 or omitted switches at the bar line). Clips and automation stay in beats and follow; plugins get the tempo map in their transport, MIDI export writes it (a ramp as one tempo per beat), ABC export writes inline[Q:], andmuser view, karaoke, takes andlive statususe it. Projects without tempo changes render bit-identically. Sample:samples/songs/accelerando-dance. - Tuning changes: a section can carry its own
"tuning"(written like the project's): from its first beat on, pitched built-in instruments and SFZ play in the new tuning (sounding notes keep their pitch), later sections keep it;{ "scale": "equal" }goes back. Sample:samples/tuning/tuning-journey(equal → just → maqam Rast → equal). - Effects can start and stop mid-song:
"from"/"until"(beats) on an effect: untouched before (empty state, as if plugged in then), cut after.
Effects
- Distortion (
distortion), modelled on a guitar amp: lows kept out of the clipper, a mid push and presence before two clipping stages,guitar/basscabinets,overdrive/distortion/fuzz/fold, and loudness compensation (more drive means more grit, not more volume). Zero latency, so it can join a live set. Samples:samples/effects/distortion,samples/songs/garage-drive. (It still sounds best on a real electric guitar recording; the built-inguitar.steelis an acoustic model.)
muser view
- Effect panel: clicking an effect opens a panel instead of toggling it: an On switch, sliders and choices for every built-in effect parameter (re-rendered as you drag, saved like the faders), and for plugin effects their own window (state saved into the project as you tweak; clicking Open again brings an open window to the front).
- Exports: MP3 (320 kbit/s), a DAW package (zip: MIDI, mix, one stem per track, an import guide) and visualization data (JSON), next to WAV, MIDI and ABC.
- Recording: takes are checkboxes, so several can be used at once and overlap (recording line by line); a fresh take still replaces one it mostly covers (a retake). Select an audio clip and press Delete to remove it, e.g. the unwanted piece after a cut. Measure latency comes first until it has been measured. Recording with
--deviceuses this machine's sound card and microphone in one duplex stream, lined up by the driver's round-trip latency. - Navigation and layout: clicking the timeline snaps the playhead to the nearest bar line (Shift: beat, Option: anywhere); the right panel is three tabs (Changes with a count, Export, Record); banners sit at the top, clear themselves when the connection is back, and a page error no longer shows as "connection lost".
- Fixes: page edits survive a file reload (a plugin window saving its state used to drop them); a page playing past what a restarted view had rendered crashed the server; dragging an audio clip recursed forever after the tempo-map change.
Export and data
export-datafor videos:barsandbeats(seconds) andlyrics(every line and syllable with start / end seconds), next to notes, sections, automation and the per-frame level envelope.- ABC export: sections with their own time signature get bars of the right length and an inline
[M:7/8]where the meter changes; tracks with lyrics getw:lines. The ABC reader understands inline[M:]too. - Plugins follow per-section meters (time signature, bar start, bar number), and after a jump in
--deviceplayback they see the position they jumped to.
SFZ
- Built-in controller curves 1–3 (bipolar, inverted, inverted bipolar) on
tune/volume/pan/amplitudemodulations are applied. - SFZ files with stray lines (such as
A0 bankname: …) load with a warning instead of failing.
Samples and docs
samples/v0.4/moon-risingis now a full ~3-minute song (second verse, two-line chorus, bridge, final chorus, strummed ending, let-ringing fingerpicked guitar, 13 karaoke lines). New:accelerando-dance,tuning-journey,garage-drive,effects/distortion;sfz-bass-black-and-bluepoints at the library's install folder.skills/live.md: changing tempo and tuning, drum clips that span the section, not queueing far ahead, re-checking the mix, saying so when unsure of a well-known melody. README instrument counts are approximate (they follow manguebyte).
Engine and platforms
- manguebyte follows upstream 66ef3dc: partial voicing (air, attacks, wind jitter) for
PartialBank, an organ's space (windchest, early reflections, swell box), plugin tail reporting, render pool and MIDI port fixes. Renders of the built-in samples are bit-identical. - Windows: the CLI runs in a 16 MB-stack thread (debug builds overflowed the 1 MB main stack).
What's Changed
- Add the license files declared in Cargo.toml (MIT OR Apache-2.0) by @Stella-Mira in #1
New Contributors
- @Stella-Mira made their first contribution in #1
Full Changelog: v0.4.0...v0.5.0