/ HALion Developer Resource / HALion Tutorials & Guidelines / How-tos /
Snapshot Effects
On this page:
It can be useful to save the properties and values of the effects that are used on a bus in a table, for example, if you want to manage effects via a script. The following script takes a snapshot of each effect and prints out a properly formatted Lua table containing the effect properties and values.
- Load a Lua Script MIDI module into the branch of the Program Tree which contains the bus and effects that you want to print out as a table.
 - Load SnapshotEffects.lua with the Lua Script MIDI module.
 - Go to the Parameter List.
 
- Set the 
WithKeysparameter to On if you want to print out a table with the effect name as the key for the table entries. - Set the 
WithKeysparameter to Off if you want to print out the table entries as an indexed array. 
- Change the Snapshot parameter to print the table to the Output of the Lua Script MIDI module.
 - To use the printed table, copy and paste it from the Output into the script that manages the effects.
 
❕ For an example of using a table like this to manage effects via a script, see Creating an FX Chain or Creating an FX Rack.
Example
effects = {}
-- You can exclude parameters by adding them to this table.
excludedParameters = {"Enable", "Bypass", "Mix", "resetMaxGainRed"}
function excludeParameters(def)
	local exclude = false
	local name = string.lower(def.name)
	for i, parameter in ipairs(excludedParameters) do
		local name2 = string.lower(parameter)
		if name == name2  then
			exclude = true
			break
		end
	end
	return exclude
end
function onSnapshot()
	local bus = assert(this.parent:getBus(), "No bus found in the layer '"..this.parent.name.."'.")
	local foundFx = bus:findEffects()
	assert(foundFx[1], "No effects found on the bus '"..bus.name.."'.")
	effects = {}
	for i, fx in ipairs(foundFx) do
		local defs= fx.parameterDefinitions
		effects[i] = {}
		effects[i].name = fx.name
		effects[i].fxType = fx.moduleType
		effects[i].settings = {}
		for _, def in ipairs(defs) do
			local excluded = excludeParameters(def)
			if not excluded then
				if def.automatable and def.persistent and not def.readOnly then
					effects[i].settings[def.name] = fx:getParameterNormalized(def.name)
				end
			end
		end
	end
	printSnapshot()
	Snapshot = false
end
defineParameter("WithKeys", nil, true)
function printSnapshot()
	print("effects = {")
	for i, effect in ipairs(effects) do
		if WithKeys then
			-- Use the FX name without spaces as key for the table entries.
			local effectKey = string.gsub(effect.name, " ", "")
			printRaw(string.format("\t%s = {\n\t    name = %q,\n\t    fxType = %q,\n\t    settings = {", effectKey, effect.name, effect.fxType))
			for key, value in pairs(effect.settings) do
				key = string.gsub(key, "-", "_")
				printRaw(string.format("\n\t      %s = %s,", key, value))
			end
			print("\n\t  },\n\t},")
		else
			-- Print the table as an indexed array.
			printRaw(string.format("\t{ name = %q,\n\t  fxType = %q,\n\t  settings = {\n", effect.name, effect.fxType))
			for key, value in pairs(effect.settings) do
				key = string.gsub(key, "-", "_")
				printRaw(string.format("\t    %s = %s,\n", key, value))
			end
			print("\t  },\n\t},")
		end
	end
	print("}")
end
defineParameter("Snapshot", nil, false, function() if Snapshot then onSnapshot() end end)