Submit crash report?

I had a rare crash of GP just now and I am wondering if I should submit a crash report? The site points us to the community and I don’t see a formal support system option (maybe I just missed it?).

The developers are always keen on crashes, so yes, if you have a crash dump, upload it. You can do that in this the topic you created.

It can be the case that you’re not permitted to upload the file type, but if you make that known, the site administrator will take care of that.

1 Like

GP crash report 20250524.txt (112.6 KB)
Report attached for dev review.
Saved it to a text file as I am not allowed to upload in its native format.
This is from a MacBook Pro M4 Max running Sequoia 15.4.1.

In general just compress native format as a zip file and upload that.

This seems to be a crash with GPScript.

What exactly were you doing that caused the crash and can you reproduce it?

If I need to upload future crash reports I will zip them.
I was working on some scripting to fetch data from a csv file and populate label widgets with that data. I don’t think I can recreate it but what I was doing was trying out some different Rackspace script versions in a couple of rackspaces in one gig file. This is related to items I have asked about here:

Gig file if you want it:
GP MBP M4.gig (6.3 MB)
Happy to answer any questions you may have.

I was working on this outside of my studio so its not connected to any other gear if that matters.
This crash wasn’t a crisis for me so I am sharing more for posterity and helping the cause than seeking root cause. No software is perfect and sometimes a confluence of events can cause a crash. If anything in this helps improve the product in the future that’s awesome.

It would be really great if you could reproduce this

If I manage to I will certainly share details. If you see anything of note in the report or gig file please let me know. Curious if there is anything interesting in there.

@dhj I had another crash and I think I recreated a similar circumstance to the last crash.
GP was up and running from the time I restarted after the last crash to this one (several days continuous running).Crash report and gig file attached for review. Rackspace script at the time of crash included at the bottom of this post.
Hope this helps!
GigPerformer5-2025-05-30-135714.ips.zip (13.8 KB)
GP MBP M4.gig (8.5 MB)

Actions leading up to crash:

  1. Was doing various updates to the Rackspace script
  2. I had just editing and successfully compiled this code snippet
    From
if ii == 4 or ii == 5 then
    if rowItems[ii] <> "-60.0 dB" then
        SetWidgetFillColor(rowRef[ii], RGBToColor(0.024, 0.639, 0.251, 1.0))
    else
        SetWidgetFillColor(rowRef[ii], RGBToColor(0.235, 0.235, 0.235, 1.0))
    end
end

to

if ii == 4 then
    if rowItems[ii] <> "-60.0 dB" then
        SetWidgetFillColor(rowRef[ii], RGBToColor(0.024, 0.639, 0.251, 1.0)) // Bright green for Aux5
    else
        SetWidgetFillColor(rowRef[ii], RGBToColor(0.235, 0.235, 0.235, 1.0))
    end
end

if ii == 5 then
    if rowItems[ii] <> "-60.0 dB" and rowItems[ii] <> "--" then
        SetWidgetFillColor(rowRef[ii], RGBToColor(0.365, 0.435, 0.388, 1.0)) // Muted green for AuxSends
    else
        SetWidgetFillColor(rowRef[ii], RGBToColor(0.235, 0.235, 0.235, 1.0))
    end
end
  1. Compile succeeded.
  2. Initiated action with the associated button click that launches behavior
//Button to update 828es data and load into GP labels
On WidgetValueChanged(newValue : double) from btnLoad
    Print("Button triggered: 828data008.sh")
    
    if newValue == 1.0 then
        if RefreshMOTUData() then
            Print("Shell script success — now calling LoadFile()")
            LoadFile()
        else
            Print("Shell script failed or did not return success marker.")
        end
    end
End
  1. Script started processing and then GP crashed.

Rackspace Script

// Gig Performer GPScript – Load MOTU channel data with label coloring and names

