Skip to content

owmidiconverter

Bankn8II©$A edited this page Sep 22, 2025 · 1 revision

Welcome to the owmidiconverter wiki!

https://barionleg.github.io/owmidiconverter/converter.html

image

Script info: 0 note(s) left out due to too many overlapping pitches

95 note(s) transposed 6 voice(s)

MIDI file successfully read from 0 second(s) to 311.2 second(s), 100% of the song converted to workshop arrays. Language: en-US

Copy these settings and paste them to the Custom Game Settings screen. (PC only)

settings { main { Description: "Overwatch MIDI Pianist mode by ScroogeD. Convert MIDI songs to Overwatch piano songs with this converter on GitHub: github.com/ScroogeD2/owmidiconverter" }

lobby
{
    Allow Players Who Are In Queue: Yes
    Match Voice Chat: Enabled
    Max Team 1 Players: 6
    Max Team 2 Players: 0
    Return To Lobby: Never
}

modes
{
    Skirmish
    {
        enabled maps
        {
            Paris
        }
    }

    General
    {
        Game Mode Start: Manual
        Hero Limit: Off
        Respawn Time Scalar: 30%
    }
}

heroes
{
    General
    {
        Ability Cooldown Time: 0%
        No Ammunition Requirement: On
        Ultimate Generation: 250%
    }
}

}

variables { global: 0: notePositions 1: botSpawn 2: bots 3: speedPercent 4: songPlayingState 5: timeArrayIndex 6: playerSpawn 7: i 8: pitchArrayIndex 9: botScalar 10: maxArraySize 11: banTpLocation 12: currentBotIndex 13: waitTime 14: timeArrays 15: pitchArrays 16: chordArrays 17: maxBots 18: defaultHorizontalFacingAngle 28: hasDecompressionFinished 29: decompressionPercentages 30: isCompressionEnabled 31: numberArray 32: decompressedValue 33: compressedArrayLength 34: decompressedArray 35: compressedElementLength 36: songDataElementLength 37: compressedArray 38: compressionInfo 39: finalCompressedElementLength 40: I 41: J 42: L

player:
    1: playNote
    2: currentPitchIndex
    3: playerToRemove
    4: currentKeyPos

}

subroutines { 0: endSong 1: decompressArray }

rule("By ScroogeD#5147 (Discord)") { event { Ongoing - Global; } }

rule("Global init") { event { Ongoing - Global; }

actions
{
    Disable Inspector Recording;
    Disable Built-In Game Mode Music;
    "Global.botScalar = 0.100;"
    Global.bots = Empty Array;
    Global.speedPercent = 100;
    Global.hasDecompressionFinished = False;
    Create HUD Text(All Players(All Teams), Null, Null, Custom String("Speed: {0}%", Global.speedPercent), Right, 0, Color(White), Color(White),
        Color(White), Visible To and String, Default Visibility);
    Create HUD Text(All Players(All Teams), Null, Null, Custom String(
        "Host player: Press Interact to start and stop the song, \nand Crouch+Primary or Crouch+Secondary Fire to change speed"), Top,
        0, Color(White), Color(White), Color(White), Visible To and String, Default Visibility);
    Create HUD Text(All Players(All Teams), Null, Custom String("By ScroogeD"), Null, Left, 0, Color(White), Color(Yellow), Color(White),
        Visible To and String, Default Visibility);
    Create HUD Text(All Players(All Teams), Null, Custom String("Website: github.com/ScroogeD2/owmidiconverter"), Null, Left, 1, Color(White),
        Color(Yellow), Color(White), Visible To and String, Default Visibility);
    Create HUD Text(Filtered Array(All Players(All Teams), Has Status(Current Array Element, Frozen)), Custom String(
        "The host player has decided to remove you temporarily. Please wait a minute before rejoining."), Null, Null, Top, 1, Color(White),
        Color(White), Color(White), Visible To and String, Default Visibility);
    Create HUD Text(Global.hasDecompressionFinished ? Empty Array : Host Player, Null, Null, Custom String(
        " \n\n\nDecompressing\nPitch Arrays      {0}%\nTime Arrays        {1}%\nChord Arrays   {2}%", 
        Global.decompressionPercentages[0], Global.decompressionPercentages[1], Global.decompressionPercentages[2]), 
        Top, 10, Color(White), Color(White), Color(White), Visible To and String, Default Visibility);
    Global.decompressionPercentages = Array(0, 0, 0);
}

}

rule("Player init") { event { Ongoing - Each Player; All; All; }

conditions
{
    Is Dummy Bot(Event Player) != True;
    Has Spawned(Event Player) == True;
    Is Alive(Event Player) == True;
}

actions
{
    
    Teleport(Event Player, Global.playerSpawn);
    Disable Movement Collision With Players(Event Player);
    Wait(0.016, Ignore Condition);
    Set Facing(Event Player, Direction From Angles(Global.defaultHorizontalFacingAngle, Vertical Facing Angle Of(Event Player)), To World);
    Preload Hero(Event Player, Hero(Symmetra));
}

}

