From 3060213e3644262991be048bb5b367ec417c0c09 Mon Sep 17 00:00:00 2001 From: "prompt.ac/@jeffrey" Date: Sun, 12 Jul 2026 22:00:06 -0700 Subject: [PATCH] =?UTF-8?q?ableton:=20ship=20the=20blank=20Set=20as=20a=20?= =?UTF-8?q?browser=20template=20=E2=80=94=20the=20auto-default=20stays=20u?= =?UTF-8?q?nsolved?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ableton-template.mjs builds the stripped Set (1 audio track + Main, no MIDI, no returns) and installs it to each Mac's User Library/Templates, so Live's browser lists it under Templates > AC Blank. Verified on neo and blueberry. What it is NOT: the Set that ⌘N opens. That is still Ableton's stock 2-MIDI/2-audio/2-return default, and three plausible mechanisms were ruled out across full Live restarts rather than assumed: - BaseFiles/ is not the default-set source. It is only where Live copies a Set opened from outside the User Library, as a working copy. - "Save Live Set As Default Set..." behaves like a template save — it writes to User Library/Templates and ⌘N is unchanged afterwards. - No default/template/.als pointer is written to Preferences.cfg. Recorded in TEMPLATE.md so nobody re-walks them. Next lead is watching Live's file I/O during ⌘N to see what it actually reads. Co-Authored-By: Claude Opus 4.8 (1M context) --- reference/ableton/TEMPLATE.md | 27 ++++++++--- toolchain/macos/fleet/README.md | 15 +++++++ toolchain/macos/fleet/ableton-template.mjs | 52 ++++++++++++++++++++++ 3 files changed, 87 insertions(+), 7 deletions(-) create mode 100644 toolchain/macos/fleet/ableton-template.mjs diff --git a/reference/ableton/TEMPLATE.md b/reference/ableton/TEMPLATE.md index 4cc98b4e50..bc3e44e1db 100644 --- a/reference/ableton/TEMPLATE.md +++ b/reference/ableton/TEMPLATE.md @@ -43,13 +43,26 @@ the requested tracks and no repair prompt. (Confirmed for the 1-audio/0-MIDI/0-r Note the base is Live 12.2.1 schema (`MinorVersion="12.0_12203"`); 12.4.2 opens it fine and re-serializes on save. -## Known gap: this is not yet the *default* Set +## Installing it -Getting Live to use this for **New Live Set** is unsolved. Two dead ends worth recording so nobody +`toolchain/macos/fleet/ableton-template.mjs` builds this and drops it in each fleet Mac's +`~/Music/Ableton/User Library/Templates/`, so it shows up in Live's browser under **Templates > AC +Blank** — one click to a genuinely blank Set. + +## Known gap: this is NOT the auto-default (⌘N) + +Making this the Set that **New Live Set** opens is unsolved. ⌘N still gives Ableton's stock +2-MIDI/2-audio/2-return Set. Three dead ends, all verified across full Live restarts, so nobody repeats them: -- `~/Library/Preferences/Ableton/Live /BaseFiles/` is **not** the default-set source. Live copies - any Set opened from outside the User Library into there as a working copy. Dropping an `.als` there - changes nothing — verified across a full Live restart. -- `File > Save Live Set As Default Set…` did not visibly commit a default in testing; it surfaced a - rename field on a new `Templates/Untitled.als` instead. The mechanism still needs pinning down. +- **`BaseFiles/` is not the default-set source.** `~/Library/Preferences/Ableton/Live /BaseFiles/` + is just where Live copies a Set that was opened from *outside* the User Library, as a working copy. + Dropping an `.als` there changes nothing. +- **`File > Save Live Set As Default Set…` behaves like a template save.** It writes the current Set to + `User Library/Templates/.als` (offering "Untitled" in a rename field) and ⌘N still opens the + stock Set afterwards. +- **No pointer lands in `Preferences.cfg`.** After the above, the file contains no reference to the + saved Set, no `.als` path, and no default/template key — so the default isn't recorded there either. + +Whatever selects the default lives somewhere this black-box probing didn't reach. Next thing to try +is probably watching Live's file I/O (`fs_usage`/`opensnoop`) during ⌘N to see what it actually reads. diff --git a/toolchain/macos/fleet/README.md b/toolchain/macos/fleet/README.md index 0c2eb7e8af..c75aae5476 100644 --- a/toolchain/macos/fleet/README.md +++ b/toolchain/macos/fleet/README.md @@ -86,6 +86,21 @@ reading back what it clamped to. Ask for less and Live silently ignores you. > its own geometry. Homogenizing the window means re-running this after a set opens, not baking it > into a template. +### `ableton-template.mjs` — a genuinely blank Set in the browser + +```bash +node ableton-template.mjs # build + install on every host +node ableton-template.mjs blueberry +``` + +Builds the stripped Set (`reference/ableton/als-template.mjs` — one audio track + Main, no MIDI, no +returns) and installs it to each Mac's `User Library/Templates/`, so Live's browser lists it under +**Templates > AC Blank**. + +> **⌘N is still Ableton's stock Set.** Making the blank the *auto-default* is unsolved — `BaseFiles/` +> isn't the source, `Save Live Set As Default Set…` just writes a template, and no pointer lands in +> `Preferences.cfg`. All three ruled out across restarts; see `reference/ableton/TEMPLATE.md`. + ### Live's global modals Live throws app-modal alerts (most often **"Audio is disabled. Please choose an audio output diff --git a/toolchain/macos/fleet/ableton-template.mjs b/toolchain/macos/fleet/ableton-template.mjs new file mode 100644 index 0000000000..5e319d0f32 --- /dev/null +++ b/toolchain/macos/fleet/ableton-template.mjs @@ -0,0 +1,52 @@ +#!/usr/bin/env node +// ableton-template.mjs — install the stripped "AC Blank" Set into each fleet Mac's Live browser. +// +// node ableton-template.mjs # build + install on every mapped host +// node ableton-template.mjs blueberry # just blueberry +// node ableton-template.mjs --name "AC Blank" +// +// The Set itself is generated by reference/ableton/als-template.mjs — one audio track and the Main +// out, no MIDI tracks, no returns. This drops it in ~/Music/Ableton/User Library/Templates/, which +// is where Live's browser lists Templates, so it is one click away from a genuinely blank Set. +// +// NOT THE AUTO-DEFAULT. Making this the Set that `New Live Set` (⌘N) opens is still unsolved — see +// reference/ableton/TEMPLATE.md for the mechanisms that were tried and ruled out. Until that is +// cracked, ⌘N still gives Ableton's stock 2-MIDI/2-audio/2-return Set and this is the one-click +// alternative sitting next to it in the browser. +import { execFile } from "node:child_process"; +import { promisify } from "node:util"; +import { readFile } from "node:fs/promises"; +import { fileURLToPath } from "node:url"; +import { dirname, join } from "node:path"; +const run = promisify(execFile); + +const HERE = dirname(fileURLToPath(import.meta.url)); +const GEN = join(HERE, "..", "..", "..", "reference", "ableton", "als-template.mjs"); +const HOSTS = ["neo", "blueberry"]; + +const argv = process.argv.slice(2); +const opt = (n, d) => (argv.includes(n) ? argv[argv.indexOf(n) + 1] : d); +const name = opt("--name", "AC Blank"); +const positional = argv.filter((a, i) => !a.startsWith("--") && argv[i - 1] !== "--name"); +const hosts = positional.length ? positional : HOSTS; + +// Build the Set fresh so the installed template always matches the generator in git. +const built = join(HERE, "..", "..", "..", "reference", "ableton", "AC-Blank.als"); +await run("node", [GEN, "--out", built]); +const als = await readFile(built); +console.log(`built ${name}.als (${als.length} bytes)`); + +const b64 = als.toString("base64"); +for (const host of hosts) { + try { + const dir = "$HOME/Music/Ableton/User Library/Templates"; + await run("ssh", [ + "-o", "ConnectTimeout=8", host, + `mkdir -p "${dir}" && printf %s '${b64}' | base64 -d > "${dir}/${name}.als"`, + ], { maxBuffer: 1 << 24 }); + console.log(` ✓ ${host}: User Library/Templates/${name}.als`); + } catch (err) { + console.log(` ✗ ${host}: ${err.message.split("\n")[0]}`); + } +} +console.log(`\nIn Live: browser > Templates > "${name}". (⌘N still opens Ableton's stock Set.)`); -- 2.51.2