Skip to content

Music runtime

Use the music runtime to write a track from a text prompt, cover a song in a different genre, play a model from a Musical Instrument Digital Interface (MIDI) controller, split a mix into vocal and instrumental WAV files, or convert it into instrument-separated MIDI with tempo, meter, and key metadata. Generation, analysis, adapter training, resident serving, real-time steering, source separation, and transcription are native Swift and MLX paths. MiniMax Music 3 uses its staged language-model, RVQ, flow-transformer, and stereo vocoder stack locally; Magenta RT2 takes CC knobs while it is still generating.

Commands

CommandWhat it does
mere.run music generateGenerate audio from a music prompt.
mere.run music analyzeAnalyze source audio with ACE-Step audio understanding.
mere.run music serveKeep an ACE-Step pipeline resident behind the native music API.
mere.run music train-adapterTrain a reloadable ACE-Step LoRA or LoKr adapter.
mere.run music realtimeRun Magenta RealTime 2 music generation with stdin or CoreMIDI steering.
mere.run music separateSeparate stems or restore audio with native BS/MelBand RoFormer models.
mere.run music transcribeTranscribe a full music mix into instrument-separated MIDI with MuScriptor.

The macOS Studio app exposes its music workflows through the Music domain, backed by MereRunContract. Music ▸ Compose covers the production loop: create or edit, source or reference audio, quality and language-model (LM) planning, ranked candidates, adapter stacks, stems, LRC, recipes, and DAW export. Music ▸ Analyze provides structured audio analysis and Music ▸ Transcribe the MuScriptor controls with an embedded MIDI piano roll; the resident server's start, stop, and health live under Server ▸ Music server. Music ▸ Realtime owns Magenta playback and MIDI steering, with the transport, the recording's waveform, and Prompt A/B steering sent over the CLI's stdin protocol. Music ▸ Train owns LoRA/LoKr dataset inspection, launch, metrics, and run comparison. Music ▸ Separate shares the restoration surface with Audio. The Command Console remains available for raw command-level control. App-to-CLI tests reject any emitted flag absent from mere.run catalog --json.

Model family

  • music-acestep
  • music-acestep-xl-turbo
  • music-acestep-xl-turbo-lm4b
  • music-acestep-xl-sft
  • music-acestep-xl-base
  • music-acestep-lm-1.7b
  • music-acestep-lm-4b
  • music-minimax-music3
  • music-magenta-rt2-small
  • music-magenta-rt2-base
  • music-muscriptor-small
  • music-muscriptor-medium
  • music-muscriptor-large
  • music-separate-bs-roformer-viperx-1297
  • music-separate-bs-roformer-4stem
  • music-separate-mel-roformer-dereverb
  • music-separate-mel-roformer-denoise

Guides

Music guidance follows the command/cookbook shape used by the rest of mere.run: choose the command first, and then focus the guide with a model ID.

bash
mere.run guide music generate --model music-acestep
mere.run guide music generate --model music-acestep-xl-turbo
mere.run guide music analyze --model music-acestep-xl-turbo-lm4b
mere.run guide music generate --model music-minimax-music3
mere.run guide music generate --model music-magenta-rt2-small
mere.run guide music separate --model music-separate-bs-roformer-viperx-1297
mere.run guide music separate --model music-separate-bs-roformer-4stem
mere.run guide music separate --model music-separate-mel-roformer-dereverb
mere.run guide music separate --model music-separate-mel-roformer-denoise
mere.run guide music transcribe --model music-muscriptor-medium

There is no separate ace-step guide topic. ACE-Step text-to-music, covers, style-transfer covers, and source-audio understanding are documented under music generate and music analyze, because those are the public CLI surfaces.

Typical workflow

bash
swift run mere.run music generate \
  "upbeat electronic groove" \
  --output ./track.wav

swift run mere.run model pull music-minimax-music3 --accept-model-license
swift run mere.run music generate \
  "slow-burn dream pop about leaving a familiar city and finding home" \
  --model music-minimax-music3 \
  --compose \
  --duration 180 \
  --lyrics-preflight strict \
  --performance-mode q8-lm \
  --sampling-tier fast \
  --output ./minimax-composed-song.wav

