Skip to content

Automation

Automation lets you record and draw changes to track parameters over time — volume fades, pan sweeps, plugin parameter changes, MIDI CC data, and compositor layer properties.

Automation data is stored as CC (Continuous Controller) events on automation regions. Each event is a tuple of:

FieldTypeDescription
ticki64Position in ticks (960 PPQ)
ccu8Controller number (0–127)
valueu16Controller value (0–16383 for 14-bit resolution)

Events are recorded at tick-level precision and stored per-region on automation tracks.

Automation tracks are special tracks with track_type = Automation. Each automation track is linked to a parent node via a Parent edge — this determines what the automation controls.

Parent nodes can be:

  • A track — automates track volume, pan, or plugin parameters
  • A compositor layer — automates layer transform, opacity, mask, or 3D camera properties
  1. Arm automation recording with the transport’s automation arm button
  2. Start playback (or recording)
  3. Move the parameter you want to automate — volume fader, pan knob, or plugin control
  4. Stop playback — the recorded automation data is saved as CC events in a new region
CommandDescription
transport:toggle-record-autoToggle automation record armed state
automation:start-recordingStart recording automation on armed tracks
automation:stop-recordingStop recording and create automation regions
automation:set-parentSet or clear the parent node for an automation track
-- Arm automation recording
pl.cmd("transport:toggle-record-auto")
-- Check if automation is armed
local armed = plinken.get("transport", "automation_armed")
-- Start recording (usually triggered automatically with playback)
pl.cmd("automation:start-recording")
-- Stop recording and create regions
pl.cmd("automation:stop-recording")
PropertyTypeDefaultDescription
automation_armedboolfalseWhether automation recording is armed

Open the automation editor to view and edit automation curves graphically. You can:

  • Draw new automation shapes with the pencil tool
  • Adjust individual CC event points
  • Delete events by selecting and pressing ⌫
  • Copy/paste automation data between regions
-- Update CC events on a region (for automation editing)
-- Each event: { tick, cc, value }
pl.cmd("region:update-cc-events", {
track_id = 5,
region_id = "r_auto_1",
cc_events = {
{ tick = 0, cc = 7, value = 8192 }, -- Volume at center
{ tick = 960, cc = 7, value = 12000 }, -- Volume up
{ tick = 1920, cc = 7, value = 4000 }, -- Volume down
{ tick = 3840, cc = 7, value = 8192 }, -- Volume back to center
}
})

CC-to-parameter mapping is configured in Settings > Automation. Each mapping defines:

FieldDescription
CC numberWhich controller number to listen to
Parameter IDWhich parameter to control
TransformLinear transform: output = input × a + b

The transform converts the normalized internal range (−1.0 to +1.0) to real-world units for the target parameter.

See Settings > Automation for the full mapper configuration.

When an automation track is linked to a compositor layer, CC numbers map to layer properties:

CC RangeParameters
CC 0–9Transform (position X/Y, scale X/Y, rotation, anchor X/Y, content pan/zoom)
CC 10Opacity
CC 20–27Mask (position, size, corner radius, feather)
CC 40–513D Camera (orbit target, distance, azimuth, elevation, focal length, focus, look target, deadzone)
-- Create a volume fade-in on track 1's automation track
-- CC 7 = Volume, values in 14-bit range (0–16383)
local events = {}
for i = 0, 7680, 240 do -- Every 16th note over 2 bars
local normalized = i / 7680 -- 0.0 to 1.0
local value = math.floor(normalized * 16383)
table.insert(events, { tick = i, cc = 7, value = value })
end
-- CC 10 = Pan, center = 8192, left = 0, right = 16383
local events = {}
for i = 0, 3840, 120 do -- Every 32nd note over 1 bar
local phase = (i / 3840) * math.pi * 2 -- Full sweep
local value = math.floor((math.sin(phase) * 0.5 + 0.5) * 16383)
table.insert(events, { tick = i, cc = 10, value = value })
end