Scripting Solutions
This topic contains a number of actual solutions using Lua Scripting in Q-SYS Designer.
In Q-SYS Designer there are a number of places that have a group of toggle type buttons that operate independently. For example, the Mixer Solo buttons. At times you may find a reason to have these buttons act like radio buttons. With the following script, you can make a group of toggle type buttons into radio buttons, allowing only one button active at a time. The Control Pin outputs of the buttons in the group connect to the Script inputs. In this example the Solo buttons normally act independently, with the script, they now function like radio buttons.
Lua Script
-- Radio Buttons, turn off all but the control that changed function exclude( ctl ) if ctl.Value == 1 then for i, c in ipairs( Controls.Inputs ) do if c ~= ctl then c.Value = 0 end end end end -- assign function to control change for ix, ctl in ipairs( Controls.Inputs ) do ctl.EventHandler = exclude end
This script is designed to switch a router to the loudest of two microphone inputs. If a person had two microphones and was moving between the two, this the microphone used is closest to the person speaking. The script can be modified to accept more inputs, and the inputs do not have to be microphones.
Lua Script
-- Switch router to signal with greatest level -- cin_meter1 = Controls.Inputs[1] cin_meter2 = Controls.Inputs[2] cout_select = Controls.Outputs[1] -- Compare two values and switch a router to the greater CompTimer.EventHandler = function() if cin_meter1.Value > cin_meter2.Value then cout_select.Value = 1 else cout_select.Value = 2 end end -- Every .5 seconds, run comparison CompTimer = Timer.New() Timer:Start( .5 )
The default method of selecting an audio file to play is to use the drop-down list in the Audio Player. This script allows you to select and play a file by pushing a button.
Lua Script
-- Play specified files -- NOTE: The number of trigger inputs to this script can be -- changed without changing the script files = { "A.wav", "B.wav", "C.wav" } cout_file = Controls.Outputs[1] cout_play = Controls.Outputs[2] function play( ctl ) print( "play: "..files[ctl.Index] ) cout_file.String = files[ctl.Index] cout_play:Trigger() end for i,c in ipairs( Controls.Inputs ) do c.EventHandler = play end
This script connects to the localhost IP address 127.0.0.1 on port 8080 and sends the message "This is a message" using TCP/IP. The example demonstrates the Event/EventHandler model:
:Connect
initiates the connection.- The connection event callback
.Connected
transmits the message using the:Write
method. - An Error in the initial connection attempt is handled by the
.Error
callback function.
Lua Script
socket = TcpSocket.New() socket.Connected = function(sock) socket:Write( Controls.Message.String ) print(string.format('Sent "%s" and closing socket.', Controls.Message.String ) ) socket:Disconnect() end socket.Error = function(sock, err) print("TCP socket had an error and will now close",err) socket:Disconnect() -- prevent further attempts to connect end Controls.Send.EventHandler = function() socket:Connect(Controls["IP Address"].String, Controls.Port.Value) end
This sample code activates the Play or Stop function on a TASCAM® DVD player. Details of the commands and checksum are taken from the TASCAM® DVD Player user manual. This is used in conjunction with the RS-232 Serial Port and Custom Controls components.
Lua Script
ser = SerialPorts[1] playMessage = string.char(0x02)..">PLYcFWD 17"..string.char(0x03) --Command to press 'play' stopMessage = string.char(0x02)..">STPc 98"..string.char(0x03) --Command to press 'stop' function play() ser:Write(playMessage) print("Sent Play: "..playMessage) end function stop() ser:Write(stopMessage) print("Sent Stop: "..stopMessage) end ser.EventHandler = function( port, msg ) if msg == SerialPorts.Events.Connected then print("Serial port connected") elseif msg == SerialPorts.Events.Data then print( "Response: "..port:ReadLine(SerialPorts.EOL.Custom, string.char(0x03) )) end end ser:Open(9600) Controls.Inputs[1].EventHandler = play Controls.Inputs[2].EventHandler = stop