swift run mere.run music generate \
  "cinematic synth-pop, female lead, 118 bpm, wide guitars" \
  --model music-minimax-music3 \
  --lyrics-file ./lyrics.txt \
  --duration 30 \
  --minimum-duration 30 \
  --sampling-tier fast \
  --seed 7 \
  --memory-mode staged \
  --performance-mode q8-lm \
  --output ./minimax-song.wav

swift run mere.run music generate \
  "cinematic synth-pop, female lead, 118 bpm, wide guitars" \
  --model music-minimax-music3 \
  --lyrics-file ./lyrics.txt \
  --duration 30 \
  --flow-strategy overlap-average \
  --seed-strategy stage-separated-v1 \
  --output ./minimax-overlap-average.wav

swift run mere.run music serve \
  --model music-minimax-music3 \
  --memory-mode resident \
  --performance-mode q8-lm \
  --port 8080

curl http://127.0.0.1:8080/v1/audio/speech \
  -H 'Content-Type: application/json' \
  -d '{"model":"music-minimax-music3","instructions":"cinematic synth-pop, female lead","input":"[Verse]\nNeon on the avenue","max_new_tokens":750,"sampling_tier":"fast","seed":7}' \
  --output ./minimax-speech-route.wav

swift run mere.run music generate \
  "dream-pop cover with soft vocals" \
  --source-audio ./song.mp3 \
  --analyze-source-audio \
  --audio-cover-strength 1.0 \
  --output ./cover.wav

swift run mere.run music generate \
  "modern reggaeton dance club remix, 96 bpm dembow rhythm, syncopated kick-snare groove, punchy 808 sub bass, bright Latin percussion" \
  --model music-acestep-xl-turbo \
  --source-audio ./song.mp3 \
  --analyze-source-audio \
  --audio-cover-strength 0.20 \
  --cover-noise-strength 0.0 \
  --output ./reggaeton-cover.wav

swift run mere.run music analyze ./song.mp3 \
  --model music-acestep-xl-sft \
  --lm-model music-acestep-lm-1.7b \
  > ./song-analysis.json

swift run mere.run model pull music-acestep-xl-turbo
swift run mere.run music generate \
  "cinematic synth pop with bright vocal harmonies" \
  --model music-acestep-xl-turbo \
  --output ./xl-track.wav

swift run mere.run model pull music-acestep-lm-4b
swift run mere.run music generate \
  "arena-scale rock anthem with stacked vocals" \
  --model music-acestep-xl-turbo \
  --use-lm \
  --lm-model music-acestep-lm-4b \
  --output ./xl-lm4b-track.wav

swift run mere.run music realtime \
  "ambient modular synths with brushed drums" \
  --model music-magenta-rt2-small \
  --duration 4 \
  --output ./live.wav \
  --no-play

swift run mere.run model pull music-muscriptor-medium --accept-model-license
swift run mere.run music transcribe ./song.mp3 --output ./song.mid

swift run mere.run model pull music-separate-bs-roformer-viperx-1297
swift run mere.run music separate ./song.mp3 --output-dir ./song-stems

swift run mere.run model pull music-separate-bs-roformer-4stem
swift run mere.run music separate ./song.mp3 \
  --model music-separate-bs-roformer-4stem \
  --output-dir ./song-4stems

swift run mere.run model pull music-separate-mel-roformer-dereverb
swift run mere.run music separate ./room.wav \
  --model music-separate-mel-roformer-dereverb \
  --output-dir ./room-restored

swift run mere.run model pull music-separate-mel-roformer-denoise
swift run mere.run music separate ./noisy.wav \
  --model music-separate-mel-roformer-denoise \
  --output-dir ./noise-restored

MiniMax Music 3 keeps --flow-strategy sequential and --seed-strategy legacy as its released defaults. --compose adds a local, two-pass constrained-JSON writer before music inference: the first pass plans a bar-aware timeline, and the second writes the structured three-part caption and lyrics against that timeline. Existing --lyrics or --lyrics-file content is authoritative and is preserved exactly; --instrumental produces section-only lyrics. Each phase has one bounded validation-guided repair attempt. The writer is unloaded before MiniMax weights load. Its typed blueprint, finished inputs, model ID, and lyric preflight are saved to <output>.composition.json and embedded in the generation recipe. Use --require-composer-installed to prevent implicit composer-model download.

--duration remains an output upper bound: MiniMax may emit EOS earlier. The default --lyrics-preflight warn reports sparse lyrics, missing long-form structure, unsupported tags, and composed section-budget mismatches before the checkpoint loads. strict rejects every issue, while off bypasses the check. Supplying a duration floor still masks EOS; preflight does not silently force one for sparse lyrics.

