Thirty-five sliders for generated music. Each one is a rank-4 LoRA on the frozen ACE-Step 1.5 XL turbo transformer whose strength is a number you set at sampling time. The prompt and the seed stay fixed and the same piece moves along one axis: sad to happy, solo to full ensemble, energetic to quiet and dreamy, electronic to jazz.
Every slider here was measured on 24 held-out prompts: does a property of the waveform follow the slider, does a second embedding model agree, how much of the piece survives, and do two quality predictors still rate the result as music. The numbers below come from that evaluation. Sliders that failed it were left out.
Live demo · Code, results, and paper draft · Ten-minute listening test
One prompt ("mellow jazz piano trio, brushed drums") and one seed per slider; only the slider position changes. Clips are loudness-matched.
Mood (text): sad → happy
Arousal (real-axes): energetic and aggressive → quiet and dreamy
Electronic to jazz (real-axes): electronic → jazz
Arousal (real-axes-sets): energetic and aggressive → quiet and dreamy
Harmony (measured-sets): simple harmony → rich harmony
ace-step-1.5-xl-turbo/text: 12 named attributes, trained from a prompt pair| Slider | Low → high | Waveform descriptor follows (ρ) | MuQ-MuLan agrees (ρ) | Usable positions | Piece kept | Enjoyment at the ends (6.95 unsteered) |
|---|---|---|---|---|---|---|
mood |
sad → happy | 0.39 | 0.88 | -1 to +2 | 0.79 | 6.65 |
ensemble |
solo → full ensemble | 0.60 | 0.77 | -1.5 to +2 | 0.80 | 6.56 |
groove |
stiff → groovy | none assigned | 0.56 | -1.5 to +2 | 0.79 | 6.88 |
harmony |
simple harmony → rich harmony | 0.41 | 0.73 | -1.5 to +2 | 0.83 | 6.64 |
melody |
texture → melody | 0.48 | 0.89 | -1 to +2 | 0.80 | 6.47 |
tension |
relaxed → tense | none assigned | 0.86 | -1.5 to +1 | 0.83 | 5.64 |
brightness |
dark → bright | 0.97 | 0.80 | -1 to +2 | 0.74 | 6.04 |
density |
sparse → dense | 0.78 | 0.86 | -0.5 to +2 | 0.84 | 6.09 |
energy |
calm → intense | 0.91 | 0.90 | -1.5 to +1.5 | 0.64 | 6.42 |
tempo |
slow → fast | 0.55 | 0.77 | -1 to +2 | 0.68 | 6.38 |
electronic |
acoustic → electronic | none assigned | 0.79 | -2 to +2 | 0.65 | 6.79 |
vintage |
modern → vintage | none assigned | 0.79 | -2 to +2 | 0.79 | 6.68 |
ace-step-1.5-xl-turbo/real-axes: axes found in real music, trained from the axis's own tagsThe axes are independent components of MuQ-MuLan embeddings of 14,985 real recordings. Nobody chose them. The prompt pair for each slider is the set of tags at the two ends of its axis, and the output is scored by its projection on the axis, in standard deviations of real music.
| Slider | Low → high | Follows the axis (ρ) | Ends ordered | Moved between -1 and +1 (std of real music) | Usable positions | Piece kept at ±1 |
|---|---|---|---|---|---|---|
arousal |
energetic and aggressive → quiet and dreamy | 0.91 | 100% | 1.85 | -2 to +1 | 0.80 |
jazz_electronic |
electronic → jazz | 0.86 | 97% | 1.86 | -2 to +2 | 0.82 |
piano_axis |
organ and rock → piano | 0.78 | 97% | 1.56 | -2 to +1 | 0.80 |
strings_synth |
synthesizer and choir → guitars and strings | 0.80 | 97% | 1.78 | -0.5 to +2 | 0.73 |
valence |
playful and happy → dark and distorted | 0.42 | 75% | 0.86 | -2 to +1 | 0.85 |
ace-step-1.5-xl-turbo/real-axes-sets: the same kind of axis, trained with no textTrained between the top and bottom 20% of the model's own clips along the axis (15,552 clips, 648 prompts). They move less than the prompt-pair versions, keep more of the piece, and hold quality level at both ends. Use them between -1 and +1.
| Slider | Low → high | Follows the axis (ρ) | Ends ordered | Moved between -1 and +1 (std of real music) | Piece kept at ±1 |
|---|---|---|---|---|---|
acoustic_electronic |
studio electronic → acoustic and blues | 0.55 | 93% | 0.64 | 0.86 |
arousal |
energetic and aggressive → quiet and dreamy | 0.82 | 99% | 1.19 | 0.84 |
classical_funk |
funk and drums → classical and epic | 0.64 | 96% | 0.77 | 0.85 |
jazz_electronic |
electronic → jazz | 0.61 | 94% | 0.61 | 0.87 |
piano_axis |
organ and rock → piano | 0.63 | 96% | 0.75 | 0.87 |
strings_synth |
synthesizer and choir → guitars and strings | 0.40 | 82% | 0.44 | 0.87 |
valence |
playful and happy → dark and distorted | 0.50 | 93% | 0.62 | 0.87 |
ace-step-1.5-xl-turbo/measured-sets: a measurement turned into a slider, with no textClips sorted by a measurement, after removing what loudness, brightness, and predicted enjoyment explain. These are the selective sliders: selectivity is how far a slider moves its own measurement relative to the average bystander. Use them between -1 and +1.
| Slider | Sorted by | Follows the measurement (ρ) | Ends ordered | Selectivity | Piece kept at ±1 |
|---|---|---|---|---|---|
energy |
flux | 0.83 | 99% | 3.8 | 0.85 |
harmony |
harmonic change | 0.72 | 99% | 6.6 | 0.88 |
density |
onset rate | 0.63 | 90% | 4.7 | 0.87 |
ensemble |
pc | 0.60 | 94% | 2.4 | 0.86 |
quality |
ce | 0.53 | 86% | 3.7 | 0.86 |
ace-step-1.5-xl-turbo/graded: trained with no text at graded positions, usable from -2 to +2The set trainer above shows the slider only positions -1 and +1, and its sliders fall apart past ±1. These six were trained with every clip at its own position along the measurement or axis. They move slightly less inside ±1 and keep working out to ±2 with no loss on either quality predictor.
| Slider | Low → high | Follows it, -2 to +2 (ρ) | Ends ordered | Piece kept at ±2 | Enjoyment at the ends |
|---|---|---|---|---|---|
energy |
calm → intense | 0.89 | 100% | 0.81 | 7.15 |
harmony |
simple harmony → rich harmony | 0.60 | 92% | 0.85 | 7.11 |
arousal |
energetic and aggressive → quiet and dreamy | 0.84 | 96% | 0.82 | 7.20 |
valence |
playful and happy → dark and distorted | 0.50 | 82% | 0.85 | 7.13 |
jazz_electronic |
electronic → jazz | 0.62 | 93% | 0.85 | 7.14 |
piano_axis |
organ and rock → piano | 0.64 | 89% | 0.84 | 7.19 |
axes/ holds the direction vectors of the real-music axes, so new clips can be scored against them.
pip install "audiosliders[model,demo] @ git+https://github.com/takakhoo/audio-diffusion-control" audiobox_aesthetics
A page where you type a prompt and drag the sliders:
python -m audiosliders.server --sliders hf:ace-step-1.5-xl-turbo/text --backbone ace-turbo
From Python:
import soundfile as sf
from audiosliders.backbone import load_backbone
from audiosliders.hub import fetch
from audiosliders.lora import SliderBank
model = load_backbone("ace-turbo") # downloads ACE-Step 1.5 XL turbo
bank = SliderBank(model.dit)
folder = fetch("ace-step-1.5-xl-turbo/real-axes")
bank.load("arousal", folder / "arousal.safetensors")
for position in (-2.0, 0.0, 1.0):
audio = model.generate(["mellow jazz piano trio, brushed drums"], [0], seconds=10,
wrap=lambda p: bank.gated(p, {"arousal": position}))
sf.write(f"arousal_{position:+.0f}.wav", audio[0].T.cpu().numpy(), model.sample_rate)
Position 0 is the unchanged model. Several sliders can be loaded and set together; their updates add.
audiosliders.lora.SliderBank.MIT, the same as ACE-Step 1.5. The training objective for the prompt-pair sliders is Concept Sliders (Gandikota et al., ECCV 2024), and the idea of discovering axes instead of naming them comes from SliderSpace (Gandikota et al., ICCV 2025).
ace-step-1.5-xl-turbo/real-axes-sets/classical_funk.safetensors 40 MBace-step-1.5-xl-turbo/real-axes-sets/acoustic_electronic.safetensors 40 MBace-step-1.5-xl-turbo/graded/arousal.safetensors 40 MBace-step-1.5-xl-turbo/graded/jazz_electronic.safetensors 40 MBace-step-1.5-xl-turbo/graded/piano_axis.safetensors 40 MBace-step-1.5-xl-turbo/graded/valence.safetensors 40 MBace-step-1.5-xl-turbo/real-axes-sets/arousal.safetensors 40 MBace-step-1.5-xl-turbo/real-axes-sets/jazz_electronic.safetensors 40 MBace-step-1.5-xl-turbo/real-axes-sets/piano_axis.safetensors 40 MBace-step-1.5-xl-turbo/real-axes-sets/strings_synth.safetensors 40 MBace-step-1.5-xl-turbo/real-axes-sets/valence.safetensors 40 MBace-step-1.5-xl-turbo/text/ensemble.safetensors 40 MBace-step-1.5-xl-turbo/graded/harmony.safetensors 40 MBace-step-1.5-xl-turbo/text/density.safetensors 40 MBace-step-1.5-xl-turbo/text/harmony.safetensors 40 MBace-step-1.5-xl-turbo/text/brightness.safetensors 40 MBace-step-1.5-xl-turbo/graded/energy.safetensors 40 MBace-step-1.5-xl-turbo/measured-sets/harmony.safetensors 40 MBace-step-1.5-xl-turbo/text/electronic.safetensors 40 MBace-step-1.5-xl-turbo/text/melody.safetensors 40 MBace-step-1.5-xl-turbo/text/tempo.safetensors 40 MBace-step-1.5-xl-turbo/text/vintage.safetensors 40 MBace-step-1.5-xl-turbo/measured-sets/density.safetensors 40 MBace-step-1.5-xl-turbo/real-axes/strings_synth.safetensors 40 MBace-step-1.5-xl-turbo/text/energy.safetensors 40 MBace-step-1.5-xl-turbo/text/groove.safetensors 40 MBace-step-1.5-xl-turbo/text/mood.safetensors 40 MBace-step-1.5-xl-turbo/measured-sets/ensemble.safetensors 40 MBace-step-1.5-xl-turbo/real-axes/jazz_electronic.safetensors 40 MBace-step-1.5-xl-turbo/text/tension.safetensors 40 MBace-step-1.5-xl-turbo/measured-sets/energy.safetensors 40 MBace-step-1.5-xl-turbo/measured-sets/quality.safetensors 40 MBace-step-1.5-xl-turbo/real-axes/arousal.safetensors 40 MBace-step-1.5-xl-turbo/real-axes/piano_axis.safetensors 40 MBace-step-1.5-xl-turbo/real-axes/valence.safetensors 40 MB