OpenStudio Lua Scripting API Reference
OpenStudio currently provides a Lua scripting engine through the legacy openstudio.* namespace for compatibility. Scripts can be edited and run from the Script Editor (View > Script Editor).
Function
Arguments
Returns
Description
openstudio.getTrackCount()
none
number
Returns total number of tracks
openstudio.addTrack(name)
name: string
trackId: string
Creates a new audio track
openstudio.removeTrack(trackId)
trackId: string
boolean
Removes a track
openstudio.setTrackVolume(trackId, dB)
trackId: string, dB: number
none
Set track volume (-60 to +12 dB)
openstudio.setTrackPan(trackId, pan)
trackId: string, pan: number
none
Set track pan (-1.0 L to +1.0 R)
openstudio.setTrackMute(trackId, muted)
trackId: string, muted: boolean
none
Set track mute state
openstudio.setTrackSolo(trackId, soloed)
trackId: string, soloed: boolean
none
Set track solo state
openstudio.setTrackArm(trackId, armed)
trackId: string, armed: boolean
none
Set track record arm
openstudio.reorderTrack(fromIdx, toIdx)
from: number, to: number
none
Move track position
Function
Arguments
Returns
Description
openstudio.play()
none
none
Start playback
openstudio.stop()
none
none
Stop playback
openstudio.record()
none
none
Start recording (arms must be set)
openstudio.isPlaying()
none
boolean
Check if transport is playing
openstudio.isRecording()
none
boolean
Check if transport is recording
openstudio.getPlayhead()
none
number
Get playhead position in seconds
openstudio.setPlayhead(time)
time: number
none
Set playhead position in seconds
openstudio.getTempo()
none
number
Get current BPM
openstudio.setTempo(bpm)
bpm: number
none
Set tempo (20-999 BPM)
openstudio.getTimeSignature()
none
num, den
Get time signature (two return values)
openstudio.setTimeSignature(num, den)
num: number, den: number
none
Set time signature
openstudio.setLoop(enabled, start, end)
enabled: boolean, start: number, end: number
none
Set loop region
Function
Arguments
Returns
Description
openstudio.getTrackFX(trackId)
trackId: string
table
Get list of track FX plugins
openstudio.getTrackInputFX(trackId)
trackId: string
table
Get list of input FX plugins
openstudio.addTrackFX(trackId, pluginId)
trackId: string, pluginId: string
boolean
Add FX plugin to track
openstudio.removeTrackFX(trackId, index)
trackId: string, index: number
boolean
Remove FX at index
openstudio.bypassTrackFX(trackId, index, bypassed)
trackId: string, index: number, bypassed: boolean
none
Toggle FX bypass
openstudio.addTrackJSFX(trackId, effectName)
trackId: string, name: string
boolean
Add a built-in OpenStudio effect (legacy OpenStudio names still work)
openstudio.getAvailableJSFX()
none
table
List available built-in OpenStudio effects
Function
Arguments
Returns
Description
openstudio.setMasterVolume(volume)
volume: number
none
Set master volume (0.0 to 2.0 linear)
openstudio.getMasterVolume()
none
number
Get master volume
openstudio.setMasterPan(pan)
pan: number
none
Set master pan (-1.0 to +1.0)
openstudio.getMasterPan()
none
number
Get master pan
Function
Arguments
Returns
Description
openstudio.addTrackSend(trackId, destTrackId)
trackId, destTrackId: string
number
Add send, returns send index
openstudio.removeTrackSend(trackId, index)
trackId: string, index: number
none
Remove send at index
openstudio.setTrackSendLevel(trackId, index, level)
trackId: string, index: number, level: number
none
Set send level (0.0 to 1.0)
openstudio.getTrackSends(trackId)
trackId: string
table
Get all sends for a track
Function
Arguments
Returns
Description
openstudio.addPlaybackClip(file, start, duration, trackId, offset, volumeDB)
see args
none
Add audio clip for playback
openstudio.removePlaybackClip(trackId, file, start)
trackId, file: string, start: number
none
Remove a playback clip
openstudio.clearPlaybackClips()
none
none
Remove all playback clips
Function
Arguments
Returns
Description
openstudio.setAutomationPoints(trackId, param, points)
trackId: string, param: string, points: table
none
Set automation points (table of {time, value})
openstudio.setAutomationMode(trackId, param, mode)
trackId: string, param: string, mode: string
none
Set automation mode ("read", "write", "touch", "latch")
openstudio.getAutomationMode(trackId, param)
trackId: string, param: string
string
Get automation mode
openstudio.clearAutomation(trackId, param)
trackId: string, param: string
none
Clear all automation points
Function
Arguments
Returns
Description
openstudio.measureLUFS(filePath)
filePath: string
table
Measure loudness (integrated, shortTerm, momentary, truePeak, range)
openstudio.detectTransients(filePath, threshold)
filePath: string, threshold: number
table
Detect transient positions in seconds
openstudio.reverseAudioFile(filePath, outputPath)
filePath, outputPath: string
boolean
Reverse an audio file
openstudio.detectSilentRegions(filePath, thresholdDB, minDuration)
filePath: string, thresholdDB: number, minDuration: number
table
Detect silent regions
Function
Arguments
Returns
Description
openstudio.freezeTrack(trackId)
trackId: string
boolean
Freeze track (render FX to audio)
openstudio.unfreezeTrack(trackId)
trackId: string
boolean
Unfreeze track (restore original)
Function
Arguments
Returns
Description
openstudio.renderProject(filePath, format, bitDepth, sampleRate, startTime, endTime)
see args
boolean
Offline render project to file
Function
Arguments
Returns
Description
openstudio.getMIDIDevices()
none
table
List available MIDI input devices
Function
Arguments
Returns
Description
openstudio.setMetronomeEnabled(enabled)
enabled: boolean
none
Enable/disable metronome
openstudio.isMetronomeEnabled()
none
boolean
Check if metronome is enabled
Function
Arguments
Returns
Description
openstudio.scanForPlugins()
none
none
Trigger VST3 plugin scan
openstudio.getAvailablePlugins()
none
table
List all scanned plugins
Function
Arguments
Returns
Description
openstudio.print(...)
any values
none
Print to script console
openstudio.getAppVersion()
none
string
Get OpenStudio version string
openstudio.showMessage(title, message)
title, message: string
none
Show a message dialog
openstudio.fileDialog(title, filters)
title, filters: string
string
Open file picker dialog
Create a track and set its volume
local id = openstudio .addTrack (" Vocals" )
openstudio .setTrackVolume (id , - 6.0 ) -- -6 dB
openstudio .setTrackPan (id , - 0.5 ) -- pan left 50%
openstudio .setTempo (120 )
openstudio .setLoop (true , 0 , 8 ) -- loop first 8 seconds
openstudio .play ()
local stats = openstudio .measureLUFS (" C:/audio/mix.wav" )
openstudio .print (" Integrated LUFS: " .. stats .integrated )
openstudio .print (" True Peak: " .. stats .truePeak .. " dBTP" )
Batch add effects to all tracks
for i = 1 , openstudio .getTrackCount () do
-- Add built-in EQ to every track
openstudio .addTrackJSFX (tostring (i ), " OpenStudio EQ" )
end