I refactored to use Tone.Part and this resolved the volume warp issue. I didn’t realize this existed, it’s a built-in function specifically designed to schedule multiple play events from an instrument in a loop.