var
    // Widgets for 25 rows × 6 fields (Label, Fader, Mute, Solo, Aux5, Aux6)
    lbl1_1, lbl1_2, lbl1_3, lbl1_4, lbl1_5, lbl1_6 : Widget
    lbl2_1, lbl2_2, lbl2_3, lbl2_4, lbl2_5, lbl2_6 : Widget
    lbl3_1, lbl3_2, lbl3_3, lbl3_4, lbl3_5, lbl3_6 : Widget
    lbl4_1, lbl4_2, lbl4_3, lbl4_4, lbl4_5, lbl4_6 : Widget
    lbl5_1, lbl5_2, lbl5_3, lbl5_4, lbl5_5, lbl5_6 : Widget
    lbl6_1, lbl6_2, lbl6_3, lbl6_4, lbl6_5, lbl6_6 : Widget
    lbl7_1, lbl7_2, lbl7_3, lbl7_4, lbl7_5, lbl7_6 : Widget
    lbl8_1, lbl8_2, lbl8_3, lbl8_4, lbl8_5, lbl8_6 : Widget
    lbl9_1, lbl9_2, lbl9_3, lbl9_4, lbl9_5, lbl9_6 : Widget
    lbl10_1, lbl10_2, lbl10_3, lbl10_4, lbl10_5, lbl10_6 : Widget
    lbl11_1, lbl11_2, lbl11_3, lbl11_4, lbl11_5, lbl11_6 : Widget
    lbl12_1, lbl12_2, lbl12_3, lbl12_4, lbl12_5, lbl12_6 : Widget
    lbl13_1, lbl13_2, lbl13_3, lbl13_4, lbl13_5, lbl13_6 : Widget
    lbl14_1, lbl14_2, lbl14_3, lbl14_4, lbl14_5, lbl14_6 : Widget
    lbl15_1, lbl15_2, lbl15_3, lbl15_4, lbl15_5, lbl15_6 : Widget
    lbl16_1, lbl16_2, lbl16_3, lbl16_4, lbl16_5, lbl16_6 : Widget
    lbl17_1, lbl17_2, lbl17_3, lbl17_4, lbl17_5, lbl17_6 : Widget
    lbl18_1, lbl18_2, lbl18_3, lbl18_4, lbl18_5, lbl18_6 : Widget
    lbl19_1, lbl19_2, lbl19_3, lbl19_4, lbl19_5, lbl19_6 : Widget
    lbl20_1, lbl20_2, lbl20_3, lbl20_4, lbl20_5, lbl20_6 : Widget
    lbl21_1, lbl21_2, lbl21_3, lbl21_4, lbl21_5, lbl21_6 : Widget
    lbl22_1, lbl22_2, lbl22_3, lbl22_4, lbl22_5, lbl22_6 : Widget
    lbl23_1, lbl23_2, lbl23_3, lbl23_4, lbl23_5, lbl23_6 : Widget
    lbl24_1, lbl24_2, lbl24_3, lbl24_4, lbl24_5, lbl24_6 : Widget
    lbl25_1, lbl25_2, lbl25_3, lbl25_4, lbl25_5, lbl25_6 : Widget

    rowRef : Widget Array
    btnLoad : Widget //828es load button
    motu16aLoad : Widget //16a load button
    motu24AoLoad : Widget //24ao load button  
    motu828Load : Widget //828 load button      
    motu16aChanLabel : Widget //16a channel label
    motu16aNameLabel : Widget //16a name label
    motu24aoChanLabel : Widget //24ao channel label
    motu24aoNameLabel : Widget //24ao name label
    motu828ChanLabel : Widget //828 channel label
    motu828NameLabel : Widget //828 name label
       

    arr_lbl_row1  : Widget Array = [lbl1_1, lbl1_2, lbl1_3, lbl1_4, lbl1_5, lbl1_6]
    arr_lbl_row2  : Widget Array = [lbl2_1, lbl2_2, lbl2_3, lbl2_4, lbl2_5, lbl2_6]
    arr_lbl_row3  : Widget Array = [lbl3_1, lbl3_2, lbl3_3, lbl3_4, lbl3_5, lbl3_6]
    arr_lbl_row4  : Widget Array = [lbl4_1, lbl4_2, lbl4_3, lbl4_4, lbl4_5, lbl4_6]
    arr_lbl_row5  : Widget Array = [lbl5_1, lbl5_2, lbl5_3, lbl5_4, lbl5_5, lbl5_6]
    arr_lbl_row6  : Widget Array = [lbl6_1, lbl6_2, lbl6_3, lbl6_4, lbl6_5, lbl6_6]
    arr_lbl_row7  : Widget Array = [lbl7_1, lbl7_2, lbl7_3, lbl7_4, lbl7_5, lbl7_6]
    arr_lbl_row8  : Widget Array = [lbl8_1, lbl8_2, lbl8_3, lbl8_4, lbl8_5, lbl8_6]
    arr_lbl_row9  : Widget Array = [lbl9_1, lbl9_2, lbl9_3, lbl9_4, lbl9_5, lbl9_6]
    arr_lbl_row10 : Widget Array = [lbl10_1, lbl10_2, lbl10_3, lbl10_4, lbl10_5, lbl10_6]
    arr_lbl_row11 : Widget Array = [lbl11_1, lbl11_2, lbl11_3, lbl11_4, lbl11_5, lbl11_6]
    arr_lbl_row12 : Widget Array = [lbl12_1, lbl12_2, lbl12_3, lbl12_4, lbl12_5, lbl12_6]
    arr_lbl_row13 : Widget Array = [lbl13_1, lbl13_2, lbl13_3, lbl13_4, lbl13_5, lbl13_6]
    arr_lbl_row14 : Widget Array = [lbl14_1, lbl14_2, lbl14_3, lbl14_4, lbl14_5, lbl14_6]
    arr_lbl_row15 : Widget Array = [lbl15_1, lbl15_2, lbl15_3, lbl15_4, lbl15_5, lbl15_6]
    arr_lbl_row16 : Widget Array = [lbl16_1, lbl16_2, lbl16_3, lbl16_4, lbl16_5, lbl16_6]
    arr_lbl_row17 : Widget Array = [lbl17_1, lbl17_2, lbl17_3, lbl17_4, lbl17_5, lbl17_6]
    arr_lbl_row18 : Widget Array = [lbl18_1, lbl18_2, lbl18_3, lbl18_4, lbl18_5, lbl18_6]
    arr_lbl_row19 : Widget Array = [lbl19_1, lbl19_2, lbl19_3, lbl19_4, lbl19_5, lbl19_6]
    arr_lbl_row20 : Widget Array = [lbl20_1, lbl20_2, lbl20_3, lbl20_4, lbl20_5, lbl20_6]
    arr_lbl_row21 : Widget Array = [lbl21_1, lbl21_2, lbl21_3, lbl21_4, lbl21_5, lbl21_6]
    arr_lbl_row22 : Widget Array = [lbl22_1, lbl22_2, lbl22_3, lbl22_4, lbl22_5, lbl22_6]
    arr_lbl_row23 : Widget Array = [lbl23_1, lbl23_2, lbl23_3, lbl23_4, lbl23_5, lbl23_6]
    arr_lbl_row24 : Widget Array = [lbl24_1, lbl24_2, lbl24_3, lbl24_4, lbl24_5, lbl24_6]
    arr_lbl_row25 : Widget Array = [lbl25_1, lbl25_2, lbl25_3, lbl25_4, lbl25_5, lbl25_6]
  
 // Function to refresh MOTU data using ShellEx and check for success marker
