Turn every stemmed song into an Ableton set that opens ready to mix, using only plugins already on this Mac.
Asked first, answered first. The Spotlight fix from 2026-09-06 is holding.
MTGA pid 81141 state R 86.6% CPU top process on the machine loadavg 4.81 / 3.47 / 3.67 (4 threads) procs in I/O wait 1 (was 6 to 12 during the bad spell) mdworkers 5 (was 21 to 35) disk0 48 tps (peak measured 1,924) disk free 26 Gi 98% full
State R and 86.6% CPU is the healthy shape. When Arena
was broken it read state U at 2 to 8% CPU, which is a process blocked on disk rather
than one doing work.
Both .metadata_never_index markers survived the reboot, so
Spotlight is no longer grinding the two full external drives. That was the root cause and it stays
fixed without any further action.
One thing to watch. Audacity was at 71.7% and a Python job at
25.9% while Arena held 86.6%, so the machine was carrying about 185% of its 400% ceiling. Arena
still won, which is the priority scheme working. If it stalls again, run
bash ~/Projects/_outputs/arena-priority/arena_priority.sh.
The inventory this plan stands on.
| Thing | Count | How it was counted |
|---|---|---|
| Songs with isolated stems, all disks | 278 | ~/Projects/stem-map/stem-map.md, generated 2026-06-20 |
| Individual stem files | 1,349 | same map, 27 artists across 45 albums |
| Stem sets reachable on internal disk today | 21 | counted per pool, see below |
| Plugins Live actually found and loaded | 674 VST3, 12 VST2 | PluginScanner.txt, unique found: lines |
| Waves plugins installed | 226 in V16, 208 in V12 | directory listing |
| Audio effect racks already built | 23 | User Library, Audio Effect Rack folder |
| Drum racks already built | dozens, one per song | User Library, Drum Rack folder |
| Live version | 11.3.43 | app bundle, build 2025-10-06 |
~/Projects/_outputs/jam-cull-stems/htdemucs_6s 11 songs 8.28 band practice v3 (5-lane drumsep) 6 songs ~/Projects/_outputs/split-guitars/htdemucs_6s 2 songs ~/Projects/_outputs/stems/htdemucs_6s 1 song /Volumes/T7 Shield/bandpractice_stems/htdemucs_6s 1 song
The other 257 sit on the externals and on the Phish jam corpus. Start with the 21, since they are on the internal disk and the internal disk is fast.
The hard part was built months ago and nobody had connected it to this.
Checked both sides of the map on disk. The stem file exists and the rack file exists for all eight lanes.
| Stem file | Existing rack | Both on disk | Loads clean |
|---|---|---|---|
drumkit/drums/kick.wav | BC Kick Shaper | YES | 0 unresolved |
drumkit/drums/snare.wav | BC Snare Crusher | YES | 0 unresolved |
drumkit/drums/hh.wav | BC HiHat Polish | YES | 0 unresolved |
drumkit/drums/toms.wav | BC Tom Thickener | YES | 0 unresolved |
drumkit/drums/cymbals.wav | BC Overhead Room | YES | 0 unresolved |
band/bass.wav | Bass Bus | YES | 0 unresolved |
band/guitar.wav | Gtr | YES | 0 unresolved |
band/drums.wav | BC Drum Bus Master | YES | 0 unresolved |
Audited with ableton-rig-doctor/audit_ableton_devices.py, which is the tool that
catches a rack calling a plugin this Mac does not have. Every one returned
"every referenced device resolves on this Mac" and exit 0.
Those racks are built from Ableton stock devices only. Reading
inside them finds Eq8, Compressor2, Saturator,
GlueCompressor and Gate. Names like "Kick Comp" and "Snare Snap" are
renamed chains inside the rack, not third-party plugins.
That is the strongest possible foundation. Stock devices load instantly, cannot go grey from a licence problem, need no iLok, and open on any Mac. A session built on these will still open in five years.
Read from Live's own scanner log, so this is what will load rather than what is on disk.
| Job | What we own | Note |
|---|---|---|
| Drum transient shaping | Smack Attack, TransX Multi | Smack Attack is the one for kick and snare attack |
| Drum compression | API-2500, CLA-2A, CLA-76 | API-2500 for the drum bus |
| Drum room and reverb | Abbey Road Chambers, H-Reverb, IR-L | Chambers on the cymbals lane suits a room feel |
| Bass | Bass Rider, CLA Bass, MaxxBass, RBass | Bass Rider rides level before the compressor |
| Guitar tone | CLA Guitars, Abbey Road Saturator, Kramer | No amp sim owned, see the gap list below |
| Vocals | CLA Vocals, Vocal Rider, DeEsser, Waves Tune | Existing racks Brandon Vox Amazing and Girls Vox already wrap these |
| Bus glue | NLS Buss, NLS Channel, SSL comp | NLS on every lane for console feel |
| Tape and saturation | J37, Kramer Tape, Abbey Road Vinyl | Kramer Tape is a Softube build |
| EQ | F6 dynamic EQ, Q10, H-EQ, Scheps 73, PuigTec | F6 for surgical, Scheps 73 for tone |
| Limiting | L1, L2, L3 | Master chain only |
| Reverb, non-Waves | ValhallaSupermassive | Free, and the only non-Waves verb here |
| Synths | Arturia ARP 2600 V3, Jup-8 V4, Mini V3 | For writing on top of a stem set |
Probed the scanner log by name. Zero hits for each of these:
FabFilter Pro-Q, Pro-C, Pro-L, Pro-R none Soundtoys Decapitator, EchoBoy, Devil-Loc none iZotope Ozone, Neutron, RX, Trash, Nectar none Melodyne none Sonnox Oxford series none Plugin Alliance brainworx, bx_ series none Amp sims Amplitube, Bias, Neural, Helix, TH-U none Native Instr Guitar Rig, Kontakt, Massive none
The one real gap is a guitar amp sim. Everything else on that list has a Waves equivalent already installed. For guitar the workaround is CLA Guitars plus Abbey Road Saturator, which colours a signal that was amped when it was recorded rather than modelling an amp.
Clone a template, rewrite the sample pointers, never author a set from scratch.
An .als file is gzipped XML. Confirmed by reading Live's own default
template, which decompresses to XML with an <Ableton MajorVersion="5"> root. A
real session read from the T7 has 8 AudioClip blocks and 8 matching
SampleRef blocks, one per audio clip.
A sample path is not stored as a string. It is stored as a chain of directory elements:
<RelativePath> <RelativePathElement Dir="Samples" /> <RelativePathElement Dir="Recorded" /> </RelativePath> <Name Value="0007 1-Audio.aif" /> <PathHint> <RelativePathElement Dir="Users" /> <RelativePathElement Dir="drwu" /> </PathHint>
A naive find-and-replace on a path string finds nothing to replace and silently
produces a session with every clip missing. The script has to rebuild the
RelativePathElement chain, and also update Name, FileSize,
Crc, DefaultDuration and DefaultSampleRate per stem.
This is the same class of bug as the GPIF shared-element problem, where a run meant to add 459 notes produced 66,727. Same lesson: read the real structure before editing it, and count before and after.
| Stage | What happens | Reuses |
|---|---|---|
| 1. Probe | Read the stem folder, find which lanes exist, get duration, sample rate, channel count and size per file | ffprobe |
| 2. Analyse | Detect tempo and key from the full mix so the set opens at the right BPM rather than 120 | analyze_audio.py from the mashup dashboard |
| 3. Assemble | Clone the template, add one audio track per lane, rewrite each
SampleRef, attach the matching rack, name and colour each track |
the 8 racks above |
| 4. Verify | Re-open the written .als, count tracks and clips, confirm every
referenced file exists on disk, then audit devices |
audit_ableton_devices.py |
A written file and exit 0 prove a script ran. They never prove the session is good. Stage 4 must measure content:
SampleRef path resolves to a file that exists, checked by
rebuilding the path from its Dir chain and calling os.path.exists.Any miss exits non-zero and writes nothing.
What opens when you double-click the file.
1 KICK drumkit/drums/kick.wav BC Kick Shaper -> DRUMS bus 2 SNARE drumkit/drums/snare.wav BC Snare Crusher -> DRUMS bus 3 HIHAT drumkit/drums/hh.wav BC HiHat Polish -> DRUMS bus 4 TOMS drumkit/drums/toms.wav BC Tom Thickener -> DRUMS bus 5 CYMBALS drumkit/drums/cymbals.wav BC Overhead Room -> DRUMS bus 6 BASS band/bass.wav Bass Bus -> MASTER 7 GUITAR band/guitar.wav Gtr -> MASTER 8 DRUMS REF band/drums.wav (muted, A/B reference) BUS DRUMS BC Drum Bus Master RET A ValhallaSupermassive (room) RET B Abbey Road Chambers (plate) MASTER Maag Master4 or Mixing & Mastering
Track 8 muted on purpose. It is the un-split drum stem, there so you can unmute and A/B the five separated lanes against the source in one click. That catches a bad DrumSep run immediately.
Songs with fewer lanes still work. A plain htdemucs 6-stem set has vocals, drums, bass, guitar, piano and other, with no drum split. Stage 1 finds what exists and stage 3 builds only those tracks, so an 11-song jam-cull set and a 5-lane band practice set both produce a valid session.
One song per pass, verified before the next, per the standing rule.
| Step | Work | Evidence required to close it |
|---|---|---|
| 1 | Build the template .als by hand in Live, 8 tracks, buses and returns
wired, racks attached, saved to the User Library Templates folder |
the file opens in Live 11.3.43 with zero grey devices |
| 2 | Write build_stem_session.py, stages 1 to 4 |
runs on song13 and the four gate checks pass |
| 3 | Open the generated song13 session in Live and play it | all 8 clips present, audible, no missing-file dialog |
| 4 | Run the remaining 5 band practice songs | 5 sessions, each passing the gate |
| 5 | Run the 11 jam-cull songs, which have a different lane set | 11 sessions, gate passing on a 6-stem layout |
| 6 | Decide whether to reach the 257 stem sets on the externals | a count of what is worth generating |
Disk. The internal disk is at 98% full with 26 Gi free. A session file is small, a few hundred KB, so 21 of them cost nothing. Do not let the script copy or collect stems into the project folder, since that would duplicate gigabytes. Point at the existing stem paths on disk.
Version. Memory records the Ableton target as
11.3.30 and the installed app is 11.3.43. Run
ableton-version-fitter on the template before generating 21 copies of it, so a version
mismatch is caught once rather than 21 times.
Stated rather than guessed.
~/Projects/stem-map/stem-map.md (2026-06-20)
· ~/Library/Preferences/Ableton/Live 11.3.43/PluginScanner.txt
· ~/Music/Ableton/User Library/Presets/Audio Effects/Audio Effect Rack/
· ableton-rig-doctor/audit_ableton_devices.py
· /Applications/Ableton Live 11 Suite.app/Contents/App-Resources/Builtin/Templates/DefaultLiveSet.als.
Arena figures from ps, iostat and sysctl vm.loadavg at 11:17:43.