rule("Dummy init") { event { Ongoing - Each Player; All; All; }

conditions
{
    Is Dummy Bot(Event Player) == True;
}

actions
{
    Teleport(Event Player, Global.botSpawn);
    Disable Movement Collision With Environment(Event Player, False);
    Disable Movement Collision With Players(Event Player);
    Start Scaling Player(Event Player, Global.botScalar, True);
    
    Wait(0.016, Ignore Condition);
    Set Facing(Event Player, Direction From Angles(Global.defaultHorizontalFacingAngle, 89), To World);
}

}

rule("Primary fire: increase speed") { event { Ongoing - Global; }

conditions
{
    Is Button Held(Host Player, Button(Crouch)) == True;
    Is Button Held(Host Player, Button(Primary Fire)) == True;
}

actions
{
    Global.speedPercent += 5;
}

}

rule("Secondary fire: decrease speed") { event { Ongoing - Global; }

conditions
{
    Is Button Held(Host Player, Button(Crouch)) == True;
    Is Button Held(Host Player, Button(Secondary Fire)) == True;
    Global.speedPercent > 5;
}

actions
{
    Global.speedPercent -= 5;
}

}

rule("Interact: create dummy bots, start playing") { event { Ongoing - Global; }

conditions
{
    Is Button Held(Host Player, Button(Interact)) == True;
    Global.songPlayingState == 0;
    (!Global.isCompressionEnabled || Global.hasDecompressionFinished) == True;
}

actions
{
    "States:\n0: song not playing\n1: Preparing to play, creating bots\n2: song playing" 
    Global.songPlayingState = 1;
    Global.i = 11;
    While(Count Of(Global.bots) < Global.maxBots && Global.i > 0);
        If(!Entity Exists(Players In Slot(Global.i, All Teams)));
            Create Dummy Bot(Hero(Symmetra), Team 1, Global.i, Global.botSpawn, Vector(0, 0, 0));
            Modify Global Variable(bots, Append To Array, Last Created Entity);
        End;
        Global.i -= 1;
        Wait(0.016, Ignore Condition);
    End;
    Wait(1, Ignore Condition);
    Global.songPlayingState = 2;
}

}

rule("Interact: stop playing") { event { Ongoing - Global; }

conditions
{
    Is Button Held(Host Player, Button(Interact)) == True;
    Global.songPlayingState == 2;
}

actions
{
    Call Subroutine(endSong);
}

}

rule("Play loop") { event { Ongoing - Global; }

conditions
{
    Global.songPlayingState == 2;
}

actions
{
    "Because the maximum size of overwatch arrays is 1000 per dimension, the song data arrays are split to several indexes of a 2d array. To get the correct index of the required value in these arrays, modulo and division are used instead of a second index:"
    disabled Continue;
    "value = songArray[math.floor(index / maxArraySize)][index % maxArraySize]"
    disabled Continue;
    "While((index < 2dArrayLength) && songPlayingState)"
    While(Global.timeArrayIndex < Global.maxArraySize * (Count Of(Global.timeArrays) - 1) + Count Of(Last Of(Global.timeArrays))
        && Global.songPlayingState);
        "Get the time interval (milliseconds) between chords from timeArrays, multiply by 1000 to get seconds, modify based on speed"
        Global.waitTime += (Global.timeArrays[Round To Integer(Global.timeArrayIndex / Global.maxArraySize, Down)
            ][Global.timeArrayIndex % Global.maxArraySize]) / (1000) * (100 / Global.speedPercent);
        While(Global.waitTime >= 0.016);
            Wait(0.016, Ignore Condition);
            Global.waitTime -= 0.016;
        End;
        "Loop as many times as there are pitches in the current chord, as indicated by the value in chordArrays. Assign the pitches to the bots."
        For Global Variable(i, 0, Global.chordArrays[Round To Integer(Global.timeArrayIndex / Global.maxArraySize, Down)
            ][Global.timeArrayIndex % Global.maxArraySize], 1);
            Global.bots[Global.currentBotIndex].currentPitchIndex = Global.pitchArrayIndex;
            Global.bots[Global.currentBotIndex].playNote = True;
            Global.currentBotIndex = (Global.currentBotIndex + 1) % Count Of(Global.bots);
            Global.pitchArrayIndex += 1;
        End;
        Global.timeArrayIndex += 1;
    End;
    Wait(0.250, Ignore Condition);
    Call Subroutine(endSong);
}

}

rule("Stop playing") { event { Subroutine; endSong; }

actions
{
    For Global Variable(i, 0, 12, 1);
        Destroy Dummy Bot(Team 1, Global.i);
    End;
    Global.bots = Empty Array;
    Wait(0.300, Ignore Condition);
    Global.songPlayingState = 0;
    Global.timeArrayIndex = 0;
    Global.pitchArrayIndex = 0;
    Global.waitTime = 0;
}

}

