more smoothing would be like
bpmwindow = filters.mean.new(25)
-- initialize the smoother with (approximate) tick rate and convergence time
-- the actual samplerate will be the BPM-dependent tick rate,
-- so convergence time will vary with tempo... whatever
smoother = filters.smoother(24, 2) --- 2 seconds for 60bpm, 24ppq
...
bpm = bpmwindow:next(rawbpm)
bpm = smoother:next(bpm)
bpm = util.round(bpm, 0.1)
i do think the jitter here really is in the incoming clock. <1ms timing accuracy for each tick is probably considered sufficient in that context.