Skip to content

Instantly share code, notes, and snippets.

@adamflorin
Created December 19, 2017 19:37
Show Gist options
  • Save adamflorin/f3f557069b1597a698ffccd1b40486d1 to your computer and use it in GitHub Desktop.
Save adamflorin/f3f557069b1597a698ffccd1b40486d1 to your computer and use it in GitHub Desktop.
Tone.js timing inaccuracy
import Tone from 'tone'
const bpm = 120.0
const QUARTER_NOTE_MS = 60000.0 / bpm
var lastTime
Tone.Transport.bpm.value = bpm;
// Measure time delta since last call, warn if early or late
function measureInterval(time) {
var currentTime = Date.now()
if (lastTime !== undefined) {
const deltaTime = currentTime - lastTime
const errorTime = deltaTime - QUARTER_NOTE_MS
if (errorTime > 0.0) {
console.warn("Transport fired", errorTime, "ms LATE");
} else if (errorTime < 0.0) {
console.warn("Transport fired", -errorTime, "ms EARLY");
}
}
lastTime = currentTime
}
// NOTE: timing is frequently off by >20ms
// e.g.
// Transport fired 25 ms LATE
// Transport fired 9 ms EARLY
// Transport fired 6 ms EARLY
// Transport fired 22 ms LATE
// Transport fired 7 ms EARLY
// Transport fired 9 ms EARLY
// Transport fired 18 ms LATE
Tone.Transport.scheduleRepeat(measureInterval, "4n")
// // COMPARE WITH setInterval: timing is never off by >1ms
// setInterval(measureInterval, QUARTER_NOTE_MS)
Tone.Transport.start()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment