Take a look at this thread OSCFunc latency testing. Bottom line is that you should use the Sweep ugen and get the time from the ugen instead of relying on the timestamp of OSCfunc. Since Onset is kr only, you will have to use Sweep.kr or wrap the ar ugen in a ar-to-control rate ugen, ie. A2K.kr(Sweep.ar). I don’t think you will gain any precision from using the Sweep.ar converted to kr so probably just use Sweep.kr