The default --performance-mode optimized keeps the global language model and residual-depth decoder in BF16. q8-lm and q4-lm quantize only the global language model while preserving BF16 depth codebooks and are the preferred quantized experiments. Legacy q8 and q4 continue to quantize both autoregressive components for compatible maximum compression. Recipes and profiles record the resolved precision of each component.

The experimental overlap-average strategy denoises one song-length latent and averages the velocities from overlapping flow windows at every Euler step; it then decodes the long latent in bounded DAV chunks. stage-separated-v1 derives stable, independent autoregressive and flow random streams so changes in one stage do not perturb the other. The default solver remains Euler with CFG active across every autoregressive frame and flow step. --flow-solver ab2 uses Euler for its first update and second-order Adams-Bashforth thereafter; --ar-cfg-frames 50 switches later autoregressive decoding to the conditional row; --flow-cfg-end 0.4 does the same after 40% of flow steps. These are opt-in A/B controls, not quality or speed presets. Schema 7 recipe JSON and schema 3 profiles record solver, guidance, performance mode, and resolved LM and depth precision. The speech-compatible HTTP route accepts the corresponding flow_solver, autoregressive_guidance_frames, flow_guidance_end, and lyric_preflight fields.

Optimized MiniMax modes periodically return completed autoregressive attention buffers to MLX while preserving live KV state. This bounds unified-memory use for long songs without changing seeded output. On an M4 Max, a matched forced 120-second Q8/draft render dropped from 110.20 GB to 23.78 GB peak physical footprint with a byte-identical float32 WAV; its autoregressive stage changed from 144.75 to 151.05 seconds. Process RSS alone does not include this Metal footprint, so long-form memory validation must use the macOS physical-footprint counter.

On the same 120-second fixture, sequential and overlap-average flow measured 454.31 and 464.38 seconds. Keep sequential as the performance default; overlap-average is available for explicit continuity experiments rather than as an acceleration preset.

Every MiniMax result is checked before export for non-finite samples, silence, implausible peaks, and a near-missing stereo channel. The recipe records RMS, peak, sample count, and stereo-collapse fraction. These checks fail generation instead of saving a corrupted long-form render.

music separate decodes the source at 44.1 kHz stereo, runs the pinned ViperX 1297 BS-RoFormer checkpoint, and writes vocals.wav, instrumental.wav, and separation.json. The instrumental is computed from the decoded mixture minus the vocal estimate, so the two stems close back to the exact working mixture. The JSON manifest is also emitted on stdout; progress stays on stderr.

The music-separate-bs-roformer-4stem profile uses the same native band-split graph with its separately pinned 384-dimensional, eight-layer checkpoint. It writes drums.wav, bass.wav, other.wav, vocals.wav, and separation.json in the checkpoint's published output order.

The MelBand profiles use a distinct 60-band native graph. Dereverb writes noreverb.wav; denoise writes dry.wav. Each mask is scattered back to its original STFT bins and averaged where mel bands overlap. The models share an exact 684-tensor, 228,203,172-scalar geometry but retain different weight and source-config hashes. The dereverb inference config publishes overlap 2; the denoise config publishes overlap 4.

The accepted AEmotion Studio snapshot uses the MIT License and is pinned at revision d323194290f8488ea51814143806609bfbd7a1e5. mere.run verifies the exact model, upstream YAML, model-card README, and license hashes before loading. Inference preserves each profile's published chunk geometry, centered 2,048-point STFT, 441-sample hop, DC filtering, 10% linear fades, and overlap default. Use a higher valid --overlap for denser chunk blending at additional compute cost, or --dtype float32 for an all-float32 model path.

MuScriptor predicts notes, instruments, and absolute event times. For MIDI output, mere.run adds a native musical-context pass that estimates tempo and beat phase from source-audio accents plus decoded note onsets, estimates meter from the beat-accent cycle, and estimates key from duration-weighted pitch classes. Standard tempo, time-signature, and key-signature events are embedded, with the meter repeated at the first downbeat to establish the bar boundary, without quantizing or moving notes. Use --context-output to inspect the values, confidence scores, and beat positions as JSON, or --no-musical-context for the legacy fixed-120-BPM writer.