rule("Play note") { event { Ongoing - Each Player; All; All; }

conditions
{
    Is Dummy Bot(Event Player) == True;
    Event Player.playNote == True;
}

actions
{
    Event Player.currentKeyPos = Global.notePositions[Global.pitchArrays[Round To Integer(
        Event Player.currentPitchIndex / Global.maxArraySize, Down)][Event Player.currentPitchIndex % Global.maxArraySize]];
    Teleport(Event Player, Event Player.currentKeyPos);
    Wait(0.032, Ignore Condition);
    Start Holding Button(Event Player, Button(Primary Fire));
    Wait(0.064, Ignore Condition);
    Stop Holding Button(Event Player, Button(Primary Fire));
    Event Player.playNote = False;
}

}

rule("Race condition workaround for very high playing speeds") { event { Ongoing - Each Player; All; All; }

conditions
{
    Event Player.playNote == True;
}

actions
{
    Wait(0.200, Abort When False);
    Event Player.playNote = False;
    Loop;
}

}

rule("Decompress all arrays") { event { Ongoing - Global; }

actions
{
    Wait(0.250, Ignore Condition);
    Abort If(!Global.isCompressionEnabled);
    "Decompress pitch arrays, time arrays and chord arrays"
    For Global Variable(i, 0, 3, 1);
        Global.compressedArray = Empty Array;
        For Global Variable(I, 0, Count Of(Array(Global.pitchArrays, Global.timeArrays, Global.chordArrays)[Global.i]), 1);
            Global.compressedArray[Global.I] = Array(Global.pitchArrays, Global.timeArrays, Global.chordArrays)[Global.i][Global.I];
        End;
        Global.finalCompressedElementLength = Global.compressionInfo[0][Global.i];
        Global.songDataElementLength = Global.compressionInfo[1][Global.i];
        Call Subroutine(decompressArray);
        For Global Variable(I, 0, Count Of(Global.decompressedArray), 1);
            If(Global.i == 0);
                Global.pitchArrays[Global.I] = Global.decompressedArray[Global.I];
            Else If(Global.i == 1);
                Global.timeArrays[Global.I] = Global.decompressedArray[Global.I];
            Else If(Global.i == 2);
                Global.chordArrays[Global.I] = Global.decompressedArray[Global.I];
            End;
        End;
        Global.compressedArray = Empty Array;
        Global.decompressionPercentages[Global.i] = 100;
    End;
    Global.decompressedArray = Empty Array;
    Global.hasDecompressionFinished = True;
}

}

rule("Decompress array") { event { Subroutine; decompressArray; }

actions
{
    "Target array for the decompressed data"
    Global.decompressedArray = Empty Array;
    Global.decompressedArray[0] = Empty Array;
    "Current decompressedArray index being written to (max of 1000 elements per index)"
    Global.L = 0;
    "Array for saving individual digits of the element being decompressed"
    Global.numberArray = Empty Array;
    Global.compressedArrayLength = Global.maxArraySize * (Count Of(Global.compressedArray) - 1) + Count Of(Last Of(
        Global.compressedArray));
    For Global Variable(I, 0, Global.compressedArrayLength, 1);
        "Read the compressed element from left to right, append individual digits to numberArray. If this is the last array value, use a different variable to check its length."
        For Global Variable(J, 0,
            Global.I == Global.compressedArrayLength - 1 ? Global.finalCompressedElementLength : Global.compressedElementLength, 1);
            Modify Global Variable(numberArray, Append To Array, Round To Integer(Global.compressedArray[Round To Integer(
                Global.I / Global.maxArraySize, Down)][Global.I % Global.maxArraySize] / 10 ^ ((
                Global.I == Global.compressedArrayLength - 1 ? Global.finalCompressedElementLength : Global.compressedElementLength)
                - 1 - Global.J), Down) % 10);
        End;
        While(Count Of(Global.numberArray) >= Global.songDataElementLength);
            Global.decompressedValue = 0;
            "Construct the original numbers by reading numberArray x elements at a time"
            For Global Variable(J, 0, Global.songDataElementLength, 1);
                Global.decompressedValue += First Of(Global.numberArray) * 10 ^ (Global.songDataElementLength - 1 - Global.J);
                Modify Global Variable(numberArray, Remove From Array By Index, 0);
            End;
            Modify Global Variable At Index(decompressedArray, Global.L, Append To Array, Global.decompressedValue);
            If(Count Of(Global.decompressedArray[Global.L]) >= Global.maxArraySize);
                Global.L += 1;
                Global.decompressedArray[Global.L] = Empty Array;
            End;
        End;
        "Wait a frame every 25th element to avoid high server load"
        If(Global.I % 25 == 0);
            Wait(0.016, Ignore Condition);
            "Update decomrpession progress HUD"
            Global.decompressionPercentages[Global.i] = 100 * Global.I / Global.compressedArrayLength;
        End;
    End;
}

}

