I had a back catalogue of Ableton projects, originally produced on Windows 10
with VST2 plugins, that I could no longer open on a VST3-only Mac. Every
synth track came up empty. The usual advice is "you should have saved your
presets" — but it turns out you don't need to. The full patch state is already
inside the .als file. This is the tool + the trick for getting it back.
als_extract.py is one self-contained Python 3 script (stdlib only). It reads a
project and either reconstructs loadable .fxp presets (Serum, Sylenth1) or
recovers the exact preset names to reload by hand (Native Instruments / Komplete
Kontrol). It only reads the project you point it at; it never modifies it.
You can read the origin straight out of the file. Native Instruments presets, hosted through Komplete Kontrol, still carry their original Windows install paths inside the project:
C:\Program Files\Common Files\Native Instruments\Super 8 R2\Presets\Gamey.nksf
D:\Users\you\Native Instruments\Studio Drummer\Snapshots\Garage Kit - Full\...
F:\Users\you\Native Instruments\Battery 4 Factory Library\Kits\Techno Wikinger Kit.nbkt
Those projects were VST2 on Windows. Two things broke them on the move to a modern Mac:
- Komplete Kontrol dropped VST2. Modern KK is VST3/AU only (VST2 ended after
the 2.x line), so the
Komplete KontrolVST2 the projects reference simply doesn't exist anymore. - Serum / Sylenth1 are VST3 on the Mac. Live opens the project, finds no VST2 to instantiate, and the track is silent.
But Live had already serialized each plugin's complete state into the .als when
the project was saved. Nothing was lost — it just had nothing to load it into.
A .als is gzipped XML. Each VST2 instrument's state is stored as a hex
<Buffer> blob. There are two kinds:
- Opaque-state synths (Serum, Sylenth1). The blob is the patch. The VST2
.fxppreset format is just a tiny header (CcnK/FPCh, big-endian) wrapped around exactly this chunk. Rebuild that header around the blob and you get a.fxpthat the VST3 build loads for backward-compatibility — even if the original preset file is gone from disk. (Two gotchas the script handles: Sylenth1's chunk is1lys-prefixed and must not be decompressed; when a synth was hosted inside Komplete Kontrol, its chunk is nested in KK's state.) - NI / Komplete Kontrol. The state is opaque and can't be rebuilt from outside Live, but the blob stores the hosted plugin, preset name, library, and file path in plaintext — so you get the exact name to reload by hand in KK VST3.
# List every plugin, recovered preset names, and the project's origin
python3 als_extract.py inspect "My Song.als"
# Rebuild .fxp presets for each Serum/Sylenth1 track (default: project folder)
python3 als_extract.py fxp "My Song.als" -o ./recoveredExample inspect output on an unrecovered Windows project:
Project : coast roller [pre-recovery backup].als
Saved by: Ableton Live 9.7.7
Origin : Windows VST2 project (drive paths in blobs: F:\)
[2-Komplete Kontrol] Komplete Kontrol -> NI/KK: reload by name: Techno Wikinger Kit.nbkt (Battery 4 Factory Library)
[4-Sylenth1] Sylenth1 -> recoverable as .fxp (run: fxp)
[5-Komplete Kontrol] Komplete Kontrol -> NI/KK: reload by name: Scarbee Pre-Bass - Amped - Fat.nki (Scarbee Pre-Bass Amped)
Then drop the generated .fxp into the VST3 plugin's preset browser, or reload
the named NI preset in Komplete Kontrol.
- Validated on Serum and Sylenth1 (
.fxpreconstruction) and NI/Komplete Kontrol (name recovery), across projects saved by Live 9, 10, and 12. - Effects and unsupported instruments are reported but not reconstructed.
- The project-embedded chunk can differ from the original disk preset — that's a feature: it preserves tweaks you made after loading the preset.
- A reconstructed Serum/Sylenth patch loads the sound; NI/KK presets are reload-by-name, not auto-loaded (KK's VST3 state container isn't writable from outside Live).