function RefreshMOTUData() returns Boolean
    var shellResult, markerCheck : String
    var result : Boolean

    //Print("Button triggered: 828data004.sh")

    // Run the shell script using bash
    shellResult = ShellEx("bash -c \"'/Users/mbpm4/Documents/Gig Performer/828data008.sh'\"")

    Print("=== ShellEx Output ===")
    Print(shellResult)
    Print("Length of output: " + IntToString(Length(shellResult)))

    // Check for success marker using workaround
    markerCheck = StringUpToFirstOccurrence(shellResult, "MOTU SCRIPT SUCCESS", false, false)
    result = Length(markerCheck) < Length(shellResult)

    if result then
        Print("✅ Script success marker detected.")
    else
        Print("❌ Script failed or success marker missing.")
    end
end
    
function LoadFile()
    var i, ii : Integer
    var row : String
    var rows, rowItems : String Array
    var labelLen : Integer
    var suffix6, suffix10 : String
    var formatSuffix : String
    var newline : String = <<<
>>>
    var textfile, dbStr, fmt : String
    var dbVal, t, shade, greenVal : double

    textfile = LoadStringFromTextFile("/Users/mbpm4/Documents/Gig Performer/828es_motu_values.txt")

    while textfile <> "" do
        row = StringUpToFirstOccurrence(textfile, newline, false, false)
        row = StringUpToFirstOccurrence(row, "//", false, false)
        if row <> "" then rows <-- row end
        textfile = StringAfterFirstOccurrence(textfile, newline, false, false)
    end

    for i = 1; i <= 25 and i < Size(rows); i = i + 1 do
        rowItems = ParseCSVString(rows[i])

        select
            i == 1  do rowRef = arr_lbl_row1
            i == 2  do rowRef = arr_lbl_row2
            i == 3  do rowRef = arr_lbl_row3
            i == 4  do rowRef = arr_lbl_row4
            i == 5  do rowRef = arr_lbl_row5
            i == 6  do rowRef = arr_lbl_row6
            i == 7  do rowRef = arr_lbl_row7
            i == 8  do rowRef = arr_lbl_row8
            i == 9  do rowRef = arr_lbl_row9
            i == 10 do rowRef = arr_lbl_row10
            i == 11 do rowRef = arr_lbl_row11
            i == 12 do rowRef = arr_lbl_row12
            i == 13 do rowRef = arr_lbl_row13
            i == 14 do rowRef = arr_lbl_row14
            i == 15 do rowRef = arr_lbl_row15
            i == 16 do rowRef = arr_lbl_row16
            i == 17 do rowRef = arr_lbl_row17
            i == 18 do rowRef = arr_lbl_row18
            i == 19 do rowRef = arr_lbl_row19
            i == 20 do rowRef = arr_lbl_row20
            i == 21 do rowRef = arr_lbl_row21
            i == 22 do rowRef = arr_lbl_row22
            i == 23 do rowRef = arr_lbl_row23
            i == 24 do rowRef = arr_lbl_row24
            i == 25 do rowRef = arr_lbl_row25
        end

    for ii = 0; ii < 6; ii = ii + 1 do
      if ii == 5 then
        // Replace semicolons with newline characters for better display
      rowItems[ii] = ReplaceString(rowItems[ii], ";", newline, true)
    end

    SetWidgetLabel(rowRef[ii], rowItems[ii])
        
           // Color the format label
