Single clock is what I arrived at too, thanks for confirming. I think I’m going to avoid GCF because I have a sneaking suspicion this will still be quite jittery and I’ll instead continually reconcile with the always-out-of-phase clock. I’m thinking of the old Air Force navigators’ motto my Dad told me: “Always off-course, always correcting” 
Good question, but I was just throwing simple pulses at the input, setting the pulses razor-thin in init() and then just invoking their outputs on the metro handler. I do a bit of math to figure out the new BPM but I wouldn’t think this would slow anything down:
function v_to_bpm(v)
v = math.min(math.max(v, v_min), v_max)
local ratio = (v - v_min) / (v_max - v_min)
local new_bpm = bpm_min + (ratio * (bpm_max - bpm_min))
local frac = new_bpm % 1
new_bpm = new_bpm - frac
return new_bpm + (frac < 0.5 and 0 or 1)
end
And then there’s calculating the new interval for the metro, even simpler:
function div_to_seconds(divisor)
return 1 / (bpm / 60 * divisor)
end