Skip to content

State Read-Back

Query the current state of your project from Lua scripts. All functions return snapshots — the data is captured at the moment the script runs.

local tracks = pl.get_tracks()

Returns an array of all tracks:

FieldTypeDescription
idnumberTrack ID (0–127, stable)
namestringDisplay name
trackTypestring"audio", "midi", "video", "bus", "text", "face", "automation"
muteboolMuted
soloboolSolo enabled
armboolArmed for recording
volumenumberVolume (0.0–2.0)
pannumberPan (-1.0 to 1.0)
colornumberColor as RGBA u32
freezeboolFrozen
lockboolLocked from editing
monoboolMono (true) or stereo (false)
inputActiveboolInput monitoring enabled
outputRoutingstring"stereo-out", "bus-1", etc.
instrumenttable/nilInstrument plugin { id, name, vendor, format, bypassed }
effectsarrayEffect chain [{ id, name, vendor, format, bypassed }, ...]
regionCountnumberNumber of regions on this track
local tracks = pl.get_tracks()
for _, track in ipairs(tracks) do
if track.mute then
pl.log(track.name .. " is muted")
end
end
local track = pl.get_track(0) -- by ID
if track then
pl.log(track.name .. " vol=" .. track.volume)
end

local regions = pl.get_regions(trackId)

Returns an array of regions on the given track:

FieldTypeDescription
idstringUnique region ID
namestringDisplay name
regionTypestring"audio", "midi", "video", "text", "face", "automation"
ticknumberPosition in ticks (PPQ=960)
durationnumberDuration in ticks
colorstringHex color (e.g. "#FFD700")
mutedboolRegion muted
gainnumberAudio gain (default 1.0)
assetIdstring/nilAsset reference (audio/video regions)

For MIDI regions, an additional events field is returned:

FieldTypeDescription
eventsarray[{ pitch, velocity, tick, duration, channel }, ...]
local regions = pl.get_regions(2)
for _, r in ipairs(regions) do
pl.log(r.name .. " at tick " .. r.tick)
if r.events then
pl.log(" " .. #r.events .. " MIDI notes")
end
end

local sel = pl.get_selection()

Returns the current selection state:

FieldTypeDescription
trackIdsarraySelected track IDs [0, 3, 5]
regionIdsarraySelected region IDs ["r1", "r2"]
local sel = pl.get_selection()
pl.log(#sel.trackIds .. " tracks selected")
pl.log(#sel.regionIds .. " regions selected")
-- Mute all selected tracks
for _, id in ipairs(sel.trackIds) do
local track = pl.get_track(id)
if track and not track.mute then
pl.cmd("track:toggle-mute", { trackId = id })
end
end

local mixer = pl.get_mixer()

Returns mixer channel state:

FieldTypeDescription
mastertableMaster channel { volume, pan, mute, solo, effects[] }
fxarrayFX return channels (up to 8)
outputsarrayOutput channels (up to 4)

Each channel has:

FieldTypeDescription
volumenumber0.0–2.0
pannumber-1.0 to 1.0
muteboolMuted
soloboolSolo enabled
effectsarrayFX chain [{ id, name, vendor, format, bypassed }, ...]
local mixer = pl.get_mixer()
pl.log("Master volume: " .. mixer.master.volume)
for i, fx in ipairs(mixer.fx) do
if not fx.mute then
pl.log("FX " .. i .. " vol=" .. fx.volume)
end
end

local assets = pl.get_assets()

Returns an array of project assets:

FieldTypeDescription
idstringAsset ID
namestringDisplay name
uristringRelative path from project root
assetTypestring"audio", "video", "midi", "image", "face", "script"
durationnumberDuration in seconds
sampleRatenumberAudio sample rate (Hz)
channelsnumberAudio channel count
framesnumberTotal audio frames
local assets = pl.get_assets()
for _, a in ipairs(assets) do
if a.assetType == "audio" then
pl.log(a.name .. "" .. string.format("%.1fs", a.duration))
end
end

-- All automation lanes for a track
local lanes = pl.get_automation(trackId)
-- Points for a specific parameter
local points = pl.get_automation(trackId, "volume")

Returns automation data for a track. Without paramId, returns all lanes as { paramId = [points] }. With paramId, returns just the points array.

Each point:

FieldTypeDescription
timenumberTime position
valuenumberParameter value
curvenumberCurve shape
local lanes = pl.get_automation(0)
for param_id, points in pairs(lanes) do
pl.log(param_id .. ": " .. #points .. " points")
end

-- Instrument plugin on track
local inst = pl.get_plugin_params(trackId)
-- Effect at index (0-based)
local fx = pl.get_plugin_params(trackId, 0)

Returns plugin info { id, name, vendor, format, bypassed } or nil.

local inst = pl.get_plugin_params(2)
if inst then
pl.log("Instrument: " .. inst.name .. " (" .. inst.format .. ")")
end
local fx = pl.get_plugin_params(2, 0)
if fx then
pl.log("First effect: " .. fx.name)
end