hi @kabelsalat22 , hope you’re having a good end of the year 
there are two ways to have all the playheads fire at the same time:
quantize pad presses
under PARAMS > timing + patterns + arps > quantization, turn live-quantize pads to yes for each bank. this will sync any pad press in any bank to the next 1/16th note tick. this should help mitigate the ‘slightly different times’ trouble, since pressing pads in all three banks at once will queue the execution of each bank to the same timed iterator.
live-code execution
the underlying mechanisms of cheat codes can themselves be live-coded via maiden + the real-time line evaluation feature @infinitedigits added a while back. this allows a type of mini-scripting that facilitates deep customization which would normally require (often, blocking) UI decisions + implementation. this will require use of another device to load maiden, but it’s super rewarding – it’s how i approached my flash crash set a few months ago.
for example, let’s say we want to trigger pad 1 on each of the three banks at the same time, with the option to sync to a nearest beat value.
this code could be live-executed from a blank file in maiden after initializing cheat codes:
function trig_all_banks(pad,sync_val)
local function cascade()
for i = 1,3 do
grid_actions.pad_down(i,pad)
grid_actions.pad_up(i,pad)
end
end
if sync_val then
clock.run(function() clock.sync(sync_val) cascade() end)
else
cascade()
end
grid_dirty = true
end
and then deciding to (for example) trigger pad 5 in every bank on the nearest bar-start (in 4/4) would require executing in the maiden repl:
trig_all_banks(5,4)
where 5 is the pad and 4 is the sync value (@ 4 beats per bar in 4/4).
you could get fancier, if you want. for example, if you’d like to specify which pads should get triggered at the same time, we could go with:
function trig_these_pads(pads,sync_val)
local function cascade()
for i = 1,3 do
if pads[i] ~= nil then
grid_actions.pad_down(i,pads[i])
grid_actions.pad_up(i,pads[i])
end
end
end
if sync_val then
clock.run(function() clock.sync(sync_val) cascade() grid_dirty = true end)
else
cascade()
grid_dirty = true
end
end
and then if we wanted bank a’s pad 6 and bank c’s pad 9 to trigger at the next quarter-note beat, we’d execute this in the maiden repl:
trig_these_pads({6,nil,9},1)
the first argument is a table of values (demarcated by curly brackets), which contains the desired pad for (in order) bank a, bank b, and bank c – if we don’t want a bank to execute a pad, we can just use nil for that place. the second argument is our sync value, which is 1 (one beat, since we’re talking about a quarter-note in 4/4).
hope these suggestions help get you where you wanna be! lmk if you have any other q’s 