New version of TouchOSC with scripting apparently

This might be very interesting


We should tell them about Gig Performer, this list of compatible Apps is on the Hexler Site

Yeah, already did


Could be a very clever alternative to Lemur

Cheers for posting - looks good.

I’d been dabbling (but not fully committed) with Open Stage Control which was some advantages (no app so totally device agnostic) but some bits can get quite complex (CSS formatting, need to know a reasonable amount of JS, etc).

Will need to have a play with scripting, but if it’s relatively simple (and everyone should take note of GPScript for how to make a scripting language easy to use!) then this might make complex setups a bit easier.

They are using Lua …. I deliberately chose not to go down that route


How come you didn’t want to go that route? (I know nothing of Lua; hadn’t even heard of it before today…)

Open stage control has scripting available at a global level, a widget level, and within widget groups. Open Stage Control uses javascript, which I think was the obvious choice since the whole thing is browser based.

It also allows formatting and other clever things through CSS, although I haven’t used that at all.

Why not? Is the tricky Lemur scripting langage still better?

I was able to replicate a lot of the song list features that I had recently figured out in Open Stage Control.

Using multiple ‘Label’ controls and the standard UI properties pane, I could specify the received OSC message in order to display the song names, and the sent OSC message to change the song in GP when clicking the control. Then using the new scripting feature, I was able to alter the background colour of the song labels based on either clicking them in TouchOSC, or by a received ‘CurrentSongIndex’ message from GP.

I also used scripting to ask for the song list if the ‘Setlist Changed’ message was received from GP.

Interesting. I was going to try and find time to look at this myself. Are you willing to post examples?

Yep, sure. I will get something together. I’ve only been playing around with the editor. I haven’t yet looked up whether I have to buy a new mobile app version.


I tried to replicate what I did in Open Stage Control. TouchOSC doesn’t have anywhere near the formatting options that Open Stage Control has, but I was able to get the core template replicated.
One thing was that I don’t think TouchOSC can have a scrollable page, so a long song list would have to be split between different pages/tabs. (5.3 KB)

For the scripters, below is an example of the global script I used to manage things like calculating the song counts and song part counts.

-- Callback when an OSC message is received
function onReceiveOSC(message, connections)
  -- Parse the OSC message
  local path = message[1]
  local arguments = message[2]
  -- If the setlist changes in GP, request the new song list
  if path == '/SetListChanged' then
  -- Use LUA string functions to extract the song number
  -- from the GP SongName message e.g. /SongName9
  -- The last message received will provide the total song count
  if string.find(path, '/SongName') then
    local songCount = tonumber(string.match(path, '%d+')) + 1
    -- Store the song count in a label
    self.children['SongCount'].values.text = tostring(songCount)
  -- Get the currently selected song number and store in a label
  if path == '/CurrentSongIndex' then
    local song =  arguments[1].value + 1
    -- Rather than set the label directly, you can also trigger
    -- a callback for the label and pass it the song count.
    -- There is a small script in the CurrentSong label to handle this.
    self.notify(self.children['CurrentSong'], tostring(song))
  -- Once the last song name has been received (and total count 
  -- is calculated), hide any song labels that aren't required.
  if path == '/SongListEnd' then
    local songCount = tonumber(self.children['SongCount'].values.text)
    -- Iterate through all the song labels in the 'songs' group
    -- and set the visibility property. Adding similar controls
    -- to a 'Group' gives them an index, which is useful for processing.
    for i = 1, #self.children['songs'].children do
      self.children['songs'].children[i].visible = (i <= songCount)
  -- Similar to the song count, use LUA string functions to extract
  -- the song part number and store in a hidden label.
  if string.find(path, '/SongPart%d+') then
    local partCount = tonumber(string.match(path, '%d+')) + 1
    self.children['SongPartCount'].values.text = tostring(partCount)
  -- Once the last song part message is received (and total song part
  -- is calculated), hide any song part labels that aren't required.
  if path == '/SongPartsEnd' then
    local partCount = tonumber(self.children['SongPartCount'].values.text)
    -- Iterate through all the song part labels in the 'SongParts' group
    -- and set the visibility property.
    for i = 1, #self.children['SongParts'].children do
      self.children['SongParts'].children[i].visible = (i <= partCount)

Oh, and @pianopaul I noticed that they’ve now added Gig Performer to their list of apps :slight_smile: