livepilot 1.9.24 → 1.10.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/marketplace.json +3 -3
- package/AGENTS.md +3 -3
- package/CHANGELOG.md +223 -0
- package/CONTRIBUTING.md +2 -2
- package/LICENSE +62 -21
- package/README.md +291 -276
- package/bin/livepilot.js +87 -0
- package/installer/codex.js +147 -0
- package/livepilot/.Codex-plugin/plugin.json +2 -2
- package/livepilot/.claude-plugin/plugin.json +2 -2
- package/livepilot/skills/livepilot-arrangement/SKILL.md +18 -1
- package/livepilot/skills/livepilot-core/SKILL.md +22 -5
- package/livepilot/skills/livepilot-core/references/device-knowledge/00-index.md +34 -0
- package/livepilot/skills/livepilot-core/references/device-knowledge/automation-as-music.md +204 -0
- package/livepilot/skills/livepilot-core/references/device-knowledge/chains-genre.md +173 -0
- package/livepilot/skills/livepilot-core/references/device-knowledge/creative-thinking.md +211 -0
- package/livepilot/skills/livepilot-core/references/device-knowledge/effects-distortion.md +188 -0
- package/livepilot/skills/livepilot-core/references/device-knowledge/effects-space.md +162 -0
- package/livepilot/skills/livepilot-core/references/device-knowledge/effects-spectral.md +229 -0
- package/livepilot/skills/livepilot-core/references/device-knowledge/instruments-synths.md +243 -0
- package/livepilot/skills/livepilot-core/references/overview.md +13 -9
- package/livepilot/skills/livepilot-core/references/sample-manipulation.md +724 -0
- package/livepilot/skills/livepilot-core/references/sound-design-deep.md +140 -0
- package/livepilot/skills/livepilot-devices/SKILL.md +39 -4
- package/livepilot/skills/livepilot-evaluation/references/capability-modes.md +1 -1
- package/livepilot/skills/livepilot-release/SKILL.md +23 -19
- package/livepilot/skills/livepilot-sample-engine/SKILL.md +105 -0
- package/livepilot/skills/livepilot-sample-engine/references/sample-critics.md +87 -0
- package/livepilot/skills/livepilot-sample-engine/references/sample-philosophy.md +51 -0
- package/livepilot/skills/livepilot-sample-engine/references/sample-techniques.md +131 -0
- package/livepilot/skills/livepilot-sound-design-engine/SKILL.md +45 -0
- package/livepilot/skills/livepilot-wonder/SKILL.md +17 -0
- package/livepilot.mcpb +0 -0
- package/m4l_device/livepilot_bridge.js +1 -1
- package/manifest.json +4 -4
- package/mcp_server/__init__.py +1 -1
- package/mcp_server/atlas/__init__.py +357 -0
- package/mcp_server/atlas/device_atlas.json +44067 -0
- package/mcp_server/atlas/enrichments/__init__.py +111 -0
- package/mcp_server/atlas/enrichments/audio_effects/auto_filter.yaml +162 -0
- package/mcp_server/atlas/enrichments/audio_effects/beat_repeat.yaml +183 -0
- package/mcp_server/atlas/enrichments/audio_effects/channel_eq.yaml +126 -0
- package/mcp_server/atlas/enrichments/audio_effects/chorus_ensemble.yaml +149 -0
- package/mcp_server/atlas/enrichments/audio_effects/color_limiter.yaml +109 -0
- package/mcp_server/atlas/enrichments/audio_effects/compressor.yaml +159 -0
- package/mcp_server/atlas/enrichments/audio_effects/convolution_reverb.yaml +143 -0
- package/mcp_server/atlas/enrichments/audio_effects/convolution_reverb_pro.yaml +178 -0
- package/mcp_server/atlas/enrichments/audio_effects/delay.yaml +151 -0
- package/mcp_server/atlas/enrichments/audio_effects/drum_buss.yaml +142 -0
- package/mcp_server/atlas/enrichments/audio_effects/dynamic_tube.yaml +147 -0
- package/mcp_server/atlas/enrichments/audio_effects/echo.yaml +167 -0
- package/mcp_server/atlas/enrichments/audio_effects/eq_eight.yaml +148 -0
- package/mcp_server/atlas/enrichments/audio_effects/eq_three.yaml +121 -0
- package/mcp_server/atlas/enrichments/audio_effects/erosion.yaml +103 -0
- package/mcp_server/atlas/enrichments/audio_effects/filter_delay.yaml +173 -0
- package/mcp_server/atlas/enrichments/audio_effects/gate.yaml +130 -0
- package/mcp_server/atlas/enrichments/audio_effects/gated_delay.yaml +133 -0
- package/mcp_server/atlas/enrichments/audio_effects/glue_compressor.yaml +142 -0
- package/mcp_server/atlas/enrichments/audio_effects/grain_delay.yaml +141 -0
- package/mcp_server/atlas/enrichments/audio_effects/hybrid_reverb.yaml +160 -0
- package/mcp_server/atlas/enrichments/audio_effects/limiter.yaml +97 -0
- package/mcp_server/atlas/enrichments/audio_effects/multiband_dynamics.yaml +174 -0
- package/mcp_server/atlas/enrichments/audio_effects/overdrive.yaml +119 -0
- package/mcp_server/atlas/enrichments/audio_effects/pedal.yaml +145 -0
- package/mcp_server/atlas/enrichments/audio_effects/phaser_flanger.yaml +161 -0
- package/mcp_server/atlas/enrichments/audio_effects/redux.yaml +114 -0
- package/mcp_server/atlas/enrichments/audio_effects/reverb.yaml +190 -0
- package/mcp_server/atlas/enrichments/audio_effects/roar.yaml +159 -0
- package/mcp_server/atlas/enrichments/audio_effects/saturator.yaml +146 -0
- package/mcp_server/atlas/enrichments/audio_effects/shifter.yaml +154 -0
- package/mcp_server/atlas/enrichments/audio_effects/spectral_resonator.yaml +141 -0
- package/mcp_server/atlas/enrichments/audio_effects/spectral_time.yaml +164 -0
- package/mcp_server/atlas/enrichments/audio_effects/vector_delay.yaml +140 -0
- package/mcp_server/atlas/enrichments/audio_effects/vinyl_distortion.yaml +141 -0
- package/mcp_server/atlas/enrichments/instruments/analog.yaml +222 -0
- package/mcp_server/atlas/enrichments/instruments/bass.yaml +202 -0
- package/mcp_server/atlas/enrichments/instruments/collision.yaml +150 -0
- package/mcp_server/atlas/enrichments/instruments/drift.yaml +167 -0
- package/mcp_server/atlas/enrichments/instruments/electric.yaml +137 -0
- package/mcp_server/atlas/enrichments/instruments/emit.yaml +163 -0
- package/mcp_server/atlas/enrichments/instruments/meld.yaml +164 -0
- package/mcp_server/atlas/enrichments/instruments/operator.yaml +197 -0
- package/mcp_server/atlas/enrichments/instruments/poli.yaml +192 -0
- package/mcp_server/atlas/enrichments/instruments/sampler.yaml +218 -0
- package/mcp_server/atlas/enrichments/instruments/simpler.yaml +217 -0
- package/mcp_server/atlas/enrichments/instruments/tension.yaml +156 -0
- package/mcp_server/atlas/enrichments/instruments/tree_tone.yaml +162 -0
- package/mcp_server/atlas/enrichments/instruments/vector_fm.yaml +165 -0
- package/mcp_server/atlas/enrichments/instruments/vector_grain.yaml +166 -0
- package/mcp_server/atlas/enrichments/instruments/wavetable.yaml +162 -0
- package/mcp_server/atlas/enrichments/midi_effects/arpeggiator.yaml +156 -0
- package/mcp_server/atlas/enrichments/midi_effects/bouncy_notes.yaml +93 -0
- package/mcp_server/atlas/enrichments/midi_effects/chord.yaml +147 -0
- package/mcp_server/atlas/enrichments/midi_effects/melodic_steps.yaml +97 -0
- package/mcp_server/atlas/enrichments/midi_effects/note_echo.yaml +108 -0
- package/mcp_server/atlas/enrichments/midi_effects/note_length.yaml +97 -0
- package/mcp_server/atlas/enrichments/midi_effects/pitch.yaml +76 -0
- package/mcp_server/atlas/enrichments/midi_effects/random.yaml +117 -0
- package/mcp_server/atlas/enrichments/midi_effects/rhythmic_steps.yaml +103 -0
- package/mcp_server/atlas/enrichments/midi_effects/scale.yaml +83 -0
- package/mcp_server/atlas/enrichments/midi_effects/step_arp.yaml +112 -0
- package/mcp_server/atlas/enrichments/midi_effects/velocity.yaml +119 -0
- package/mcp_server/atlas/enrichments/utility/amp.yaml +159 -0
- package/mcp_server/atlas/enrichments/utility/cabinet.yaml +109 -0
- package/mcp_server/atlas/enrichments/utility/corpus.yaml +150 -0
- package/mcp_server/atlas/enrichments/utility/resonators.yaml +131 -0
- package/mcp_server/atlas/enrichments/utility/spectrum.yaml +63 -0
- package/mcp_server/atlas/enrichments/utility/tuner.yaml +51 -0
- package/mcp_server/atlas/enrichments/utility/utility.yaml +136 -0
- package/mcp_server/atlas/enrichments/utility/vocoder.yaml +160 -0
- package/mcp_server/atlas/scanner.py +236 -0
- package/mcp_server/atlas/tools.py +224 -0
- package/mcp_server/composer/__init__.py +1 -0
- package/mcp_server/composer/engine.py +532 -0
- package/mcp_server/composer/layer_planner.py +427 -0
- package/mcp_server/composer/prompt_parser.py +329 -0
- package/mcp_server/composer/sample_resolver.py +153 -0
- package/mcp_server/composer/tools.py +211 -0
- package/mcp_server/connection.py +53 -8
- package/mcp_server/corpus/__init__.py +377 -0
- package/mcp_server/device_forge/__init__.py +1 -0
- package/mcp_server/device_forge/builder.py +377 -0
- package/mcp_server/device_forge/models.py +142 -0
- package/mcp_server/device_forge/templates.py +483 -0
- package/mcp_server/device_forge/tools.py +162 -0
- package/mcp_server/m4l_bridge.py +1 -0
- package/mcp_server/memory/taste_accessors.py +47 -0
- package/mcp_server/preview_studio/engine.py +9 -2
- package/mcp_server/preview_studio/tools.py +78 -35
- package/mcp_server/project_brain/tools.py +34 -0
- package/mcp_server/runtime/capability_probe.py +21 -2
- package/mcp_server/runtime/execution_router.py +184 -38
- package/mcp_server/runtime/live_version.py +102 -0
- package/mcp_server/runtime/mcp_dispatch.py +46 -0
- package/mcp_server/runtime/remote_commands.py +13 -5
- package/mcp_server/runtime/tools.py +66 -29
- package/mcp_server/sample_engine/__init__.py +1 -0
- package/mcp_server/sample_engine/analyzer.py +216 -0
- package/mcp_server/sample_engine/critics.py +390 -0
- package/mcp_server/sample_engine/models.py +193 -0
- package/mcp_server/sample_engine/moves.py +127 -0
- package/mcp_server/sample_engine/planner.py +186 -0
- package/mcp_server/sample_engine/slice_workflow.py +190 -0
- package/mcp_server/sample_engine/sources.py +540 -0
- package/mcp_server/sample_engine/techniques.py +908 -0
- package/mcp_server/sample_engine/tools.py +545 -0
- package/mcp_server/semantic_moves/__init__.py +3 -0
- package/mcp_server/semantic_moves/device_creation_moves.py +237 -0
- package/mcp_server/semantic_moves/mix_moves.py +8 -8
- package/mcp_server/semantic_moves/models.py +7 -7
- package/mcp_server/semantic_moves/performance_moves.py +4 -4
- package/mcp_server/semantic_moves/sample_compilers.py +377 -0
- package/mcp_server/semantic_moves/sound_design_moves.py +4 -4
- package/mcp_server/semantic_moves/tools.py +63 -10
- package/mcp_server/semantic_moves/transition_moves.py +4 -4
- package/mcp_server/server.py +71 -1
- package/mcp_server/session_continuity/tracker.py +4 -1
- package/mcp_server/sound_design/critics.py +89 -1
- package/mcp_server/splice_client/__init__.py +1 -0
- package/mcp_server/splice_client/client.py +347 -0
- package/mcp_server/splice_client/models.py +96 -0
- package/mcp_server/splice_client/protos/__init__.py +1 -0
- package/mcp_server/splice_client/protos/app_pb2.py +319 -0
- package/mcp_server/splice_client/protos/app_pb2.pyi +1153 -0
- package/mcp_server/splice_client/protos/app_pb2_grpc.py +1946 -0
- package/mcp_server/tools/_conductor.py +16 -0
- package/mcp_server/tools/_planner_engine.py +24 -0
- package/mcp_server/tools/analyzer.py +2 -0
- package/mcp_server/tools/arrangement.py +69 -0
- package/mcp_server/tools/automation.py +15 -2
- package/mcp_server/tools/devices.py +117 -6
- package/mcp_server/tools/notes.py +37 -4
- package/mcp_server/tools/planner.py +3 -0
- package/mcp_server/wonder_mode/diagnosis.py +5 -0
- package/mcp_server/wonder_mode/engine.py +144 -14
- package/mcp_server/wonder_mode/tools.py +33 -1
- package/package.json +14 -4
- package/remote_script/LivePilot/__init__.py +8 -1
- package/remote_script/LivePilot/arrangement.py +114 -0
- package/remote_script/LivePilot/browser.py +56 -1
- package/remote_script/LivePilot/devices.py +246 -6
- package/remote_script/LivePilot/mixing.py +8 -3
- package/remote_script/LivePilot/server.py +5 -1
- package/remote_script/LivePilot/transport.py +3 -0
- package/remote_script/LivePilot/version_detect.py +78 -0
package/bin/livepilot.js
CHANGED
|
@@ -211,6 +211,45 @@ function checkStatus() {
|
|
|
211
211
|
});
|
|
212
212
|
}
|
|
213
213
|
|
|
214
|
+
function probeAnalyzer(venvPy) {
|
|
215
|
+
const probeCode = `
|
|
216
|
+
import asyncio
|
|
217
|
+
import json
|
|
218
|
+
import sys
|
|
219
|
+
from types import SimpleNamespace
|
|
220
|
+
|
|
221
|
+
sys.path.insert(0, ${JSON.stringify(ROOT)})
|
|
222
|
+
|
|
223
|
+
from mcp_server.server import lifespan, _master_has_livepilot_analyzer
|
|
224
|
+
from mcp_server.runtime.capability_probe import probe_capabilities
|
|
225
|
+
|
|
226
|
+
async def main():
|
|
227
|
+
async with lifespan(None) as ctx:
|
|
228
|
+
loaded = _master_has_livepilot_analyzer(ctx["ableton"])
|
|
229
|
+
report = probe_capabilities(
|
|
230
|
+
ableton=ctx["ableton"],
|
|
231
|
+
ctx=SimpleNamespace(lifespan_context=ctx),
|
|
232
|
+
)
|
|
233
|
+
print(json.dumps({
|
|
234
|
+
"loaded_on_master": loaded,
|
|
235
|
+
"m4l_bridge": report["m4l_bridge"],
|
|
236
|
+
"tier": report["tier"]["active"],
|
|
237
|
+
}))
|
|
238
|
+
|
|
239
|
+
asyncio.run(main())
|
|
240
|
+
`;
|
|
241
|
+
|
|
242
|
+
const out = execFileSync(venvPy, ["-c", probeCode], {
|
|
243
|
+
cwd: ROOT,
|
|
244
|
+
encoding: "utf-8",
|
|
245
|
+
timeout: 15000,
|
|
246
|
+
stdio: ["pipe", "pipe", "pipe"],
|
|
247
|
+
}).trim();
|
|
248
|
+
|
|
249
|
+
const lines = out.split(/\r?\n/).filter(Boolean);
|
|
250
|
+
return JSON.parse(lines[lines.length - 1]);
|
|
251
|
+
}
|
|
252
|
+
|
|
214
253
|
// ---------------------------------------------------------------------------
|
|
215
254
|
// Doctor — comprehensive diagnostic
|
|
216
255
|
// ---------------------------------------------------------------------------
|
|
@@ -312,6 +351,37 @@ async function doctor() {
|
|
|
312
351
|
ok = false;
|
|
313
352
|
}
|
|
314
353
|
|
|
354
|
+
// 9. Analyzer / bridge capability
|
|
355
|
+
if (connected && fs.existsSync(venvPy)) {
|
|
356
|
+
const HOST = process.env.LIVE_MCP_HOST || "127.0.0.1";
|
|
357
|
+
const PORT = parseInt(process.env.LIVE_MCP_PORT || "9878", 10);
|
|
358
|
+
const otherClient = findOtherLiveClient(HOST, PORT);
|
|
359
|
+
|
|
360
|
+
if (otherClient) {
|
|
361
|
+
console.log(" Analyzer: skipped (another LivePilot client is connected: %s)", otherClient);
|
|
362
|
+
} else {
|
|
363
|
+
try {
|
|
364
|
+
const analyzer = probeAnalyzer(venvPy);
|
|
365
|
+
if (analyzer.loaded_on_master) {
|
|
366
|
+
console.log(
|
|
367
|
+
" Analyzer: %s",
|
|
368
|
+
analyzer.m4l_bridge.status === "ok"
|
|
369
|
+
? "loaded on master and bridge is active"
|
|
370
|
+
: `loaded on master but bridge unavailable (${analyzer.m4l_bridge.detail})`,
|
|
371
|
+
);
|
|
372
|
+
if (analyzer.m4l_bridge.status !== "ok") {
|
|
373
|
+
ok = false;
|
|
374
|
+
}
|
|
375
|
+
} else {
|
|
376
|
+
console.log(" Analyzer: not detected on master track (optional)");
|
|
377
|
+
}
|
|
378
|
+
} catch (err) {
|
|
379
|
+
console.log(" Analyzer: could not probe (%s)", err.message || String(err));
|
|
380
|
+
ok = false;
|
|
381
|
+
}
|
|
382
|
+
}
|
|
383
|
+
}
|
|
384
|
+
|
|
315
385
|
// Summary
|
|
316
386
|
console.log("");
|
|
317
387
|
console.log("─".repeat(50));
|
|
@@ -580,6 +650,7 @@ async function setup() {
|
|
|
580
650
|
console.log(" 3. Set Control Surface to 'LivePilot'");
|
|
581
651
|
console.log(" 4. Start making music with AI!");
|
|
582
652
|
console.log("");
|
|
653
|
+
console.log(" Codex App: npx livepilot --install-codex-plugin");
|
|
583
654
|
console.log(" Claude Code: claude mcp add LivePilot -- npx livepilot");
|
|
584
655
|
console.log(" Claude Desktop: Already configured if using Desktop Extension");
|
|
585
656
|
} else {
|
|
@@ -613,6 +684,8 @@ async function main() {
|
|
|
613
684
|
console.log(" --setup Full setup wizard (install + configure + test)");
|
|
614
685
|
console.log(" --install Install Remote Script into Ableton Live");
|
|
615
686
|
console.log(" --uninstall Remove Remote Script from Ableton Live");
|
|
687
|
+
console.log(" --install-codex-plugin Install the bundled Codex plugin locally");
|
|
688
|
+
console.log(" --uninstall-codex-plugin Remove the locally installed Codex plugin");
|
|
616
689
|
console.log(" --status Check if Ableton Live is reachable");
|
|
617
690
|
console.log(" --doctor Run diagnostics (Python, deps, connection)");
|
|
618
691
|
console.log(" --version Show version");
|
|
@@ -639,6 +712,20 @@ async function main() {
|
|
|
639
712
|
return;
|
|
640
713
|
}
|
|
641
714
|
|
|
715
|
+
// --install-codex-plugin
|
|
716
|
+
if (flag === "--install-codex-plugin") {
|
|
717
|
+
const { installCodexPlugin } = require(path.join(ROOT, "installer", "codex.js"));
|
|
718
|
+
installCodexPlugin();
|
|
719
|
+
return;
|
|
720
|
+
}
|
|
721
|
+
|
|
722
|
+
// --uninstall-codex-plugin
|
|
723
|
+
if (flag === "--uninstall-codex-plugin") {
|
|
724
|
+
const { uninstallCodexPlugin } = require(path.join(ROOT, "installer", "codex.js"));
|
|
725
|
+
uninstallCodexPlugin();
|
|
726
|
+
return;
|
|
727
|
+
}
|
|
728
|
+
|
|
642
729
|
// --status
|
|
643
730
|
if (flag === "--status") {
|
|
644
731
|
const reachable = await checkStatus();
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
const fs = require("fs");
|
|
4
|
+
const os = require("os");
|
|
5
|
+
const path = require("path");
|
|
6
|
+
|
|
7
|
+
const ROOT = path.resolve(__dirname, "..");
|
|
8
|
+
const SOURCE_DIR = path.join(ROOT, "livepilot");
|
|
9
|
+
const SOURCE_MANIFEST = path.join(SOURCE_DIR, ".Codex-plugin", "plugin.json");
|
|
10
|
+
const DEFAULT_PLUGIN_DIR = path.join(os.homedir(), "plugins", "livepilot");
|
|
11
|
+
const DEFAULT_MARKETPLACE_PATH = path.join(os.homedir(), ".agents", "plugins", "marketplace.json");
|
|
12
|
+
|
|
13
|
+
const SKIP = new Set(["__pycache__", ".DS_Store"]);
|
|
14
|
+
|
|
15
|
+
function copyDirSync(src, dest) {
|
|
16
|
+
fs.mkdirSync(dest, { recursive: true });
|
|
17
|
+
const entries = fs.readdirSync(src, { withFileTypes: true });
|
|
18
|
+
for (const entry of entries) {
|
|
19
|
+
if (SKIP.has(entry.name)) continue;
|
|
20
|
+
const srcPath = path.join(src, entry.name);
|
|
21
|
+
const destPath = path.join(dest, entry.name);
|
|
22
|
+
if (entry.isDirectory()) {
|
|
23
|
+
copyDirSync(srcPath, destPath);
|
|
24
|
+
} else {
|
|
25
|
+
fs.copyFileSync(srcPath, destPath);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
function targetPluginDir() {
|
|
31
|
+
return process.env.LIVEPILOT_CODEX_PLUGIN_PATH || DEFAULT_PLUGIN_DIR;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
function marketplacePath() {
|
|
35
|
+
return process.env.LIVEPILOT_CODEX_MARKETPLACE_PATH || DEFAULT_MARKETPLACE_PATH;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
function loadManifest() {
|
|
39
|
+
if (!fs.existsSync(SOURCE_MANIFEST)) {
|
|
40
|
+
throw new Error(`Codex plugin manifest not found at ${SOURCE_MANIFEST}`);
|
|
41
|
+
}
|
|
42
|
+
return JSON.parse(fs.readFileSync(SOURCE_MANIFEST, "utf-8"));
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
function ensureMarketplace(pluginName) {
|
|
46
|
+
const file = marketplacePath();
|
|
47
|
+
let marketplace = {
|
|
48
|
+
name: "local-plugins",
|
|
49
|
+
interface: { displayName: "Local Plugins" },
|
|
50
|
+
plugins: [],
|
|
51
|
+
};
|
|
52
|
+
|
|
53
|
+
if (fs.existsSync(file)) {
|
|
54
|
+
const raw = JSON.parse(fs.readFileSync(file, "utf-8"));
|
|
55
|
+
marketplace = {
|
|
56
|
+
name: raw.name || marketplace.name,
|
|
57
|
+
interface: raw.interface || marketplace.interface,
|
|
58
|
+
plugins: Array.isArray(raw.plugins) ? raw.plugins : [],
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
const entry = {
|
|
63
|
+
name: pluginName,
|
|
64
|
+
source: {
|
|
65
|
+
source: "local",
|
|
66
|
+
path: `./plugins/${pluginName}`,
|
|
67
|
+
},
|
|
68
|
+
policy: {
|
|
69
|
+
installation: "AVAILABLE",
|
|
70
|
+
authentication: "ON_INSTALL",
|
|
71
|
+
},
|
|
72
|
+
category: "Integration",
|
|
73
|
+
};
|
|
74
|
+
|
|
75
|
+
const idx = marketplace.plugins.findIndex((plugin) => plugin && plugin.name === pluginName);
|
|
76
|
+
if (idx >= 0) {
|
|
77
|
+
marketplace.plugins[idx] = entry;
|
|
78
|
+
} else {
|
|
79
|
+
marketplace.plugins.push(entry);
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
fs.mkdirSync(path.dirname(file), { recursive: true });
|
|
83
|
+
fs.writeFileSync(file, JSON.stringify(marketplace, null, 2) + "\n");
|
|
84
|
+
return file;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
function removeMarketplaceEntry(pluginName) {
|
|
88
|
+
const file = marketplacePath();
|
|
89
|
+
if (!fs.existsSync(file)) {
|
|
90
|
+
return null;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
const raw = JSON.parse(fs.readFileSync(file, "utf-8"));
|
|
94
|
+
const marketplace = {
|
|
95
|
+
name: raw.name || "local-plugins",
|
|
96
|
+
interface: raw.interface || { displayName: "Local Plugins" },
|
|
97
|
+
plugins: Array.isArray(raw.plugins) ? raw.plugins.filter((plugin) => plugin && plugin.name !== pluginName) : [],
|
|
98
|
+
};
|
|
99
|
+
fs.writeFileSync(file, JSON.stringify(marketplace, null, 2) + "\n");
|
|
100
|
+
return file;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
function installCodexPlugin() {
|
|
104
|
+
const manifest = loadManifest();
|
|
105
|
+
const pluginName = manifest.name || "livepilot";
|
|
106
|
+
const destDir = targetPluginDir();
|
|
107
|
+
const marketFile = ensureMarketplace(pluginName);
|
|
108
|
+
|
|
109
|
+
console.log("Installing LivePilot Codex plugin...");
|
|
110
|
+
console.log(" Source: %s", SOURCE_DIR);
|
|
111
|
+
console.log(" Target: %s", destDir);
|
|
112
|
+
console.log(" Marketplace: %s", marketFile);
|
|
113
|
+
console.log("");
|
|
114
|
+
|
|
115
|
+
fs.mkdirSync(path.dirname(destDir), { recursive: true });
|
|
116
|
+
fs.rmSync(destDir, { recursive: true, force: true });
|
|
117
|
+
copyDirSync(SOURCE_DIR, destDir);
|
|
118
|
+
|
|
119
|
+
console.log("Done! Next steps:");
|
|
120
|
+
console.log(" 1. Open or refresh Codex");
|
|
121
|
+
console.log(" 2. Check that LivePilot appears in Local Plugins");
|
|
122
|
+
console.log(" 3. Start a new thread or reload tools if Codex was already open");
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
function uninstallCodexPlugin() {
|
|
126
|
+
const manifest = loadManifest();
|
|
127
|
+
const pluginName = manifest.name || "livepilot";
|
|
128
|
+
const destDir = targetPluginDir();
|
|
129
|
+
const marketFile = removeMarketplaceEntry(pluginName);
|
|
130
|
+
|
|
131
|
+
if (fs.existsSync(destDir)) {
|
|
132
|
+
console.log("Removing Codex plugin: %s", destDir);
|
|
133
|
+
fs.rmSync(destDir, { recursive: true, force: true });
|
|
134
|
+
} else {
|
|
135
|
+
console.log("Codex plugin not found at %s", destDir);
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
if (marketFile) {
|
|
139
|
+
console.log("Updated marketplace: %s", marketFile);
|
|
140
|
+
}
|
|
141
|
+
console.log("Restart or refresh Codex to remove the plugin from the UI.");
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
module.exports = {
|
|
145
|
+
installCodexPlugin,
|
|
146
|
+
uninstallCodexPlugin,
|
|
147
|
+
};
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "livepilot",
|
|
3
|
-
"version": "1.
|
|
4
|
-
"description": "Agentic production system for Ableton Live 12 —
|
|
3
|
+
"version": "1.10.1",
|
|
4
|
+
"description": "Agentic production system for Ableton Live 12 — 317 tools, 43 domains, device atlas, sample intelligence, auto-composition, spectral perception, technique memory, neo-Riemannian harmony, Euclidean rhythm, species counterpoint, MIDI I/O",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Pilot Studio"
|
|
7
7
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "livepilot",
|
|
3
|
-
"version": "1.
|
|
4
|
-
"description": "Agentic production system for Ableton Live 12 —
|
|
3
|
+
"version": "1.10.1",
|
|
4
|
+
"description": "Agentic production system for Ableton Live 12 — 317 tools, 43 domains, device atlas, sample intelligence, auto-composition, spectral perception, technique memory, neo-Riemannian harmony, Euclidean rhythm, species counterpoint, MIDI I/O",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Pilot Studio"
|
|
7
7
|
}
|
|
@@ -47,8 +47,10 @@ Build linear song structures on the timeline.
|
|
|
47
47
|
|
|
48
48
|
### Creating Arrangement Clips
|
|
49
49
|
|
|
50
|
-
- `create_arrangement_clip(track_index, start_time, length)` —
|
|
50
|
+
- `create_arrangement_clip(track_index, clip_slot_index, start_time, length)` — duplicate a session clip into Arrangement View at a specific beat position
|
|
51
|
+
- `create_native_arrangement_clip(track_index, start_time, length)` — create arrangement clip with full automation envelope (12.1.10+)
|
|
51
52
|
- `set_arrangement_clip_name(track_index, clip_index, name)` — name arrangement clips for clarity
|
|
53
|
+
- `force_arrangement()` — force all tracks to play from arrangement (not session clips)
|
|
52
54
|
|
|
53
55
|
### Arrangement Notes
|
|
54
56
|
|
|
@@ -122,6 +124,21 @@ When building arrangements, use these as starting templates:
|
|
|
122
124
|
|
|
123
125
|
Adapt these to the user's needs. Use `plan_arrangement` from the planner domain for algorithmic structure suggestions, and `transform_section` to create variations of existing sections.
|
|
124
126
|
|
|
127
|
+
## Section-Aware Sample Roles
|
|
128
|
+
|
|
129
|
+
`plan_arrangement` returns `sample_hints` per section — suggested roles for sample-based elements:
|
|
130
|
+
|
|
131
|
+
| Section | Default Hints |
|
|
132
|
+
|---------|--------------|
|
|
133
|
+
| Intro | `texture_bed`, `fill_one_shot` |
|
|
134
|
+
| Verse | `texture_bed`, `fill_one_shot` |
|
|
135
|
+
| Build | `transition_fx`, `texture_bed` |
|
|
136
|
+
| Chorus/Drop | `hook_sample`, `break_layer`, `fill_one_shot` |
|
|
137
|
+
| Bridge/Breakdown | `texture_bed`, `transition_fx` |
|
|
138
|
+
| Outro | `texture_bed`, `fill_one_shot` |
|
|
139
|
+
|
|
140
|
+
Use `plan_sample_workflow(section_type=..., desired_role=...)` to generate concrete sample plans for each role. Use `plan_slice_workflow(intent=..., target_section=...)` for slice-based patterns.
|
|
141
|
+
|
|
125
142
|
## Composition Engine
|
|
126
143
|
|
|
127
144
|
For deeper compositional analysis beyond basic arrangement:
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: livepilot-core
|
|
3
|
-
description: Core discipline for LivePilot — agentic production system for Ableton Live 12.
|
|
3
|
+
description: Core discipline for LivePilot — agentic production system for Ableton Live 12. 317 tools across 43 domains. This skill should be used whenever working with Ableton Live through MCP tools. Provides golden rules, tool speed tiers, error handling protocol, and pointers to domain and engine skills.
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# LivePilot Core — Ableton Live 12
|
|
7
7
|
|
|
8
|
-
Agentic production system for Ableton Live 12.
|
|
8
|
+
Agentic production system for Ableton Live 12. 317 tools across 43 domains, three layers:
|
|
9
9
|
|
|
10
|
-
- **Device Atlas** —
|
|
10
|
+
- **Device Atlas** — 1305 devices indexed (81 enriched with sonic intelligence, 683 drum kits). Consult `atlas_search` or `atlas_suggest` before loading any device. Never guess a device name.
|
|
11
11
|
- **M4L Analyzer** — Real-time audio analysis on the master bus (8-band spectrum, RMS/peak, key detection). Optional — all core tools work without it.
|
|
12
12
|
- **Technique Memory** — Persistent storage for production decisions. Consult `memory_recall` before creative tasks to understand user taste.
|
|
13
13
|
|
|
@@ -39,7 +39,7 @@ Agentic production system for Ableton Live 12. 293 tools across 39 domains, thre
|
|
|
39
39
|
## Tool Speed Tiers
|
|
40
40
|
|
|
41
41
|
### Instant (<1s) — Use freely
|
|
42
|
-
All
|
|
42
|
+
All 317 tools plus M4L perception tools.
|
|
43
43
|
|
|
44
44
|
### Fast (1-5s) — Use freely
|
|
45
45
|
`analyze_loudness` · `analyze_mix` · `analyze_sound_design`
|
|
@@ -82,6 +82,23 @@ Three modes:
|
|
|
82
82
|
- Prefer Wonder when the user's request is emotionally-shaped, not parametric
|
|
83
83
|
- Load `livepilot-wonder` skill for full workflow guidance
|
|
84
84
|
|
|
85
|
+
## Creative Sound Design Knowledge
|
|
86
|
+
|
|
87
|
+
Before setting device parameters, consult the knowledge corpus for informed creative choices. Read the relevant file BEFORE making changes:
|
|
88
|
+
|
|
89
|
+
| User says | Read this file |
|
|
90
|
+
|-----------|---------------|
|
|
91
|
+
| "make it breathe" / "organic" / "alive" / "warm" / "cold" / "anxious" / "nostalgic" | `references/device-knowledge/creative-thinking.md` — emotional-to-technical mapping, physical world modeling |
|
|
92
|
+
| "what effect chain for [genre]" / "dub techno" / "trap" / "SOPHIE" / "Arca" / "ambient" | `references/device-knowledge/chains-genre.md` — complete chains per genre |
|
|
93
|
+
| "how to use Wavetable/Drift/Analog/Operator/Meld" | `references/device-knowledge/instruments-synths.md` — parameter-level recipes |
|
|
94
|
+
| "distortion" / "saturation" / "Roar" / "Saturator" / "Redux" | `references/device-knowledge/effects-distortion.md` — every curve type, creative applications |
|
|
95
|
+
| "reverb" / "delay" / "echo" / "space" / "dub" | `references/device-knowledge/effects-space.md` — dub recipes, shimmer chains |
|
|
96
|
+
| "spectral" / "Resonators" / "Corpus" / "Vocoder" / "weird" / "experimental" | `references/device-knowledge/effects-spectral.md` — drum-to-melody, cross-synthesis |
|
|
97
|
+
| "automate" / "evolve" / "arc" / "movement" / "filter sweep" | `references/device-knowledge/automation-as-music.md` — shapes, macro gestures, density mapping |
|
|
98
|
+
| "sound design" / "make it interesting" / "more complex" | `references/sound-design-deep.md` — master techniques from Villalobos, SOPHIE, Basic Channel |
|
|
99
|
+
|
|
100
|
+
**Rule:** Never set effect parameters from memory alone when the corpus has specific guidance. Read the file first, then apply the technique.
|
|
101
|
+
|
|
85
102
|
## Domain Skills
|
|
86
103
|
|
|
87
104
|
For domain-specific workflows, load the appropriate skill:
|
|
@@ -111,7 +128,7 @@ Deep production knowledge in `references/`:
|
|
|
111
128
|
|
|
112
129
|
| File | Content |
|
|
113
130
|
|------|---------|
|
|
114
|
-
| `references/overview.md` | All
|
|
131
|
+
| `references/overview.md` | All 317 tools with params and ranges |
|
|
115
132
|
| `references/device-atlas/` | 280+ device corpus with URIs and presets |
|
|
116
133
|
| `references/midi-recipes.md` | Drum patterns, chord voicings, humanization |
|
|
117
134
|
| `references/sound-design.md` | Synth recipes, device chain patterns |
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
# Ableton Live 12 Device Knowledge Corpus
|
|
2
|
+
|
|
3
|
+
Comprehensive reference for every built-in instrument and effect in Ableton Live 12. Written for an AI production assistant — parameter-level understanding, creative applications, and techniques from experimental electronic music producers.
|
|
4
|
+
|
|
5
|
+
## How to Use This Corpus
|
|
6
|
+
|
|
7
|
+
This is not a manual. It's a **creative knowledge base**. When the user asks to "design a sound" or "make it more interesting," consult these references to find specific parameters and techniques that achieve the goal. Don't just reach for obvious parameters — think about how SOPHIE, Arca, Villalobos, Aphex Twin, or Basic Channel would approach the same problem.
|
|
8
|
+
|
|
9
|
+
## Files
|
|
10
|
+
|
|
11
|
+
### Instruments
|
|
12
|
+
- `instruments-synths.md` — Wavetable, Drift, Analog, Operator, Meld (synthesis engines)
|
|
13
|
+
- `instruments-physical.md` — Collision, Tension, Electric (physical modeling)
|
|
14
|
+
- `instruments-samplers.md` — Simpler, Sampler, Drum Rack, Drum Sampler
|
|
15
|
+
|
|
16
|
+
### Effects — Processing
|
|
17
|
+
- `effects-dynamics.md` — Compressor, Glue Compressor, Multiband Dynamics, Limiter, Gate, Color Limiter
|
|
18
|
+
- `effects-eq-filter.md` — EQ Eight, EQ Three, Auto Filter, Channel EQ
|
|
19
|
+
- `effects-distortion.md` — Saturator, Roar, Overdrive, Pedal, Amp, Cabinet, Erosion, Redux, Vinyl Distortion, Dynamic Tube, Drum Buss
|
|
20
|
+
|
|
21
|
+
### Effects — Space & Time
|
|
22
|
+
- `effects-reverb.md` — Reverb, Convolution Reverb, Hybrid Reverb
|
|
23
|
+
- `effects-delay.md` — Delay, Echo, Grain Delay
|
|
24
|
+
- `effects-modulation.md` — Chorus-Ensemble, Phaser-Flanger, Frequency Shifter, Shifter, Auto Pan-Tremolo
|
|
25
|
+
|
|
26
|
+
### Effects — Spectral & Experimental
|
|
27
|
+
- `effects-spectral.md` — Spectral Resonator, Spectral Time, Spectral Blur, Resonators, Corpus, Vocoder
|
|
28
|
+
|
|
29
|
+
### Creative Chains
|
|
30
|
+
- `chains-genre.md` — Effect chain blueprints by genre (dub techno, trap, SOPHIE-style, ambient, experimental)
|
|
31
|
+
- `chains-technique.md` — Technique-specific chains (parallel processing, creative sidechain, feedback loops, resampling workflows)
|
|
32
|
+
|
|
33
|
+
### Artist Techniques
|
|
34
|
+
- `artist-techniques.md` — How specific artists use Ableton's built-in devices (researched from interviews, tutorials, and analysis)
|
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
# Automation as Music — The Art of Parameter Performance
|
|
2
|
+
|
|
3
|
+
The greatest electronic musicians don't play notes — they play parameters. A filter cutoff automated over 64 bars IS the melody. A reverb send thrown open for one beat IS the harmony. The difference between a demo and a masterpiece is often not the sounds — it's the automation.
|
|
4
|
+
|
|
5
|
+
## The Fundamental Principle
|
|
6
|
+
|
|
7
|
+
**A static parameter is a dead parameter.** In acoustic music, every note is different — the player's breath, touch, and emotion create micro-variations. In electronic music, those variations must be created deliberately through automation. Every important parameter should move, even if only by 2-3%.
|
|
8
|
+
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
## Part 1: Automation Shapes and What They Mean Musically
|
|
12
|
+
|
|
13
|
+
### Linear Ramps
|
|
14
|
+
A straight line from value A to value B. The simplest shape. Use for:
|
|
15
|
+
- **Build-ups:** Filter cutoff rising linearly over 16-32 bars before a drop
|
|
16
|
+
- **Fade outs:** Volume decreasing to zero over 8-16 bars
|
|
17
|
+
- **Limitation:** Linear ramps feel mechanical. Always prefer curves for musical expression.
|
|
18
|
+
|
|
19
|
+
### Exponential Curves
|
|
20
|
+
Slow start, accelerating change. Mimics how tension works in music — the last 4 bars contain more change than the first 12. Use for:
|
|
21
|
+
- **Dramatic filter sweeps** — the ear perceives exponential change as "building"
|
|
22
|
+
- **Reverb tail growth** — send level increasing exponentially creates "swelling space"
|
|
23
|
+
- **Key insight:** Human perception of loudness is logarithmic, so exponential volume changes feel linear. Linear volume fades feel like they get quiet too fast at first.
|
|
24
|
+
|
|
25
|
+
### S-Curves
|
|
26
|
+
Slow start, fast middle, slow end. The most natural shape for transitions. Use for:
|
|
27
|
+
- **Crossfades between elements** — one fades out as another fades in
|
|
28
|
+
- **Filter sweeps that "settle"** — opens quickly in the middle, then gently arrives at target
|
|
29
|
+
- **The Villalobos transition:** S-curve on multiple parameters simultaneously over 32 bars
|
|
30
|
+
|
|
31
|
+
### Perlin Noise
|
|
32
|
+
Smooth, organic randomness. Each value is related to the previous one (no sudden jumps) but the path is unpredictable. Use for:
|
|
33
|
+
- **Filter cutoff drift** — sounds like a hand slowly exploring a knob
|
|
34
|
+
- **Send level breathing** — reverb/delay amount fluctuates organically
|
|
35
|
+
- **Oscillator detune wandering** — pitch instability that feels analog
|
|
36
|
+
- **Key insight:** Perlin noise at 0.05-0.2 Hz is below conscious perception. The listener feels "alive" without knowing why.
|
|
37
|
+
|
|
38
|
+
### Brownian Motion
|
|
39
|
+
Random walk — each step is small but the cumulative drift can be large. More unpredictable than Perlin. Use for:
|
|
40
|
+
- **Very slow parameter evolution** over minutes — the sound "wanders" like weather
|
|
41
|
+
- **Stereo field drifting** — pan automation that meanders rather than oscillates
|
|
42
|
+
- **Combined with manual override:** Set Brownian as a baseline, then make manual adjustments on top
|
|
43
|
+
|
|
44
|
+
### Step Automation
|
|
45
|
+
Discrete jumps between values. The opposite of smooth. Use for:
|
|
46
|
+
- **Rhythmic gating** — volume steps creating on/off patterns (trance gate effect)
|
|
47
|
+
- **Filter steps** — different cutoff per beat for rhythmic timbral changes
|
|
48
|
+
- **The glitch technique:** Very fast steps (32nd or 64th note rate) on multiple parameters simultaneously = controlled chaos
|
|
49
|
+
|
|
50
|
+
### Sawtooth / Triangle Automation
|
|
51
|
+
Repeating rise-and-fall patterns. Use for:
|
|
52
|
+
- **Pseudo-LFO on parameters that don't have built-in modulation** — draw a triangle on track volume for tremolo
|
|
53
|
+
- **Rising sawtooth on filter** — creates repetitive filter sweeps that reset every bar (trance/acid)
|
|
54
|
+
- **Asymmetric saw:** Fast rise, slow fall = different musical effect than slow rise, fast fall
|
|
55
|
+
|
|
56
|
+
---
|
|
57
|
+
|
|
58
|
+
## Part 2: What to Automate (Beyond the Obvious)
|
|
59
|
+
|
|
60
|
+
Most producers only automate volume, pan, and filter cutoff. The masters automate everything.
|
|
61
|
+
|
|
62
|
+
### Send Levels (The Dub Producer's Instrument)
|
|
63
|
+
- **Reverb send throws** — 0→70% for half a beat, then back to 0. The element stabs into the reverb space and the tail fills the gap. King Tubby, Lee "Scratch" Perry, and Basic Channel all treat the send knob as a performance instrument.
|
|
64
|
+
- **Delay send rhythmic patterns** — automate the send in a rhythmic pattern (not on every beat, but on specific accents). This creates a call-and-response between the dry and wet signals.
|
|
65
|
+
- **Cross-send modulation** — automate Send A (reverb) going UP while Send B (delay) goes DOWN over 16 bars, then reverse. The spatial character morphs from "room" to "echo" and back.
|
|
66
|
+
|
|
67
|
+
### Filter Resonance (Not Just Cutoff)
|
|
68
|
+
- **Resonance alone** without moving cutoff — creates a subtle "emphasis" that brightens and thins the sound at the current cutoff point. Automate 15-40% range.
|
|
69
|
+
- **Resonance spikes** — brief 0→80% resonance for 1 beat creates a "ring" or "ping" at the filter frequency. Musical accent.
|
|
70
|
+
- **Counter-motion:** Cutoff goes down while resonance goes up — the sound gets darker but the filter "screams" more. Creates tension.
|
|
71
|
+
|
|
72
|
+
### Distortion Parameters
|
|
73
|
+
- **Saturator Drive automated with the beat** — drive increases on beats 2 and 4 = the mix gets grittier on the snare hits. Pull back on beats 1 and 3 for the kick to stay clean.
|
|
74
|
+
- **Roar stage mix** — in Parallel mode, automate the balance between stages. Stage 1 (clean tube) dominant in verses, Stage 2 (aggressive) dominant in choruses.
|
|
75
|
+
- **Erosion Amount as texture evolution** — slowly increase Erosion over a 64-bar section. The sound gradually degrades from pristine to lo-fi. The listener doesn't notice the transition — they just feel the vibe shift.
|
|
76
|
+
|
|
77
|
+
### Reverb Internal Parameters
|
|
78
|
+
- **Decay Time automation** — short decay (1s) during busy sections for clarity, long decay (5-8s) during breakdowns for depth. The room "breathes" with the arrangement.
|
|
79
|
+
- **Reverb Freeze** — automate on/off. Freeze captures the current reverb tail as a drone. Use at section transitions: Freeze ON for 4 bars during breakdown, OFF when the beat returns.
|
|
80
|
+
- **Diffusion** — low diffusion during rhythmic sections (you hear distinct echoes), high diffusion during ambient sections (smooth wash). The reverb character matches the musical energy.
|
|
81
|
+
- **Pre-delay** — increase pre-delay during loud sections (separates reverb from source for clarity), decrease during quiet sections (source and reverb merge into one).
|
|
82
|
+
|
|
83
|
+
### Delay Internal Parameters
|
|
84
|
+
- **Feedback modulation** — push to 85% for 2 beats then pull to 50%. Creates a momentary feedback spiral that self-limits. The Dub Siren technique.
|
|
85
|
+
- **Delay Time (in Repitch mode)** — changing delay time pitches the echoes. Automate a slow sweep (±10% over 8 bars) for warped, wow-and-flutter echoes. Basic Channel signature.
|
|
86
|
+
- **Filter inside the delay** — automate the delay's internal filter cutoff. Each echo gets progressively darker (or brighter). Creates a natural "fading into distance" effect.
|
|
87
|
+
- **Mod Freq + Dly < Mod** — automate the modulation amount. During sparse sections, increase modulation for wobbly, organic echoes. During dense sections, reduce for cleaner timing.
|
|
88
|
+
|
|
89
|
+
### Synthesis Parameters You Might Not Think to Automate
|
|
90
|
+
- **Wavetable Position** — LFO is obvious, but manually drawn automation tells a specific timbral story. Draw the position to follow the emotional arc: brighter wavetable positions during peaks, darker during valleys.
|
|
91
|
+
- **FM Amount (Operator)** — automate the modulator level. Low during pads, spike during stabs, medium during leads. The harmonic complexity follows the musical tension.
|
|
92
|
+
- **Oscillator feedback** — in Operator, automate feedback 10-40% range. Creates a sound that morphs from pure (low feedback) to gritty (high feedback) over time.
|
|
93
|
+
- **Drift amount** — in Drift synth, automate the Drift parameter itself. Low Drift during precise sections, high Drift during loose, organic sections.
|
|
94
|
+
- **Unison Amount** (Wavetable) — automate 0→50% over a build-up. The sound literally "widens and thickens" as the section grows. Return to 0 for a sudden "focused" impact.
|
|
95
|
+
|
|
96
|
+
### Rack Chain Volumes
|
|
97
|
+
- **Audio Effect Rack with multiple chains** — automate the chain selector or individual chain volumes to morph between completely different effect configurations. Chain 1: clean reverb. Chain 2: distorted delay. Chain 3: granular destruction. Crossfade between them = the sound evolves through processing states.
|
|
98
|
+
- **Instrument Rack layers** — automate the chain volumes of a layered synth. Start with only the sub layer audible, gradually bring in the mid layer, then the bright layer. The sound "unfolds" from bottom to top.
|
|
99
|
+
|
|
100
|
+
---
|
|
101
|
+
|
|
102
|
+
## Part 3: Multi-Parameter Automation (The Macro Gesture)
|
|
103
|
+
|
|
104
|
+
The most powerful automation isn't on single parameters — it's on coordinated groups that create a single musical gesture.
|
|
105
|
+
|
|
106
|
+
### The "Open Up" Gesture
|
|
107
|
+
Simultaneously automate over 8-16 bars:
|
|
108
|
+
- Filter cutoff: 30% → 65%
|
|
109
|
+
- Filter resonance: 15% → 30%
|
|
110
|
+
- Reverb send: 25% → 45%
|
|
111
|
+
- Stereo width (or pan spread): narrow → wide
|
|
112
|
+
- **Musical meaning:** The sound "opens up" — goes from closed/intimate to wide/expansive. Use at the transition from verse to chorus, from build to drop.
|
|
113
|
+
|
|
114
|
+
### The "Submerge" Gesture
|
|
115
|
+
Simultaneously automate over 16-32 bars:
|
|
116
|
+
- Filter cutoff: 65% → 25%
|
|
117
|
+
- Reverb decay: 3s → 8s
|
|
118
|
+
- Delay feedback: 40% → 70%
|
|
119
|
+
- Volume: 0dB → -6dB
|
|
120
|
+
- Erosion amount: 0% → 15%
|
|
121
|
+
- **Musical meaning:** The sound "submerges" — sinks into depth and distance. Use at the transition into a breakdown or outro.
|
|
122
|
+
|
|
123
|
+
### The "WTF" Gesture (2-4 beats only)
|
|
124
|
+
Simultaneously snap:
|
|
125
|
+
- Reverb send: 0% → 100% (everything washes out)
|
|
126
|
+
- Delay feedback: 50% → 95% (echoes spiral)
|
|
127
|
+
- Filter cutoff: current → fully open
|
|
128
|
+
- Then ALL snap back to normal after 2-4 beats
|
|
129
|
+
- **Musical meaning:** A moment of chaos that instantly resolves. The listener's brain says "what was THAT?" and re-engages attention.
|
|
130
|
+
|
|
131
|
+
### The "Human Hand" Technique
|
|
132
|
+
Record automation live (via mouse or MIDI controller) instead of drawing it. The tiny timing imperfections and non-mathematical curves create a fundamentally different feel than drawn automation. Then edit the recording — smooth the extreme mistakes but keep the organic character.
|
|
133
|
+
|
|
134
|
+
This is how Villalobos works live: filter sweeps are performed, not drawn. The audience feels the human gesture even when they can't see the performer.
|
|
135
|
+
|
|
136
|
+
---
|
|
137
|
+
|
|
138
|
+
## Part 4: Automation Density by Section
|
|
139
|
+
|
|
140
|
+
Different parts of a track need different automation density:
|
|
141
|
+
|
|
142
|
+
### Intro (sparse automation)
|
|
143
|
+
- 1-2 parameters moving slowly (filter, reverb send)
|
|
144
|
+
- Very slow rates (0.05-0.1 Hz effective rate)
|
|
145
|
+
- Purpose: establish mood, create anticipation
|
|
146
|
+
|
|
147
|
+
### Build-Up (increasing density)
|
|
148
|
+
- 3-5 parameters, all moving in the same "opening" direction
|
|
149
|
+
- Exponential curves — change accelerates
|
|
150
|
+
- Purpose: create tension and forward momentum
|
|
151
|
+
|
|
152
|
+
### Peak/Drop (maximum density)
|
|
153
|
+
- 5-8 parameters all active
|
|
154
|
+
- Mix of slow sweeps and rhythmic modulation
|
|
155
|
+
- Send throws, filter accents, distortion spikes
|
|
156
|
+
- Purpose: maximum energy and interest
|
|
157
|
+
|
|
158
|
+
### Breakdown (sudden reduction)
|
|
159
|
+
- Drop to 1-2 parameters
|
|
160
|
+
- Very slow, gentle movement
|
|
161
|
+
- Purpose: contrast, breathing room, emotional reset
|
|
162
|
+
|
|
163
|
+
### Outro (mirror of intro)
|
|
164
|
+
- Gradually reduce automation density
|
|
165
|
+
- Parameters return to starting values (or close)
|
|
166
|
+
- The final automation move should be the filter closing to its lowest point
|
|
167
|
+
- Purpose: the sound "returns to where it started" — cyclical, complete
|
|
168
|
+
|
|
169
|
+
---
|
|
170
|
+
|
|
171
|
+
## Part 5: Learning from the Masters
|
|
172
|
+
|
|
173
|
+
### Villalobos: Filter as Melody
|
|
174
|
+
Ricardo Villalobos automates a single lowpass filter on a pad for 8+ minutes. The filter IS the melody — it opens to reveal harmonics, closes to create tension, breathes with the groove. He never draws automation — he performs it live, which gives each performance unique character. The filter rarely moves by more than 5-10% at a time, but over 8 minutes it covers the full range.
|
|
175
|
+
|
|
176
|
+
### Basic Channel: Space as Composition
|
|
177
|
+
Mark Ernestus and Moritz von Oswald automate delay send levels, delay feedback, and reverb sends as their primary compositional tool. A chord stab enters the delay at 70% feedback — the echoes build up, creating a harmonic cloud. Then the feedback drops to 40% — the cloud thins and the next stab enters. The delay IS the arrangement.
|
|
178
|
+
|
|
179
|
+
### Aphex Twin: Parameter Density
|
|
180
|
+
Richard D. James automates dozens of parameters simultaneously at very high speed (32nd note and faster). Filter cutoffs, oscillator frequencies, effect parameters all changing independently at different rates create the "impossible complexity" that defines his sound. The key: each parameter has its own automation rate, and the rates are intentionally non-related (no multiples). This creates ever-evolving patterns that never exactly repeat.
|
|
181
|
+
|
|
182
|
+
### SOPHIE: Extreme Parameter Snapshots
|
|
183
|
+
SOPHIE's technique was to set up a sound, then rapidly switch between extreme parameter configurations — like snapshots. Filter fully open → fully closed in one beat. Distortion zero → maximum in one step. No smooth transitions — pure contrast. This creates the "hyperplastic" character: sounds that feel like they're being molded by an invisible force.
|
|
184
|
+
|
|
185
|
+
### Boards of Canada: Decay as Atmosphere
|
|
186
|
+
Marcus Eoin and Michael Sandison automate parameters to simulate degradation: filter slowly closing over minutes (tape getting worn), Vinyl Distortion amount slowly increasing (record deteriorating), subtle pitch detune growing (tape machine dying). The music doesn't just play — it deteriorates, creating the nostalgic feeling of listening to something from the past.
|
|
187
|
+
|
|
188
|
+
### Amon Tobin: Micro-Edit as Expression
|
|
189
|
+
Amon Tobin automates at the sample level — chopping, reordering, and processing tiny fragments of audio with rapidly changing effects. Each 16th note might have a different filter setting, different reverb amount, different distortion level. The automation IS the rhythm.
|
|
190
|
+
|
|
191
|
+
---
|
|
192
|
+
|
|
193
|
+
## Part 6: Wonder Mode Automation Intelligence
|
|
194
|
+
|
|
195
|
+
When Wonder Mode generates variants, the automation layer is what separates "a clip arrangement" from "a musical journey." Every Wonder variant should include:
|
|
196
|
+
|
|
197
|
+
1. **Filter arc** — at minimum, one element's filter should evolve over the full track length
|
|
198
|
+
2. **Space arc** — reverb/delay sends should breathe with the arrangement density
|
|
199
|
+
3. **Micro-modulation** — every sustained sound should have sub-perceptual LFO on at least one parameter
|
|
200
|
+
4. **2-3 macro gestures** — coordinated multi-parameter moves at section transitions
|
|
201
|
+
5. **1-2 WTF moments** — brief parameter disruptions that break and re-establish the hypnosis
|
|
202
|
+
6. **Temporal density mapping** — automation density should follow the arrangement energy (sparse in intro/outro, dense at peaks)
|
|
203
|
+
|
|
204
|
+
The automation is not optional garnish — it is the primary vehicle for musical expression in electronic music. A perfectly arranged track with no automation is a skeleton. The automation is the flesh, the breath, and the soul.
|