MuScriptor treats --chunk-batch-size (default 4) as an upper bound, not a forced allocation. On Apple Silicon, the runtime subtracts active MLX and cache allocations plus a reserve of the greater of 4 GiB or one-eighth of physical memory. It estimates each requested chunk at numLayers * dim * 65,536 * max(1, beamSize) bytes for bfloat16 and float16; float32 doubles that lane estimate. A second, model-complexity-scaled limit caps useful live beam lanes at 8 for the large checkpoint and 32 for medium and small, so large with --beam-size 4 uses at most two chunks together even when memory allows more. This limit controls cross-chunk grouping. If one requested beam is wider than the budget, its live-beam forwards are microbatched while preserving the requested search width. The effective chunk group is selected once after model load at transcription start. The memory clamp is skipped when a unified-memory profile is unavailable, including non-Apple Linux hosts; the model-complexity limit still applies. Explicit --chunk-batch-size 1 always preserves the lowest-memory single-chunk path. Persistent cache state still scales with the requested beam width, so the policy reduces cross-chunk and forward pressure but does not guarantee admission when one beam cannot fit.

The cap reflects a matched warm M4 Max 128 GB measurement with music-muscriptor-large, 20 seconds/four chunks, beam size 4, and 64 maximum tokens per chunk. The pre-batching baseline took 22.38 seconds at 11.15 GB peak physical footprint. Chunk batch 1 took 4.70 seconds at 28.17 GB; chunk batch 2 had a 3.69-second median at 50.38 GB; and chunk batch 4 took 6.16 seconds at 87.48 GB. All JSON outputs had identical SHA-256 hashes. The adaptive two-chunk path was therefore about 6.1x faster than baseline at about 4.5x the peak footprint, while the four-chunk group was both slower and substantially larger. Lower-headroom systems fall back to one chunk, which measured about 4.8x faster than baseline at about 2.5x its peak footprint.

Greedy and sampling pipelines feed selected tokens into the next model step. Beam search packs live beams across the effective chunk group into as few bounded forwards per step as the lane budget allows, keeps an independently forked typed cache lane for every beam, and removes ended beams from later forwards.

ACE-Step generation uses the upstream CLI turbo shift default (--shift 3.0) and the native Haar DCW sampler correction (double, low 0.05, high 0.02) before VAE decode. The XL turbo managed ID installs the 4B DiT decoder plus the base ACE-Step VAE and Qwen3 text encoder; the -lm4b variant also installs the optional 4B 5 Hz LM for --use-lm runs. ACE-Step cover/repaint/extract tasks follow upstream and skip the 5 Hz LM phase so source-audio conditioning stays faithful.

ACE-Step task routing is typed and checkpoint-aware. Turbo/SFT support text-to-music, repaint, cover, and cover-nofsq; extract, lego, and complete are accepted only for Base checkpoints. Unknown task names fail in argument parsing, while incompatible checkpoint/task pairs fail before weight loading. XL-SFT and XL-Base use the native continuous flow schedule, real conditional and unconditional decoder batches, CFG/APG/ADG guidance intervals, velocity norm/EMA stabilization, and Euler or Heun ODE integration. Turbo remains the fast distilled path. Base uniquely enables extract, lego, and complete.

--quality draft|song|final|edit is model-aware. It selects checkpoint-safe steps, sampler, guidance, LM planning policy, and automatic duration behavior. The presets retain upstream's Euler sampler and disabled velocity controls; explicit flags still override them. They generate one candidate because upstream auto-scoring is disabled by default. --candidates N explicitly opts into the local warm best-of-N path. The independently managed 1.7B planner is the default; 4B is an explicit --lm-model music-acestep-lm-4b choice. Best-of-N ranking checks finite samples, level, clipping, DC offset, crest factor, spectral flatness, frame-energy movement, periodicity, time-varying spectral structure, and tail continuity. This prevents loud stationary noise or a prematurely dead ending from winning on level statistics alone.

Every ACE-Step generation writes 48 kHz stereo 24-bit WAV by default plus a schema 5 reproducible recipe JSON. The recipe records exact checkpoint repositories and immutable revisions, adapter hashes and scales, original and planner-rewritten captions, lyrics/instruction, the exact planner reasoning prefix, the final effective BPM, duration, key/scale, vocal language and time signature, task/edit configuration, planner temperature, top-k/top-p, repetition penalty, LM CFG scale, negative prompt, caption-rewrite policy, diffusion controls, candidate seeds and technical scores, export policy, and input/output hashes. When the 5 Hz LM is active, each candidate also records its semantic audio-code count. The generation seed drives both LM sampling and diffusion. --export-format float32 preserves a floating-point master; --daw-bundle adds candidates, extracted stems, synchronized lyric markers, and a portable REAPER project.

