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.

Var 
    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
Initialization
    SetTimersRunning(true)
End


// Send CC#64 Value 64 (Helix Tap Footswitch Emulation)
Function TapBPM()
    var 
        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
    End
End



// 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 
	End
	// Check Execution Time 
	If TapBPM_ExecTime > 0.0 && TapBPM_ExecTime < ms Then
	    TapBPM_ExecTime = 0.0
	    TapBPM() 
	End
End

2 Likes

Nice!

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.