Same asserts as examples/node/playback-ops.mjs (node-verified,
8/8): a 1 s 440 Hz sine with loop {0.25, 0.5} through
halfSpeedLoop / doubleSpeedQuantzLoop /
reverseSection / detectGap /
closeGapLeft, plus the invalid-loop throw. The waveforms
below are drawn at a FIXED samples-per-pixel scale, so the
half-speed-stretched loop region (tinted) is visibly twice as wide as the
original's. Audition buttons rebuild the ops with
ctx.createBuffer injected as the factory — proving the ops
produce genuine AudioBuffers when a browser caller asks for them.