Retakes use exact spherical noise interpolation between --seed and --retake-seed. --flow-edit implements the upstream source/target velocity difference field over a configurable normalized window, including Monte Carlo forward-noise averaging and target-only finishing denoise. It is distinct from repaint: repaint preserves audio outside a time range, while flow edit morphs the whole source toward a new semantic target.

PEFT LoRA and LyCORIS LoKr adapters load natively with --adapter; multiple files stack and may use one shared or per-adapter scale. LoKr uses factored Kronecker evaluation instead of materializing full decoder deltas. Train either format with music train-adapter; its objective matches ACE-Step flow matching, and its output is directly reloadable by music generate or the resident server. Adapter training writes the same durable run_started, per-step loss/progress, run_finished, and run_failed event stream the Studio's Train tasks read, so a music run has live feedback and survives app relaunch.

music serve holds the complete pipeline and its adapters in memory. It provides GET /health, POST /v1/audio/music, and serialized POST /v1/audio/music/batches, with JSON/base64 or raw WAV responses. Binding outside loopback requires a bearer token. The API mirrors the CLI controls for checkpoint-aware tasks, quality, steps and scheduler, CFG/APG/ADG, retakes, cover strength/noise, repaint, flow edit, reference audio, LM metadata and sampling, complete-track classes, and tiled VAE decode. Song/final requests without duration_seconds use the resident LM planner; every JSON result returns conditioning_metadata with the values actually used. An explicit vocal_language constrains both planner metadata and lyric formatting; metadata_language remains a compatibility override. GET /health reports the independently resolved language_model_source alongside the resident DiT. Planner sampling fields use the same defaults and validation as the CLI: lm_temperature defaults to 0.85, lm_top_k to 0, lm_top_p to 0.9, and lm_repetition_penalty to neutral 1.0. lm_cfg_scale defaults to upstream's 2.0, and lm_negative_prompt defaults to NO USER INPUT. CFG is applied only to the semantic-code phase; metadata planning remains at 1.0 so guidance cannot distort the CoT text.

Batch items may select independent candidates values. The server serializes them through the warm session, returns every ranked candidate and exactly one selected winner per item, and rejects a request whose model does not match the resident model. Batch responses are JSON; raw response_format: "wav" is available on the single-generation endpoint.

Repaint is a real bounded edit, not a cover alias. --repaint-start and --repaint-end produce the upstream 25 Hz latent mask. The requested span is replaced by the checkpoint silence latent for conditioning, clean source latents outside it are re-injected at the appropriate noise level during early denoising, and latent crossfades soften both boundaries. After VAE decode the runtime splices the original pre-VAE waveform back outside the edit span, with a short waveform crossfade. --repaint-mode selects conservative, balanced, or aggressive preservation; --repaint-strength tunes balanced mode.

For covers, --analyze-source-audio runs ACE-Step audio understanding before the direct DiT cover pass. It converts the source audio to 5 Hz audio codes, asks the LM for source BPM, key/scale, language, and time signature, and fills only metadata fields you did not pass explicitly.

Use music analyze when you want that same ACE-Step audio-understanding result as a standalone JSON artifact before deciding how to prompt a cover or remix. It accepts the same ACE-Step model/checkpoint layout flags plus an optional --duration prefix limit for fast probes.

For faithful covers, keep --audio-cover-strength 1.0 and leave --cover-noise-strength at its default 0.0. For style-transfer covers, lower --audio-cover-strength so the text prompt can steer genre, keep --cover-noise-strength 0.0 while exploring, and use --reference-audio for an optional target-style/timbre example.

For interactive steering, pass --interactive. The command reads standard input while it runs, paces generation in real time, and applies changes between native frames:

bash
swift run mere.run music realtime \
  "ambient modular synths" \
  --model music-magenta-rt2-small \
  --duration 30 \
  --interactive