rule("Note positions array init, Point B") { event { Ongoing - Global; }

actions
{
    Global.notePositions = Array(
        Vector(-85.410, 13.884, -108.012), Vector(-85.364, 13.896, -108.079), 
        Vector(-85.368, 13.886, -108.007), Vector(-85.328, 13.897, -108.078), 
        Vector(-85.325, 13.888, -108.008), Vector(-85.290, 13.887, -107.989), 
        Vector(-85.247, 13.897, -108.050), Vector(-85.256, 13.885, -107.965), 
        Vector(-85.217, 13.895, -108.021), Vector(-85.210, 13.888, -107.968), 
        Vector(-85.180, 13.895, -108.007), Vector(-85.184, 13.883, -107.928), 
        Vector(-85.147, 13.883, -107.916), Vector(-85.095, 13.895, -107.977), 
        Vector(-85.107, 13.883, -107.910), Vector(-85.063, 13.896, -107.973), 
        Vector(-85.066, 13.884, -107.902), Vector(-85.017, 13.886, -107.891), 
        Vector(-84.979, 13.896, -107.954), Vector(-84.987, 13.884, -107.866), 
        Vector(-84.943, 13.896, -107.938), Vector(-84.952, 13.884, -107.854), 
        Vector(-84.908, 13.896, -107.922), Vector(-84.902, 13.886, -107.851), 
        Vector(-84.871, 13.885, -107.836), Vector(-84.826, 13.895, -107.887), 
        Vector(-84.832, 13.885, -107.822), Vector(-84.787, 13.897, -107.894), 
        Vector(-84.795, 13.886, -107.812), Vector(-84.751, 13.888, -107.815), 
        Vector(-84.711, 13.895, -107.857), Vector(-84.720, 13.883, -107.769), 
        Vector(-84.681, 13.895, -107.835), Vector(-84.683, 13.882, -107.759), 
        Vector(-84.643, 13.895, -107.822), Vector(-84.637, 13.887, -107.770), 
        Vector(-84.604, 13.885, -107.745), Vector(-84.563, 13.894, -107.793), 
        Vector(-84.561, 13.888, -107.750), Vector(-84.523, 13.896, -107.791), 
        Vector(-84.524, 13.887, -107.729), Vector(-84.485, 13.884, -107.697), 
        Vector(-84.444, 13.895, -107.759), Vector(-84.445, 13.888, -107.711), 
        Vector(-84.415, 13.894, -107.750), Vector(-84.403, 13.888, -107.694), 
        Vector(-84.373, 13.896, -107.742), Vector(-84.375, 13.885, -107.661), 
        Vector(-84.339, 13.885, -107.649), Vector(-84.292, 13.896, -107.713), 
        Vector(-84.298, 13.886, -107.644), Vector(-84.256, 13.897, -107.715), 
        Vector(-84.262, 13.883, -107.613), Vector(-84.227, 13.883, -107.603), 
        Vector(-84.172, 13.897, -107.684), Vector(-84.183, 13.886, -107.606), 
        Vector(-84.146, 13.895, -107.657), Vector(-84.144, 13.886, -107.592), 
        Vector(-84.103, 13.896, -107.652), Vector(-84.104, 13.885, -107.571), 
        Vector(-84.068, 13.885, -107.560), Vector(-84.021, 13.896, -107.626), 
        Vector(-84.023, 13.886, -107.553), Vector(-83.985, 13.895, -107.598), 
        Vector(-83.987, 13.886, -107.539));
    Set Global Variable(botSpawn, Vector(-84.693, 13.873, -107.681));
    Set Global Variable(playerSpawn, Vector(-85.624, 14.349, -104.397));
    Set Global Variable(banTpLocation, Vector(-83.340, 13.248, -58.608));
    Set Global Variable(defaultHorizontalFacingAngle, 161.2);
}

}