if ii == 0 then
    formatSuffix = StringAfterFirstOccurrence(rowItems[ii], "(", false, false)

    if formatSuffix == "Mono)" then
        SetWidgetFillColor(rowRef[ii], RGBToColor(0.5, 0.7, 1.0, 1.0)) // Light blue
    elsif formatSuffix == "Stereo L)" or formatSuffix == "Stereo R)" then
        SetWidgetFillColor(rowRef[ii], RGBToColor(0.3, 0.5, 1.0, 1.0)) // Medium blue
    else
        SetWidgetFillColor(rowRef[ii], RGBToColor(0.235, 0.235, 0.235, 1.0)) // Fallback gray
    end
end
            if ii == 1 then
                dbStr = StringUpToFirstOccurrence(rowItems[ii], " dB", false, false)
                dbVal = StringToDouble(dbStr)

                if dbVal <= -60.0 then
                    SetWidgetFillColor(rowRef[ii], RGBToColor(0.235, 0.235, 0.235, 1.0))
                elsif dbVal > -60.0 and dbVal <= 0.0 then
                    t = (dbVal + 60.0) / 60.0
                    shade = 0.235 + (0.75 - 0.235) * t
                    SetWidgetFillColor(rowRef[ii], RGBToColor(shade, shade, shade, 1.0))
                elsif dbVal > 0.0 and dbVal <= 12.0 then
                    t = dbVal / 12.0
                    greenVal = 1.0 - t
                    SetWidgetFillColor(rowRef[ii], RGBToColor(1.0, greenVal, 0.0, 1.0))
                else
                    SetWidgetFillColor(rowRef[ii], RGBToColor(0.249,0.255,0.275, 1.0))
                end
            end

            if ii == 2 then
                if rowItems[ii] == "On" then
                    SetWidgetFillColor(rowRef[ii], RGBToColor(0.976, 0.027, 0.027, 1.0))
                else
                    SetWidgetFillColor(rowRef[ii], RGBToColor(0.235, 0.235, 0.235, 1.0))
                end
            end

            if ii == 3 then
                if rowItems[ii] == "On" then
                    SetWidgetFillColor(rowRef[ii], RGBToColor(0.749, 0.690, 0.133, 1.0))
                else
                    SetWidgetFillColor(rowRef[ii], RGBToColor(0.235, 0.235, 0.235, 1.0))
                end
            end

            if ii == 4 then
                if rowItems[ii] <> "-60.0 dB" then
                    SetWidgetFillColor(rowRef[ii], RGBToColor(0.024, 0.639, 0.251, 1.0)) // Bright green for Aux5
                else
                    SetWidgetFillColor(rowRef[ii], RGBToColor(0.235, 0.235, 0.235, 1.0))
                end
            end