Supported steering commands are prompt <text>, style streaming|full, temp <value>, topk <value>, mc <value>, notes <value>, drums <value>, noteon <0-131>, noteoff <0-131>, onset 0|1, drumless on|off, unmask <value>, seed <value>, reset, quit, and help.

On macOS, music realtime can also listen to CoreMIDI input. Use --list-midi-inputs to find the source name or unique ID, then pass --midi-input to map incoming note-on/note-off messages to the same Magenta RT2 note controls used by stdin. Use --midi-monitor with --midi-log-raw when checking a controller before loading Magenta RT2:

bash
swift run mere.run music realtime --list-midi-inputs
swift run mere.run music realtime \
  --midi-monitor \
  --midi-input "OP-1 Bluetooth" \
  --midi-log-raw \
  --duration 30
swift run mere.run music realtime \
  "minimal synth pop, dry drums, tape-warped bass" \
  --model music-magenta-rt2-small \
  --duration 120 \
  --midi-input "OP-1 Bluetooth" \
  --midi-channel all \
  --midi-log-events \
  --midi-cc 1=temp:0.2:1.4 \
  --midi-cc 2=drums:0:2

--midi-cc mappings use cc=target:min:max. Supported targets are temp, topk, mc, notes, drums, drumless, unmask, seed, and onset. --midi-log-events writes parsed note and CC events to stderr during real-time runs, while --midi-log-raw writes raw packet bytes. Prompt changes still use stdin and may briefly stall while the prompt encoder runs; MIDI is intended for notes and continuous controls.

Runtime entrypoints

CLI

  • Sources/MereRunCLI/Commands/MusicAnalyzeCommand.swift
  • Sources/MereRunCLI/Commands/MusicGenerateCommand.swift
  • Sources/MereRunCLI/Commands/MusicServeCommand.swift
  • Sources/MereRunCLI/Commands/MusicTrainAdapterCommand.swift
  • Sources/MereRunCLI/Commands/MusicRealtimeCommand.swift
  • Sources/MereRunCLI/Commands/MusicTranscribeCommand.swift

Runtime

  • Sources/MereRunCore/ACEStep/ACEStepPipeline.swift
  • Sources/MereRunCore/ACEStep/ACEStepPipeline+Prompting.swift
  • Sources/MereRunCore/ACEStep/ACEStepPipeline+Generation.swift
  • Sources/MereRunCore/ACEStep/ACEStepTask.swift
  • Sources/MereRunCore/ACEStep/ACEStepRepaint.swift
  • Sources/MereRunCore/ACEStep/ACEStepFlowEdit.swift
  • Sources/MereRunCore/ACEStep/ACEStepGenerationSession.swift
  • Sources/MereRunCore/ACEStep/ACEStepAdapter.swift
  • Sources/MereRunCore/ACEStep/ACEStepAdapterTrainer.swift
  • Sources/MereRunCore/MagentaRT2/MagentaRT2Resources.swift
  • Sources/MereRunCore/MagentaRT2/MagentaRT2Renderer.swift
  • Sources/MereRunCore/MagentaRT2/MagentaRT2RealtimeSession.swift
  • Sources/MereRunCore/MuScriptor/MuScriptorTranscriber.swift

Reading order

The ACEStep runtime uses three phases:

  1. ACEStepPipeline.swift for the public pipeline and orchestration
  2. ACEStepPipeline+Prompting.swift for prompt preparation and conditioning
  3. ACEStepPipeline+Generation.swift for the generation path itself

See ACE-Step validation for immutable checkpoint pins, parity coverage, installed-model evidence, listening review fixtures, and measured performance.

This structure separates orchestration, prompt preparation, and generation.

Magenta RT2 is a native Apple Silicon macOS runtime. The managed model layout contains exported .mlxfn models, matching state files, and shared MusicCoCa and SpectroStream resources; raw upstream checkpoint files are not enough for mere.run.

--style-conditioning streaming matches upstream's real-time C++ path by using the coarsest MusicCoCa style tokens. --style-conditioning full uses all style tokens, matching upstream's high-level Python .mlxfn generator more closely.

Contributor notes

  • This is a native Swift/MLX path, not a Python bridge.
  • Magenta RT2 uses a pinned C application binary interface (ABI) bridge built by scripts/rebuild_magentart_xcframework.sh; Linux builds keep compiling with an unsupported-runtime error for Magenta.
  • Model resolution and storage follow the same canonical public rules as the rest of the repository.

Released under the MIT License.