rule("General song data"){event{Ongoing-Global;}actions{ Global.maxBots = 6; Global.maxArraySize = 1000; Global.isCompressionEnabled = true; Global.compressedElementLength = 7; Global.compressionInfo = Array(Array(6,5,6),Array(2,4,2));}} rule("pitchArrays"){event{Ongoing-Global;}actions{Global.pitchArrays[0] = Array(2635384, 3333842, 3135383, 0332831, 3033313, 5333538, 1426303, 3313530, 3335381, 4191814, 0911141, 4303338, 4245142, 1141414, 1228313, 6404312, 1214161, 6161931, 3538431, 9193131, 3538433, 1193338, 4219192, 1333740, 2121191, 8303338, 1818303, 0303345, 3030193, 5384319, 1419190, 9113540, 4247501, 1113842, 4547491, 1212311, 3842451, 1113842, 4711232, 1181426, 3842452, 6211414, 2624404, 3482412, 1416161, 6193843, 4719191, 9193843, 4719193, 8424519, 1921374, 0212119, 1838424, 5501826, 3030313, 8434750, 3131261, 9191838, 4245501, 8302618, 3845505, 4181416, 4047525, 5161614, 1340495, 2571314, 4750555, 9144550, 5457261, 8424550, 5462301, 9384347, 5059191, 9313638, 1931353, 8193119, 1645505, 4572816, 4750555, 9161943, 4750556, 2312145, 4952576, 4212142, 3321402, 1213721, 1138475, 0555923, 4550545, 7211842, 4550546, 2301938, 4347505, 9191931, 3538313, 6381931, 3538191, 9191845, 5054573, 0194750, 5559312, 1505457, 6221454, 9525764, 2133213, 3212325, 1447505, 5591445, 5054572, 6184245, 5054623, 0193843, 4750591, 9193136, 3819313, 5381931, 1916455, 0545728, 4750555, 9161943, 4750556, 2312145, 4952576, 4212142, 3321402, 1213721, 1138475, 0555911, 2345505, 4572118, 4245505, 4623019, 3843475, 0591919, 3135383, 1363819, 3135381, 9313319, 3118455, 0545730, 1947505, 5593121, 4550576, 2214549, 5761213, 3212121, 3342233, 5432537, 4045143, 0333842, 4514211, 4141412, 2831364, 0431212, 1416161, 6193135, 3843191, 9313135, 3843311, 9333842, 1919213, 3374021, 2119183, 0333818, 1830303, 0334530, 3019353, 8431914, 1919091, 1354042, 4750111, 1353842, 4749112, 1231138, 4245111, 1384247, 1123211, 8263842, 4526211, 4142624, 4043482, 4121416, 1616193, 8434719, 1919193, 8434719, 1938424, 5191921, 3740212, 1191838, 4245501, 8263030, 3138434, 7503131, 2619191, 8384245, 5018302, 6183845, 5054181, 4164047, 5255161, 6141340, 4952571, 3144750, 5559144, 5505457, 2618424, 5505462, 3019384, 3475059, 1919313, 6381931, 3538193, 1191645, 5054572, 8164750, 5559161, 9434750, 5562312, 1454952, 5764212, 1423321, 4021213, 7211138, 4750555, 9234550, 5457211, 8424550, 5462301, 9384347, 5059191, 9313538, 3136381, 9313538, 1919191, 8455054, 5730194, 7505559, 3121505, 4576221, 4549525, 7642133, 2133212, 3251447, 5055592, 6455054, 5726184, 2455054, 6230193, 8434750, 5919193, 1363819, 3135381, 9311916, 4550545, 7284750, 5559161, 9434750, 5562312, 1454952, 5764212, 1423321, 4021213, 7211138, 4750555, 9112345, 5054572, 1184245, 5054623, 0193843, 4750591, 9193135, 3831363, 8193135, 3819313, 3193118, 4550545, 7301947, 5055593, 1214550, 5762214, 5495761, 2121193, 3212133, 4223354, 3253745, 3745384, 7184245, 5018214, 0454925, 3718194, 0434819, 2338434, 7263819, 2331353, 8233523, 2323352, 3213338, 4221332, 1213337, 4045213, 5473749, 1842455, 0182140, 4549182, 1253718, 1940434, 8192338, 4347263, 8192331, 3538233, 5232323, 3523213, 3384221, 4521213, 3374042, 2138402, 1183033, 3818302, 6183018, 3018303, 0142618, 3019313, 5381931, 2619311, 9313131, 2631313, 1263131, 3131263, 1313126, 3131313, 1263126, 3842452, 6211414, 2624404, 3482412, 1416161, 6193843, 4719193, 1313843, 4719193, 8424519, 1921374, 0212119, 1838424, 5505718, 1818621, 8571818, 1938434, 7505919, 1419190, 9113842, 4762115, 4113740, 4547521, 1212311, 5711115, 9112321, 1826384, 2455726, 2114142, 6244043, 4860241, 2141616, 1619384, 3475919, 1919193, 8434759, 1919384, 2455719, 1921374, 0212119, 1838424, 5501826, 3030313, 8434750, 3131261, 9191838, 4245501, 8302618, 3845505, 4181416, 3543475, 2551616, 1413334, 2495257, 3543374, 5133745, 3847184, 2455018, 2140454, 9253718, 1940434, 8192338, 4347263, 8192331, 3538233, 5232323, 3523213, 3384221, 3321213, 3374045, 2135473, 7491842, 4550182, 1404549, 1821253, 7181940, 4348192, 3384347, 2638192, 3313538, 2335232, 3233523, 2133384, 2214521, 2133374, 0422138, 4021183, 0333818, 3026183, 0183018, 3030142, 6183019, 3135381, 9312619, 3119313, 1312631, 3131263, 1313131, 2631313, 1263131, 3131263, 1313126, 3131313, 1263131, 3126313, 1313126, 3114475, 0555914, 4550545, 7261842, 4550546, 2301938, 4347505, 9191931, 3638193, 1353819, 3119164, 5505457, 2816475, 0555916, 1943475, 0556231, 2145495, 2576421, 2142332, 1402121, 3721113, 8475055, 5923455, 0545721, 1842455, 0546230, 1938434, 7505919, 1931353, 8313638, 1931353, 8191919, 1845505, 4573019, 4750555, 9312150, 5457622, 1454952, 5764213, 3213321, 2325144, 7505559, 1445505, 4572618, 4245505, 4623019, 3843475, 0591919, 3136381, 9313538, 1931191, 6455054, 5728475, 0555916, 1943475, 0556231, 2145495, 2576421, 2142332, 1402121, 3721113, 8475055, 5911234, 5505457, 2118424, 5505462, 3019384, 3475059, 1919313, 5383136, 3819313, 5381931, 3319311, 8455054, 5730194, 7505559, 3121455, 0576221, 4549576, 1213321, 2121334, 2233543, 2537404, 5142655, 5954573, 8503850, 3850385, 0334533, 4533453, 5473850, 3850385, 0385038, 5033453, 3453345, 3547385, 0144750, 5559264, 5505457, 2618424, 5505462, 3019384, 3475059, 1919313, 6381931, 3538193, 1191645, 5054572, 8164750, 5559161, 9434750, 5562312, 1454952, 5764212, 1423321, 4021213, 7211138, 4750555, 9234550, 5457211, 8424550, 5462301, 9384347, 5059191, 9313538, 3136381, 9313538, 1919191, 8455054, 5730194, 7505559, 3121505, 4576221, 4549525, 7642133, 2133212, 3251447, 5055591, 4455054, 5726184, 2455054, 6230193, 8434750, 5919193, 1363819, 3135381, 9311916, 4550545, 7284750, 5559161, 9434750, 5562312, 1454952, 5764212, 1423321, 4021213, 7211138, 4750555, 9112345, 5054572, 1184245, 5054623, 0193843, 4750591, 9193135, 3831363, 8193135, 3819313, 3193118, 4550545, 7301947, 5055593, 1214550, 5762214, 5495761, 2133212, 1213342, 2335432, 5374045, 1447505, 5591445, 5054572, 6184245, 5054623, 0193843, 4750591, 9193136, 3819313, 5381931, 1916455, 0545728, 1647505, 5591619, 4347505, 5623121, 4549525, 7642121, 4233214, 0212137, 2111384, 7505559, 2345505, 4572118, 4245505, 4623019, 3843475, 0591919, 3135383, 1363819, 3135381, 9191918, 4550545, 7301947, 5055593, 1215054, 5762214, 5495257, 6421332, 1332123, 2514475, 0555914, 4550545, 7261842, 4550546, 2301938, 4347505, 9191931, 3638193, 1353819, 3119164, 5505457, 2847505, 5591619, 4347505, 5623121, 4549525, 7642121, 4233214, 0212137, 2111384, 7505559, 1123455, 0545721, 1842455, 0546230, 1938434, 7505919, 1931353, 8313638, 1931353, 8193133, 1931184, 5505457, 3019475, 0555931, 2145505, 7622145, 4957612, 1332121, 212325);}} rule("timeArrays"){event{Ongoing-Global;}actions{Global.timeArrays[0] = Array(0000046, 9046904, 6803130, 6250312, 0625015, 7015601, 5604690, 2340703, 0157015, 6015609, 3801560, 1560156, 0157015, 6015603, 1304680, 1570312, 0469015, 6031303, 1201560, 1570312, 0469015, 6031304, 6801570, 3120156, 0313015, 6031304, 6801570, 3120313, 0156015, 6031304, 6801570, 3120156, 0157015, 6015603, 1304680, 1570312, 0469015, 6031306, 2503120, 3130156, 0156031, 3062503, 1201560, 1570156, 0156031, 3046801, 5703120, 4690156, 0313031, 2015601, 5703120, 4690156, 0313046, 8015703, 1201560, 3130156, 0313046, 8015703, 1203130, 1560156, 0313046, 8015703, 1206250, 3130312, 0156015, 7031206, 2503130, 3120156, 0157031, 2046901, 5603130, 3120156, 0157046, 8046903, 1301560, 3120157, 0312015, 6046903, 1304680, 1570312, 0156031, 3015603, 1301560, 3120157, 0312015, 6046903, 1301560, 3120157, 0312015, 6031301, 5604690, 3120157, 0312015, 6046903, 1301560, 3120157, 0312015, 6031301, 5603130, 1560312, 0157046, 8031304, 6901560, 3120157, 0156015, 6062503, 1301560, 3120157, 0312015, 6046903, 1304680, 1570312, 0156031, 3015603, 1301560, 3120157, 0312015, 6046903, 1301560, 3120157, 0312015, 6031301, 5603130, 1560312, 0157031, 2015604, 6903130, 1560312, 0157031, 2015603, 1301560, 3130156, 0312015, 7046803, 1304690, 1560312, 0157015, 6015606, 2503130, 4680157, 0312046, 9015603, 1303120, 1560157, 0312046, 9015603, 1304680, 1570312, 0156031, 3015603, 1304680, 1570312, 0313015, 6015603, 1304680, 1570312, 0156015, 7015601, 5603130, 4680157, 0312046, 9015603, 1306250, 3120313, 0156015, 6031306, 2503120, 1560157, 0156015, 6031304, 6801570, 3120469, 0156031, 3031201, 5601570, 3120469, 0156031, 3046801, 5703120, 1560313, 0156031, 3046801, 5703120, 3130156, 0156031, 3046801, 5703120, 6250313, 0312015, 6015703, 1206250, 3130312, 0156015, 7031204, 6901560, 3130312, 0156015, 7046804, 6903130, 1560312, 0157031, 2015604, 6903130, 4680157, 0312015, 6031301, 5603130, 1560312, 0157031, 2015604, 6903130, 1560312, 0157031, 2015603, 1301560, 4690312, 0157031, 2015604, 6903130, 1560312, 0157031, 2015603, 1301560, 3130156, 0312015, 7046803, 1304690, 1560312, 0157015, 6015606, 2503130, 1560312, 0157031, 2015604, 6903130, 4680157, 0312015, 6031301, 5603130, 1560312, 0157031, 2015604, 6903130, 1560312, 0157031, 2015603, 1301560, 3130156, 0312015, 7031201, 5604690, 3130156, 0312015, 7031201, 5603130, 1560313, 0156031, 2015704, 6803130, 1560313, 0156031, 2015701, 5601560, 1560157, 0156046, 9015604, 6904680, 3130469, 0156046, 9046803, 1301560, 3130156, 0312015, 7031201, 5603130, 1560313, 0156031, 2015703, 1201560, 3130469, 0156015, 6015601, 5704680, 3130469, 0156046, 9046803, 1301560, 3130156, 0312015, 7031201, 5603130, 1560313, 0156031, 2015703, 1201560, 3130156, 0313031, 2015601, 5703120, 1560157, 0156015, 6031303, 1201560, 1570312, 0156015, 7015601, 5603130, 3120156, 0157031, 2015601, 5701560, 1560313, 0312015, 6015703, 1201560, 1570156, 0156031, 3046801, 5703120, 4690156, 0313031, 2015601, 5703120, 4690156, 0313046, 8015703, 1201560, 3130156, 0313046, 8015703, 1203130, 1560156, 0313046, 8015703, 1201560, 1570156, 0156031, 3046801, 5703120, 4690156, 0313015, 6046903, 1203130, 1560156, 0313062, 5031201, 5601570, 1560156, 0313046, 8015703, 1204690, 1560313, 0312015, 6015703, 1204690, 1560313, 0468015, 7031201, 5603130, 1560313, 0468015, 7031203, 1301560, 1560313, 0468015, 7031206, 2503130, 3120156, 0157031, 2062503, 1303120, 1560157, 0312046, 9015603, 1303120, 1560157, 0156015, 6015601, 5701560, 4690156, 0469046, 8031304, 6901560, 4690468, 0313015, 6031301, 5603120, 1570312, 0156031, 3015603, 1301560, 3120157, 0312015, 6031304, 6901560, 1560156, 0157046, 8031304, 6901560, 4690468, 0313015, 6031301, 5603120, 1570312, 0156031, 3015603, 1301560, 3120157, 0312015, 6031301, 5603130, 3120156, 0157031, 2015601, 5701560, 1560313, 0312015, 6015703, 1201560, 1570156, 0156031, 3031201, 5601570, 3120156, 0157015, 6015603, 1303120, 1560157, 0312015, 6015701, 5601560, 3130312, 0156015, 7031201, 5601570, 1560156, 0313031, 2015601, 5703120, 1560157, 0156015, 6031301, 5603120, 1570312, 0156046, 9031304, 6801570, 3120156, 0313015, 6031301, 5603120, 1570312, 0156046, 9031301, 5603120, 1570312, 0156031, 3015604, 6903120, 1570312, 0156046, 9031301, 5603120, 1570312, 0156031, 3015603, 1301560, 3120157, 0468031, 3046901, 5603120, 1570156, 0156062, 5031301, 5603120, 1570312, 0156046, 9031304, 6801570, 3120156, 0313015, 6031301, 5603120, 1570312, 0156046, 9031301, 5603120, 1570312, 0156031, 3015603, 1301560, 3120157, 0312015, 6046903, 1301560, 3120157, 0312015, 6031301, 5603130, 1560312, 0157046, 8031304, 6901560, 3120157, 0156015, 6062504, 6917190, 4680469, 0469234, 4046804, 6901560, 3132344, 0468046, 9046923, 4404680, 4690156, 0313015, 6031301, 5603120, 1570312, 0156046, 9031304, 6801570, 3120156, 0313015, 6031301, 5603120, 1570312, 0156046, 9031301, 5603120, 1570312, 0156031, 3015604, 6903120, 1570312, 0156046, 9031301, 5603120, 1570312, 0156031, 3015603, 1301560, 3120157, 0468031, 3046901, 5603120, 1570156, 0156062, 5031301, 5603120, 1570312, 0156046, 9031304, 6801570, 3120156, 0313015, 6031301, 5603120, 1570312, 0156046, 9031301, 5603120, 1570312, 0156031, 3015603, 1301560, 3120157, 0312015, 6046903, 1301560, 3120157, 0312015, 6031301, 5603130, 1560312, 0157046, 8031304, 6901560, 3120157, 0156015, 6062503, 1301560, 3120157, 0312015, 6046903, 1304680, 1570312, 0156031, 3015603, 1301560, 3120157, 0312015, 6046903, 1301560, 3120157, 0312015, 6031301, 5604690, 3120157, 0312015, 6046903, 1301560, 3120157, 0312015, 6031301, 5603130, 1560312, 0157046, 8031304, 6901560, 3120157, 0156015, 6062503, 1301560, 3120157, 0312015, 6046903, 1304680, 1570312, 0156031, 3015603, 1301560, 3120157, 0312015, 6046903, 1301560, 3120157, 0312015, 6031301, 5603130, 1560312, 0157031, 2015604, 6903130, 1560312, 0157031, 2015603, 1301560, 3130156, 0312015, 7046803, 1304690, 1560312, 0157015, 60156);}} rule("chordArrays"){event{Ongoing-Global;}actions{Global.chordArrays[0] = Array(0403030, 2020202, 0101010, 2020202, 0101010, 1010101, 0101060, 1010101, 0106010, 1010101, 0105010, 1010103, 0104010, 1040101, 0104010, 1010103, 0101040, 1010101, 0106010, 6010101, 0401040, 1010101, 0501010, 1010104, 0101010, 1010104, 0101010, 1030104, 0101030, 1010105, 0101010, 1050101, 0101010, 5010101, 0501010, 5010101, 0501050, 1040106, 0106010, 1030401, 0101050, 1050106, 0106010, 1010102, 0102010, 6050106, 0106010, 1030304, 0101010, 5010501, 0506010, 1010101, 0101050, 1040106, 0106010, 1030401, 0101050, 1040106, 0106010, 1010102, 0102010, 6010501, 0601060, 1010303, 0401020, 2050105, 0105050, 1010101, 0303040, 6010101, 0101060, 1010101, 0101050, 1010101, 0301040, 1010401, 0101040, 1010101, 0301010, 4010101, 0101060, 1060101, 0104010, 4010101, 0104010, 1010101, 0401010, 1010101, 0401010, 1010301, 0401010, 3010101, 0501010, 1010501, 0101010, 1050101, 0105010, 1050101, 0105010, 5010401, 0601060, 1010304, 0101010, 5010501, 0601060, 1010101, 0201020, 1060501, 0601060, 1010303, 0401010, 1050105, 0105060, 1010101, 0101010, 5010401, 0601060, 1010304, 0101010, 5010401, 0601060, 1010101, 0201020, 1060105, 0106010, 6010103, 0304010, 2020501, 0501050, 5010101, 0101030, 3030202, 0401040, 2010401, 0402010, 1030101, 0101010, 1010401, 0101050, 3020401, 0401010, 2010401, 0402010, 1030101, 0101010, 1010401, 0101050, 2010104, 0201020, 2020102, 0204020, 1020201, 0101010, 1010101, 0101010, 1010101, 0101010, 1010101, 0401010, 1010104, 0101010, 1010104, 0101010, 1030104, 0101030, 1010106, 0101020, 1010101, 0601010, 1010105, 0101060, 1010102, 0102010, 1010105, 0101010, 1010501, 0101010, 1010501, 0101010, 4010501, 0103010, 1010501, 0101010, 5010101, 0101050, 1010105, 0101060, 1010106, 0202030, 2040104, 0201040, 1040201, 0103010, 1010101, 0101040, 1010105, 0302040, 1040101, 0201040, 1040201, 0103010, 1010101, 0101040, 1010105, 0201010, 4020102, 0202010, 2020402, 0102020, 1010101, 0101010, 1010101, 0101010, 1010101, 0101010, 1010101, 0101010, 1010101, 0101010, 1010101, 0105010, 4010601, 0601010, 3040101, 0105010, 5010601, 0601010, 1010201, 0201060, 5010601, 0601010, 3030401, 0101050, 1050105, 0601010, 1010101, 0105010, 4010601, 0601010, 3040101, 0105010, 4010601, 0601010, 1010201, 0201060, 1050106, 0106010, 1030304, 0102020, 5010501, 0505010, 1010103, 0304040, 2020202, 0202020, 2020202, 0202020, 2020202, 0205010, 4010601, 0601010, 3040101, 0105010, 5010601, 0601010, 1010201, 0201060, 5010601, 0601010, 3030401, 0101050, 1050105, 0601010, 1010101, 0105010, 4010601, 0601010, 3040101, 0105010, 4010601, 0601010, 1010201, 0201060, 1050106, 0106010, 1030304, 0102020, 5010501, 0505010, 1010103, 0304050, 1040106, 0106010, 1030401, 0101050, 1050106, 0106010, 1010102, 0102010, 6050106, 0106010, 1030304, 0101010, 5010501, 0506010, 1010101, 0101050, 1040106, 0106010, 1030401, 0101050, 1040106, 0106010, 1010102, 0102010, 6010501, 0601060, 1010303, 0401020, 2050105, 0105050, 1010101, 010101);}}

Clone this wiki locally