snowday

Blog

The read head cannot read the future

How tapespin works · October 13, 2026 · 4 min read

tapespin is an insert effect. It sits on a track and the host hands it audio a block at a time. It never sees what comes next. Everything the engine does follows from that one fact.

A ring and two heads

Inside the engine is a ring buffer: a loop of memory about twenty seconds long at the project's sample rate. Every incoming sample is written into it, in order, and the write position moves on one step per sample. That is the write head, always recording.

A second position reads from the ring. That is the read head. At normal speed it sits two samples behind the write head and follows it at the same pace, so what comes out is what went in, two samples late. The two samples are there because the reader interpolates with a four-point cubic, which needs two samples beyond where it is reading. The plugin reports them to the host as its latency, so the host lines the track up and you never hear them.

Speed, in the engine, means how far the read head moves per output sample. At speed one it moves one sample. At a half it moves half a sample, so it takes two output samples to get through one sample of input: the music plays at half speed and an octave down. Pitch follows speed exactly, the way it does on tape.

Slowing down builds a debt

The moment the read head drops below speed one, it falls behind the write head. Each output sample it falls behind by 1 - speed. Hold the record at a stop for a second and the write head has moved on a full second while the read head has not moved at all. The engine calls the gap the lag. It is easier to think of it as a debt: a second of music the track has played that you have not heard yet.

The read head can never pass the write head, because there is nothing on the far side to read. So the debt cannot be paid by running ahead. It can only be paid in two ways, and tapespin offers both as the Start mode.

Spin up: pay it with a cut

In Spin up mode the speed climbs from wherever it is back to one, along the Start curve. While it climbs it is still below one, so the debt keeps growing, a little more slowly each sample. When the ramp ends the head is at full speed but still behind, and it would stay behind for good.

So the engine cuts. Fifteen milliseconds before the ramp ends it starts a crossfade from the old read position to a new one at the live position. During the fade both signals play at once: the outgoing tape keeps its rising speed, the incoming live audio plays at speed one. Neither has a step in pitch. When the ramp ends the crossfade is done and you are hearing the live track exactly. The tests check this to within a hundred-thousandth of full scale from the first sample after the ramp.

One detail. If the reel was fully stopped and silent when you let go, the head jumps to the live position before the climb starts, so a parked reel restarts on what is coming in now, not on audio from before the stop. If you let go mid-fall, or let go of a scratch, it rises from where it is.

What you hear: the pitch rises to normal, then the music skips forward to where the track really is. The skip is the debt being written off. It sounds like tape: the rise, then a clean edit. With Snap on, the ramp is resized so the edit lands on a grid line.

Catch up: pay it with speed

In Catch up mode there is no cut. The engine plans the debt instead. It draws a curve for the lag: start at the current debt, with the slope the current speed implies, and reach zero with zero slope exactly when the ramp ends. The curve is a cubic built from two terms that never go negative, which is the same as saying the head never gets ahead of live.

Speed is then whatever that curve demands. Because the lag has to shrink to nothing, the head has to run faster than the write head for a while. From a full stop the speed rises past one, peaks at about 1.33 times normal two thirds of the way through the ramp, and settles back to one. That is about five semitones above pitch. The tests check the peak lands between 1.2 and 1.4. Speed is capped at twice normal; if the debt is too large to clear under that cap, the engine first crossfades the head forward to the largest debt it can clear.

What you hear: the pitch climbs through normal and a little past it, the music runs fast for a moment, and then it is back in step with no jump. Both modes are kept, because neither is right for every stop. The Varispeed knob, which drags the running speed down to a quarter, builds the same debt and pays it this way when it returns to 100 percent.

Written from the engine source, tapespin 0.1.0.