if ii == 5 then
    if rowItems[ii] <> "-60.0 dB" and rowItems[ii] <> "--" then
        SetWidgetFillColor(rowRef[ii], RGBToColor(0.365, 0.435, 0.388, 1.0)) // Muted green for AuxSends
    else
        SetWidgetFillColor(rowRef[ii], RGBToColor(0.235, 0.235, 0.235, 1.0))
    end
end

        end
    end
End

//Button to update 828es data and load into GP labels
On WidgetValueChanged(newValue : double) from btnLoad
    Print("Button triggered: 828data008.sh")
    
    if newValue == 1.0 then
        if RefreshMOTUData() then
            Print("Shell script success — now calling LoadFile()")
            LoadFile()
        else
            Print("Shell script failed or did not return success marker.")
        end
    end
End

//=======================================================================
//+++++++ Right Panel buttons for MOTU channels and Mix In names ++++++++
//=======================================================================

//AUTOMATE 16a Channel and Name collecction script
function RefreshMOTU16aData() returns Boolean
    var shellResult16a, markerCheck16a : String
    var result : Boolean

    Print("Button triggered: 16adata001.sh")

    // Run the shell script using bash
    shellResult16a = ShellEx("bash -c \"'/Users/mbpm4/Documents/Gig Performer/16adata001.sh'\"")

    Print("=== ShellEx Output ===")
    Print(shellResult16a)
    Print("Length of output: " + IntToString(Length(shellResult16a)))

    // Check for success marker using workaround
    markerCheck16a = StringUpToFirstOccurrence(shellResult16a, "MOTU SCRIPT SUCCESS", false, false)
    result = Length(markerCheck16a) < Length(shellResult16a)

    if result then
        Print("✅ Script success marker detected.")
    else
        Print("❌ Script failed or success marker missing.")
    end
end

//Update 16a data
function LoadFile16a()
    var textfile, line, chan, name : String
    var newline : String = <<<
>>>
    var chanLines, nameLines : String = ""
    var lineNum : Integer = 0

    textfile = LoadStringFromTextFile("/Users/mbpm4/Documents/Gig Performer/motu16a_values.txt")

    // Skip header row
    textfile = StringAfterFirstOccurrence(textfile, newline, false, false)

    while textfile <> "" do
        line = StringUpToFirstOccurrence(textfile, newline, false, false)
        textfile = StringAfterFirstOccurrence(textfile, newline, false, false)

        // Find comma and split manually
        if line <> "" then
            lineNum = lineNum + 1
            chan = StringUpToFirstOccurrence(line, ",", false, false)
            name = StringAfterFirstOccurrence(line, ",", false, false)

            // Only add if there's a name
            if name <> "" then
                // Pad channel string for alignment (max 2-digit channels)
                if Length(chan) == 1 then
                    chan = " " + chan
                end
                chanLines = chanLines + chan + " " + newline
                nameLines = nameLines + name + newline
            end
        end
    end

    SetWidgetLabel(motu16aChanLabel, chanLines)
    SetWidgetLabel(motu16aNameLabel, nameLines)
end



//AUTOMATE 24ao Channel and Name collecction script
function RefreshMOTU24aoData() returns Boolean
    var shellResult24ao, markerCheck24ao : String
    var result : Boolean

    Print("Button triggered: 24aodata001.sh")

    // Run the shell script using bash
    shellResult24ao = ShellEx("bash -c \"'/Users/mbpm4/Documents/Gig Performer/24Aodata001.sh'\"")

    Print("=== ShellEx Output ===")
    Print(shellResult24ao)
    Print("Length of output: " + IntToString(Length(shellResult24ao)))

    // Check for success marker using workaround
    markerCheck24ao = StringUpToFirstOccurrence(shellResult24ao, "MOTU SCRIPT SUCCESS", false, false)
    result = Length(markerCheck24ao) < Length(shellResult24ao)

    if result then
        Print("✅ Script success marker detected.")
    else
        Print("❌ Script failed or success marker missing.")
    end
end

//Update 24Ao data
function LoadFile24ao()
    var textfile, line, chan, name : String
    var newline : String = <<<
