Schedule Web MIDI Events with precision using WAAClock lib

I have read and implemented in the past something similar to what Chris Wilson described in his article “A Tale of Two Clocks”: https://web.dev/audio-scheduling/

I recently found WAAClock which in theory implements the same principle:
https://github.com/sebpiq/WAAClock

I’m working on a MIDI Web App and I want to send MIDI Clock Messages, which requires precise scheduling. I wrote this post in WebMidiJS forum (an amazing lib I’m using in my Project):

https://github.com/djipco/webmidi/discussions/333

Essentially this is my code:

const PULSES_PER_QUARTER_NOTE = 24;
const BPM_ONE_SECOND = 60;

let context = new AudioContext();
let clock = new WAAClock(context);

const calculateClockDelay = bpm => BPM_ONE_SECOND  / bpm /  PULSES_PER_QUARTER_NOTE; 

const startMidiClock = bpm => {
    clock.start();

    clock.callbackAtTime(function () {
        WebMidi.outputs.forEach(outputPort => outputPort.sendClock({}));
    }, 0).repeat(calculateClockDelay(bpm));`
}

const stopMidiClock = () =>  clock.stop();

As described in that posts, I CANNOT get the event to happen with high precision. I see the BPM Meter to slightly DRIFT. I tried sending MIDI Clock from a DAW and the timing is perfect.

I’m using ZERO as tolerance in the clock.callbackAtTime function.

  • Why Do I see this drift/ slight scheduling error?
  • Is there any other way to schedule a precise repeating MIDI event with WAAClock?
  • Is WAAClock capable of precise scheduling as with Chris Wilson’s technique?

Thanks a lot!
Danny Bullo