Stem Sessions Build Plan

Turn every stemmed song into an Ableton set that opens ready to mix, using only plugins already on this Mac.

Measured 2026-09-08 on the Dr Wu iMac. Every count below came from a command, and the commands are named beside each one. Nothing has been built yet. This is the plan and the inventory behind it.

0Arena speed check

Asked first, answered first. The Spotlight fix from 2026-09-06 is holding.

Arena is healthy right now

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.

1What we have, counted

The inventory this plan stands on.

ThingCountHow it was counted
Songs with isolated stems, all disks278 ~/Projects/stem-map/stem-map.md, generated 2026-06-20
Individual stem files1,349same map, 27 artists across 45 albums
Stem sets reachable on internal disk today21 counted per pool, see below
Plugins Live actually found and loaded674 VST3, 12 VST2 PluginScanner.txt, unique found: lines
Waves plugins installed226 in V16, 208 in V12directory listing
Audio effect racks already built23 User Library, Audio Effect Rack folder
Drum racks already builtdozens, one per songUser Library, Drum Rack folder
Live version11.3.43app bundle, build 2025-10-06

Where the 21 local stem sets are

~/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.

2The headline finding

The hard part was built months ago and nobody had connected it to this.

Every stem lane has a matching rack that was built earlier, and all of them load

8 of 8

Checked both sides of the map on disk. The stem file exists and the rack file exists for all eight lanes.

Stem fileExisting rackBoth on diskLoads clean
drumkit/drums/kick.wavBC Kick Shaper YES0 unresolved
drumkit/drums/snare.wavBC Snare Crusher YES0 unresolved
drumkit/drums/hh.wavBC HiHat Polish YES0 unresolved
drumkit/drums/toms.wavBC Tom Thickener YES0 unresolved
drumkit/drums/cymbals.wavBC Overhead Room YES0 unresolved
band/bass.wavBass Bus YES0 unresolved
band/guitar.wavGtr YES0 unresolved
band/drums.wavBC Drum Bus Master YES0 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.

The reason they never break

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.

3Plugins, and which ones we own

Read from Live's own scanner log, so this is what will load rather than what is on disk.

Owned and worth putting in a template

JobWhat we ownNote
Drum transient shapingSmack Attack, TransX Multi Smack Attack is the one for kick and snare attack
Drum compressionAPI-2500, CLA-2A, CLA-76API-2500 for the drum bus
Drum room and reverbAbbey Road Chambers, H-Reverb, IR-L Chambers on the cymbals lane suits a room feel
BassBass Rider, CLA Bass, MaxxBass, RBass Bass Rider rides level before the compressor
Guitar toneCLA Guitars, Abbey Road Saturator, Kramer No amp sim owned, see the gap list below
VocalsCLA Vocals, Vocal Rider, DeEsser, Waves Tune Existing racks Brandon Vox Amazing and Girls Vox already wrap these
Bus glueNLS Buss, NLS Channel, SSL compNLS on every lane for console feel
Tape and saturationJ37, Kramer Tape, Abbey Road VinylKramer Tape is a Softube build
EQF6 dynamic EQ, Q10, H-EQ, Scheps 73, PuigTecF6 for surgical, Scheps 73 for tone
LimitingL1, L2, L3Master chain only
Reverb, non-WavesValhallaSupermassiveFree, and the only non-Waves verb here
SynthsArturia ARP 2600 V3, Jup-8 V4, Mini V3For writing on top of a stem set

Not owned, so nothing in the template may call them

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.

4How the build works

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.

The trap, found before writing any code

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.

The four stages

StageWhat happensReuses
1. ProbeRead the stem folder, find which lanes exist, get duration, sample rate, channel count and size per fileffprobe
2. AnalyseDetect tempo and key from the full mix so the set opens at the right BPM rather than 120analyze_audio.py from the mashup dashboard
3. AssembleClone 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. VerifyRe-open the written .als, count tracks and clips, confirm every referenced file exists on disk, then audit devices audit_ableton_devices.py

The gate that makes stage 4 worth having

A written file and exit 0 prove a script ran. They never prove the session is good. Stage 4 must measure content:

Any miss exits non-zero and writes nothing.

5Track layout of a finished session

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.

6Order of work

One song per pass, verified before the next, per the standing rule.

StepWorkEvidence required to close it
1Build 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
2Write build_stem_session.py, stages 1 to 4 runs on song13 and the four gate checks pass
3Open the generated song13 session in Live and play it all 8 clips present, audible, no missing-file dialog
4Run the remaining 5 band practice songs 5 sessions, each passing the gate
5Run the 11 jam-cull songs, which have a different lane set 11 sessions, gate passing on a 6-stem layout
6Decide whether to reach the 257 stem sets on the externals a count of what is worth generating

Two constraints to respect

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.

7What is not decided

Stated rather than guessed.

Measured on the Dr Wu iMac, 2026-09-08. Sources: ~/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.