Thanks for the response, Steve.
Question: If a Timer is set for 0ms Initial Delay; 0ms Repeat Delay, and since the BomeBox is basically a little Linux box, running a Timer for 16 iterations is effectively such a short amount of time it's inconsequential, no?
My Timers are basically testing bit by bit (only 16 bits, tho) across a Global Variable used as an Output Mask and comparing the status incurred by a button press and subsequent modification of said mask against a previous run state.
I don't have a situation that there would be NO output from a Timer (it would never seek to run if there is no change across all 16 Tracks). But as a Timer cycles through the 16 iterations I only want it to Delay any Output so the receiving device doesn't get overwhelmed.
So even if I move the TimerWithDelay part further up the chain and the Output portion is only called IF there is an Output, putting a Delay on the Output will not slow it down, but just Delay ALL the outputs.
I have:
PART A:[Proc Decides Output Necessary; Output:Do 0ms Timer "DO OUTPUT"] ->
PART B:[0ms Timer "DO OUTPUT" Calls 2 Timers 16x] ->
PART C1:1-[16x "OUTPUT CHANCE 0 MIDI CC" (Layer Level Control) Output Checks to see if run state for this bit has changed since the last time; if no change, exit; if change, output a MIDI CC]
PART C2:2-[16x "OUTPUT PYRAMIDI CC" (Group Level Control) Output Checks to see if run state for this bit has changed since last time; if no change, exit; if change, output a MIDI CC]
My Delays are currently at the Part B section so that Part C's iterations have a 2ms Delay between each.
If I add a Part D "Output" and pass a new Global over to it, and put a Delay on those outputs instead of the Timer, and if that Delay is the same for all outputs, then I'm just delaying the MIDI Bottleneck.
So, if I have a single Output routine Part D - the 16x iterations happen at Part C, and then call the Output Translator. If the Output Translator is not part of the Timer, but a result OF the Timer, I can change the value for Z1, no?
Example with 4 iterations:
Timer iteration 0 checks bit at index 0, sees this bit as the same as the last time it ran, so exit/skip
Timer iteration 1 checks bit at index 1, has new status for this bit compared to the previous status, so calls the Output routine, passes the Globals to it: ZA ZB ZC with Output Delay Z1 (Execute Outgoing Action after a delay).
Timer iteration 2 sees this bit as the same as the last time it ran, so exit/skip
Timer iteration 3 has a new status for this bit, so calls the Output routine, passes the Globals to it: Output ZA ZB ZC with Output Delay Z1.
...
Since the Timer is effectively running nearly instantaneously compared to the MIDI Data, ZA ZB ZC & Z1 are being changed BEFORE the first output is done because of the "Execute Outgoing Message After A Delay". However, these values are changed AFTER the Output Translator has received that data.
So can I just at the start of the Output Translator: oo=ZA pp=ZB qq=ZC xx=Z1 and then Output oo pp qq with Delay xx?
And since Z1 is created during the Timer and there is a counter, I can change the value of Z1 before it gets sent to the Output Translator and make each successive Z1 a little longer by [counter]*[Factor]
Should I sketch this out in MTPro speak?
I'm wondering about the sequence that MTPro completes each Translator and how it affects Global Variables, etc.