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…)
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.
GP-Setlist.tosc.zip (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 local arguments = message -- If the setlist changes in GP, request the new song list if path == '/SetListChanged' then sendOSC('/SetList/GetSongList') end -- 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) end -- Get the currently selected song number and store in a label if path == '/CurrentSongIndex' then local song = arguments.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)) end -- 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) end end -- 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) end -- 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) end end end
Oh, and @pianopaul I noticed that they’ve now added Gig Performer to their list of apps