I’m wondering if there are any plans to include some way to use Timecode (SMPTE or Midi Timecode) to trigger setlist/variation changes?
For shows that run on some (or a lot) of playback and synched lights (and pyro), timecode is usually used to keep all in sync - instead of having all cues/triggers/events triggered from one single master.
So there’s a master timecode running for the show, or each segment/song in the show, could be controlled from the bandleader, and then the video rig, lighting rig and cues (DMX) and other elements are listening to that timecode and the events/triggers are mapped onto specific timecode-values.
This is also used a lot for MIDI-switching patches for keyboards and guitars etc, where the benefit is that e.g. the guitarist can add/delete/edit all the events that need to be triggered, based on the incoming timecode, without having to bug the MD.
So I would think that a setlist/variation triggering system, based on incoming Timecode would be valuable for some Gig Performer users.
It’s actually possible right now to respond to MTC using GP Script. I wrote an example script that does this. In the gif below, the program on the left is generating MTC (the 8 messages version) and sending them to GP via an IAC port. On the right is the GP Script log displaying the received time code (it just prints a new value when the “second” changes)
Building this in to the system to make it even easier is in our list but I can’t say when it might be implemented
Here’s the gp script code I wrote to do this. In this version, in the function currently called DoSomething, you could compare the time with specific values and switch to songs or parts (or in fact anything you want)
Var
TimeCode : MidiInBlock
TimeCodeArray : integer [8] // Stores the 8 values that represent a time
// Indexes to make it clear
Const
FrameLow : integer = 0
FrameHigh : integer = 1
SecondsLow : integer = 2
SecondsHigh : integer = 3
MinutesLow : integer = 4
MinutesHigh : integer = 5
HoursLow : integer = 6
FrameAndHoursHigh : integer= 7
Function DoSomething(hours : integer, minutes : integer, seconds : integer)
Print("" + hours + ":" + minutes + ":" + seconds)
// Replace the above with tests for specific times
// and call the appropriate function to switch songs or parts
End
var
prevSecond : integer = -1 // Only print when this changes
Function CalculateTime()
var
//frame : integer = TimeCodeArray[FrameLow] + (TimeCodeArray[FrameHigh] >> 4)
seconds : integer = TimeCodeArray[SecondsLow] +
(TimeCodeArray[SecondsHigh] << 4)
minutes : integer
hours : integer
if (seconds != prevSecond)
then
prevSecond = seconds
minutes = TimeCodeArray[MinutesLow] +
(TimeCodeArray[MinutesHigh] << 4)
hours = TimeCodeArray[HoursLow] +
((TimeCodeArray[FrameAndHoursHigh] And 1) << 4)
// Now do something based on the values
DoSomething(hours, minutes, seconds)
end
End
var
index : integer
byte : integer
value : integer
On MidiEvent(m : MidiMessage) from TimeCode
if GetByte(m, 0) == 0xF1
then
byte = GetByte(m,1)
index = (byte And 0xF0) >> 4
value = byte And 0x0F
TimeCodeArray[index] = value
if index == 7
then CalculateTime() // I.e, only do this when we have a full message
end
end
End
OK, it’s cool that this is a possibility at least.
Is my understanding correct that the triggers for different events would need to be in the GP script,
and all timing changes for those triggers would have to be editied in individual lines in the script?