Skip to content

v0.5.0

Latest

Choose a tag to compare

@github-actions github-actions released this 08 Nov 09:11
· 3 commits to main since this release

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-report reports, MCP tool descriptions and results, built-in loop and plugin profile descriptions, and the docs (SKILLS.md, TOOLS.md, skills/) are English only. The muser view and live pages keep their 中文 / EN switch and README.zh-CN.md stays. 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=1 and 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 @state paths (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 adding LICENSE-MIT / LICENSE-APACHE (#1).

Live performance (muser live)

  • A resident live session: muser live start <template> --detach keeps 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 in samples/live/, and skills/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. status lists 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; the send waits instead, and the section starts on time after it). Looking an sfz: 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 stop exits 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:], and muser view, karaoke, takes and live status use 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 / bass cabinets, 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-in guitar.steel is 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 --device uses 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-data for videos: bars and beats (seconds) and lyrics (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 get w: lines. The ABC reader understands inline [M:] too.
  • Plugins follow per-section meters (time signature, bar start, bar number), and after a jump in --device playback they see the position they jumped to.

SFZ

  • Built-in controller curves 1–3 (bipolar, inverted, inverted bipolar) on tune / volume / pan / amplitude modulations 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-rising is 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-blue points 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

Full Changelog: v0.4.0...v0.5.0