Bidirectional BPM syncronisation between GP and external Line6 Helix device

You can assign a CC value to the TAP switch of the Helix with the Helix “Command Center” and learn it in Gig Performer to “Tap Tempo” in “Global MIDI Assignments”.
Tapping the TAP Switch triggers Helix and GP independently to determine the BPM value.

But if the Helix device should follow BPM changes within Gig Performer, the following Scriptlet might be helpful.

The Scriptlet detects BPM value changes in Gig Performer and sends CC# 64 MIDI messages within the corresponding BPM beat.
For all Helix devices (Rack, Floor, LT, Effects, Stomp) this CC#64 value is assigned to the “Tap Footswitch Emulation”.
So the Helix TAP switch is pressed remotely by Gig Performer.

The best place for this Scriptlet is the Global Rackspace. The Scriptlet detects a BPM value change and send the changes to the Helix device.
The script contains a locking mechanism to delay the TAP operation for fast continuous BPM value changes. This happens when you change the BPM value using the mouse.

    BPM :Double = 0.0 // store Gig Performer BPM value
    TapBPM_ExecTime : Double = 0.0 // prevent the BPM tapping during a continios BPM value change
    TapBPM_LockedUntil : Double = 0.0 // Blocks the function from being called up several times
// Called automatically after script is loaded

// Send CC#64 Value 64 (Helix Tap Footswitch Emulation)
Function TapBPM()
        MidiChannel : Integer = 1 // Your used Helix MIDI In channel 1-16
        m : MidiMessage
    if TapBPM_LockedUntil < TimeSinceStartup() Then           
        m = MakeMidiMessage3(MidiChannel - 1 + 176, 64, 64)
        Print("Tap BPM value (" + Round(BPM) + ") to Helix device") 
        TapBPM_LockedUntil = TimeSinceStartup() + 2.0 * 60000.0 / BPM // Lock the process for 3 TAP times
        SendNow(m)                        // 1st TAP
        SendLater(m, 60000.0 / BPM)       // 2nd TAP
        SendLater(m, 2.0 * 60000.0 / BPM) // 3rd TAP

// Called by timer ticking
On TimerTick(ms : double)
    If BPM <> GetBPM()	Then
		BPM = GetBPM()
		Print("BPM value changed to : " + BPM)
		TapBPM_ExecTime = ms + 2.0 * 60000.0 / BPM // We need a stable BPM value for 3 TAP times 
	// Check Execution Time 
	If TapBPM_ExecTime > 0.0 && TapBPM_ExecTime < ms Then
	    TapBPM_ExecTime = 0.0



I did something similar here, but it used the On BeatChanged callback rather than needing a timer constantly running. Although it assumes you have the GP playhead running.