Music and ambience playbook (local, free, instrumental)

The process is stage 3 (samples, approval) and stage 8 (full hour, softness check, listening pack) of SPEC.md; commands in runbook.md §3, §8, §M.

Used for the reference run. All local: no cloud, no third-party tracks, no licence questions beyond the model's (ACE-Step 1.5 is MIT-licensed).

Stack

Recipe (60 minutes)

# music server running, then:
(see the runbook §8-§9: music_build.py → listening pack → ffmpeg mux, all from the video folder)

Result: 1.1 GB, 3600.000 s, 86,400 video frames (exactly 24 × 3600), music ≈ −22.5 LUFS, ambience ≈ −36 LUFS (14 dB under the music).

Softness check (scripts/audio_qc.py) — added after the first hour had screechy/scratchy moments

What we learned

Healing piano with rain (Video-Zen4; from the user's feedback)

What the user approved: a "healing song" = very slow, soft piano with a warm airy pad far in the background, D minor, 44 BPM, prompt: "Very slow, soft, healing ambient piano. Sparse felt piano notes, warm and muted, played very softly with long sustain and lots of silence, a warm airy pad far in the background. Peaceful, calm, tender, comforting, a quiet rainy night by the sea. no drums, no percussion, no vocals, no sharp sounds." (seed 32 sample; the hour used keys D minor, F major, A minor, C major, G minor and BPM 44, 40, 46, 42). Three styles offered, each checked with audio_qc: A piano + pad (chosen), B cello + soft piano, C Rhodes + pad. Harp and nylon-guitar takes failed the check (too bright) even after the low-pass; add "muted, low register, dark rounded tone, no bright sounds" and lower the low-pass to 5.5 kHz with a −5 dB shelf at 2.5 kHz when a style fails. Known problem, not yet solved by ear: "lots of silence" in the prompt makes the piano fall to near-silence every ~5 s (Lessons D12). Ask for a steadier pad and more frequent notes in the prompt, or lift the tails with scripts/upcomp.py; check the 1-second envelope of the finished hour, and let the user hear it before the full render.

Rain (replaces the procedural rain, which the user rejected as "white noise")

Snowy-night piano hour (The First Tram and Corner Store, 2026-10-17; approved: sample A + ambience)

Approved piano (style A): "Very slow, soft, healing ambient piano. Gentle felt piano playing a calm flowing melody with steady, frequent soft notes and long sustain, a warm airy pad holding underneath the whole time. Peaceful, tender, comforting, a quiet snowy night in a small town. no drums, no percussion, no vocals, no sharp sounds.", seed 32, 44 BPM, F major. The hour: music_build.py --minutes 60 --no_ambience --keys "F major,D minor,C major,A minor,Bb major,G minor" --bpms "44,42,46,40" (26 pieces of 150 s, ~50 min incl. retakes; most pieces needed 1–3 takes before audio_qc passed). Other styles tried (all pass audio_qc unless noted): B piano + strings "nostalgic lullaby" (seed 44), C soft electric piano + muted felt piano (seed 54, add "no bells"), D slow jazz-ballad piano (61), E minimalist piano + soft cello (91), F muted upright piano, "late at night so no one wakes up" (82). Failed: "nostalgic anime-style piano with flowing arpeggios", 7 seeds, loud note jumps and bright notes; a bell word in a prompt gave a high-frequency tone. 30 s samples: ACE-Step pieces asked for 30 s often end at ~23 s and then go silent (that looked like "dips"); generate 40 s and cut 30 s (fade out 3 s). Sample QC = audio_qc.py on the cut MP3 + the share of 1 s windows more than 6 dB under the median (12–25 % is normal for solo piano). The finished hour failed the check at first (2 harsh events, 143 loud-note warnings, 16 % quiet windows): fix = upcomp.py --max_up 8 --ratio 0.75 --release 1.8 (the older 9 / 0.8 / 1.6 added two dropouts), loudnorm -22, and a local softening of the 2 harsh spots: crossfade (0.4 s) to a 3× lowpass 2.2 kHz copy over 1.3–2.5 s around each event, then re-run audio_qc = 0 harsh events. Winter-night ambience (MOSS, jobs/<id>/amb_jobs.json, snow_bed_jobs.json): bed = "Quiet snowy winter night in a small town street, soft gentle wind, hushed muffled air, snow falling softly, very calm and peaceful, no voices, no music, no traffic" (18 clips of 30 s, ~19 s each; wind is gusty, so rain_bed.py limits are re-calibrated on the approved clip: --max_swing 11 --max_tone 32 --centroid_tol 0.40 --min_ok 7; drop clips far quieter than the rest, e.g. −51 dB RMS); hum = "Faint soft electrical hum of a small convenience store heard from outside..." (band 60–2500 Hz, −12.9 dB under the bed); bell = "A single old tram bell ringing twice, very far away down a quiet snowy street at night, soft and distant..." (lowpass 3.5 kHz + light echo, −8 dB, one every 3–7 min). scripts/amb_layers.py puts bed + hum + shots together; final mix music −22 LUFS, ambience −36 LUFS (−6.6 dB on the −29.4 LUFS layer), fades 3 s / 6 s → −21.8 LUFS, peak −4.5 dBFS, 0 harsh events. Listening pack for the hour:* 12 × 5 s = the 4 biggest note jumps, both softened spots, 3 bells, 3 random moments (listening_pack.txt lists their times).

YouTube notes (from web search on 2026-09-23; verify current policy yourself)