>>>
    var chanLines, nameLines : String = ""
    var lineNum : Integer = 0

    textfile = LoadStringFromTextFile("/Users/mbpm4/Documents/Gig Performer/motu24Ao_values.txt")

    // Skip header row
    textfile = StringAfterFirstOccurrence(textfile, newline, false, false)

    while textfile <> "" do
        line = StringUpToFirstOccurrence(textfile, newline, false, false)
        textfile = StringAfterFirstOccurrence(textfile, newline, false, false)

        // Find comma and split manually
        if line <> "" then
            lineNum = lineNum + 1
            chan = StringUpToFirstOccurrence(line, ",", false, false)
            name = StringAfterFirstOccurrence(line, ",", false, false)

            // Only add if there's a name
            if name <> "" then
                // Pad channel string for alignment (max 2-digit channels)
                if Length(chan) == 1 then
                    chan = " " + chan
                end
                chanLines = chanLines + chan + " " + newline
                nameLines = nameLines + name + newline
            end
        end
    end

    SetWidgetLabel(motu24aoChanLabel, chanLines)
    SetWidgetLabel(motu24aoNameLabel, nameLines)
end

//AUTOMATE 828 Channel and Name collecction script
function RefreshMOTU828Data() returns Boolean
    var shellResult828, markerCheck828 : String
    var result : Boolean

    Print("Button triggered: 828data001.sh")

    // Run the shell script using bash
    shellResult828 = ShellEx("bash -c '/Users/mbpm4/Documents/Gig\\ Performer/828data001.sh'")
    //OLD shellResult828 = ShellEx("bash -c \"'/Users/mbpm4/Documents/Gig Performer/828adata001.sh'\"")
    Print("Running shell command: bash -c '/Users/mbpm4/Documents/Gig\\ Performer/828data001.sh'")

    Print("=== ShellEx Output ===")
    Print(shellResult828)
    Print("Length of output: " + IntToString(Length(shellResult828)))

    // Check for success marker using workaround
    markerCheck828 = StringUpToFirstOccurrence(shellResult828, "MOTU SCRIPT SUCCESS", false, false)
    result = Length(markerCheck828) < Length(shellResult828)

    if result then
        Print("✅ Script success marker detected.")
    else
        Print("❌ Script failed or success marker missing.")
    end
end

//Update 828 data
function LoadFile828()
    var textfile, line, chan, name : String
    var newline : String = <<<
>>>
    var chanLines, nameLines : String = ""
    var lineNum : Integer = 0

    textfile = LoadStringFromTextFile("/Users/mbpm4/Documents/Gig Performer/motu828_values.txt")

    // Skip header row
    textfile = StringAfterFirstOccurrence(textfile, newline, false, false)

    while textfile <> "" do
        line = StringUpToFirstOccurrence(textfile, newline, false, false)
        textfile = StringAfterFirstOccurrence(textfile, newline, false, false)

        // Find comma and split manually
        if line <> "" then
            lineNum = lineNum + 1
            chan = StringUpToFirstOccurrence(line, ",", false, false)
            name = StringAfterFirstOccurrence(line, ",", false, false)

            // Only add if there's a name
            if name <> "" then
                // Pad channel string for alignment (max 2-digit channels)
                if Length(chan) == 1 then
                    chan = " " + chan
                end
                chanLines = chanLines + chan + " " + newline
                nameLines = nameLines + name + newline
            end
        end
    end

    SetWidgetLabel(motu828ChanLabel, chanLines)
    SetWidgetLabel(motu828NameLabel, nameLines)
end
    
//Load 16a button
On WidgetValueChanged(newValue : double) from motu16aLoad
    //Print("Button triggered: 16A")
   if newValue == 1.0 then
        if RefreshMOTU16aData() then
            Print("Shell script success — now calling LoadFile()")
            LoadFile16a()
        else
            Print("Shell script failed or did not return success marker.")
        end
    end
End    


//Load 24Ao button
On WidgetValueChanged(newValue : double) from motu24AoLoad
    //Print("Button triggered: 24Ao")
   if newValue == 1.0 then
        if RefreshMOTU24aoData() then
            Print("Shell script success — now calling LoadFile()")
            LoadFile24ao()
        else
            Print("Shell script failed or did not return success marker.")
        end
    end
End    

//Load 828 button
On WidgetValueChanged(newValue : double) from motu828Load
    //Print("Button triggered: 828")
   if newValue == 1.0 then
        if RefreshMOTU828Data() then
            Print("Shell script success — now calling LoadFile()")
            LoadFile828()
        else
            Print("Shell script failed or did not return success marker.")
        end
    end
End