Hand sewing pushes the needle through the cloth and out the other side. A machine cannot: the needle is bolted to a bar, and the bar has to come back.
So a machine does not sew the way a hand does. It ties a knot out of two threads, neither of which ever crosses to the other’s side of the cloth, and everything under the throat plate exists to tie it. The needle thread stays above. The bobbin thread stays below. They are locked together in the middle, once per stitch, at four thousand stitches a minute.
The sprite is the head in section: the take-up lever swinging in its slot, the needle bar in its bushing, a presser foot on five millimetres of cloth, and under the plate a rotary hook turning twice for every stitch around a bobbin that never moves at all.
The loop exists because the needle is going the wrong way
Going down, the thread rides in a long groove milled up the needle’s front and is carried cleanly. Coming back up, the thread on the other face — the scarf side, where the groove is short — is held by friction in the hole it has just made, and does not follow.
Every millimetre the needle rises is a millimetre of thread left behind, and a doubled thread with slack in it stands off the needle as a bight half that tall. The loop the hook catches only exists during the retreat. A needle that went down and stopped would never make a stitch, and neither would one that came straight back up through a hole it had not had time to grip.
Two settings, one number
Every lockstitch service manual gives you the same two figures:
the hook point meets the needle when the needle has risen 2.2 mm the point passes 1.1 mm above the needle’s eye
They look like two independent adjustments to make with two gauges. They are one number written twice. 2.2 mm of rise leaves 2.2 mm of slack; a doubled thread with 2.2 mm of slack in it stands 1.1 mm proud; and “1.1 mm above the eye” is the instruction to enter that bight right at its crest.
Which is a knife edge, and the piece is about what holds it off one.
The whole drawing is built from those two numbers, in this order — each line forced by the one above it, none of them a drawing decision:
| quantity | mm | forced by |
|---|---|---|
| point crosses the needle at | -9.400 | needle offset and point radius, nothing else |
| eye at bottom dead centre | -6.100 | the point height, + 1.1 over + 2.2 of rise |
| needle point at bottom | -4.600 | the eye, + 1.5 |
| needle point at top | -35.300 | the bottom, − the 30.7 stroke |
| throat plate | -14.600 | the bottom of the stroke, − 10 of penetration |
| cloth, top face | -19.600 | the plate, − 5 of cloth |
Heights are from the hook’s axis, down positive. The meeting happens at 217.39° of the main shaft and the loop is cast off at 322.4°.
Both ways of getting it wrong are the same failure
Move the hook early and the point sails over a loop that has not grown yet. Move it late and the point drops below the eye, where it goes under the bight or into the thread. Both come out of the machine as a skipped stitch, and the band between them is narrow:
| hook timing | rise at the meeting | bight | point over eye | verdict |
|---|---|---|---|---|
| -24° | 1.01 mm | 0.99 mm | 2.29 mm | early — the point passes over the crest |
| -12° | 1.55 mm | 1.29 mm | 1.75 mm | early — the point passes over the crest |
| -8° | 1.75 mm | 1.38 mm | 1.55 mm | early — the point passes over the crest |
| -6° | 1.86 mm | 1.42 mm | 1.44 mm | early — the point passes over the crest |
| -4° | 1.97 mm | 1.46 mm | 1.33 mm | sews |
| 0° | 2.20 mm | 1.53 mm | 1.10 mm | sews |
| +4° | 2.44 mm | 1.60 mm | 0.86 mm | sews |
| +8° | 2.70 mm | 1.66 mm | 0.60 mm | sews |
| +12° | 2.97 mm | 1.72 mm | 0.33 mm | sews |
| +16° | 3.25 mm | 1.78 mm | 0.05 mm | sews |
| +17° | 3.33 mm | 1.79 mm | -0.03 mm | late — the point is below the eye |
| +20° | 3.55 mm | 1.82 mm | -0.25 mm | late — the point is below the eye |
| +26° | 4.02 mm | 2.01 mm | -0.72 mm | late — the point is below the eye |
-5.7° … +16.6° of hook rotation — 22.25° wide, which is 11.13° of the main shaft, over a needle rise of 1.88 to 3.30 mm. Note where the book setting sits in it: five degrees off the early edge and sixteen off the late one. Nearly all the margin is on the late side, because the late edge is something else entirely — it is the needle’s own eye, and a point set past it does not miss the thread, it hits it.
And the window is not a leisurely thing:
| stitches / min | one turn | the window |
|---|---|---|
| 200 | 300.00 ms | 9.271 ms |
| 1000 | 60.00 ms | 1.854 ms |
| 2000 | 30.00 ms | 0.927 ms |
| 3000 | 20.00 ms | 0.618 ms |
| 4000 | 15.00 ms | 0.464 ms |
| 5500 | 10.91 ms | 0.337 ms |
At a factory’s running speed the entire event — bight up, point in, thread committed — has to land inside a third of a millisecond, five thousand times a minute, on a machine you oil with a can.
What holds the book setting off the edge
If the bight were only ever half the rise, the book setting would sit exactly on the early edge: 1.1 mm of crest against a point arriving at 1.1 mm. It does not, because the take-up lever is still descending at the moment of the meeting and is still paying thread out. How much of that reaches the loop is the job of the check spring — the little coil on the tension post that holds the thread taut while the needle is down and lets go when it has run out of travel.
So the check spring stroke, which no one thinks of as a timing adjustment, is one:
| check spring | slack past it at the meeting | bight | window (hook°) | the book setting |
|---|---|---|---|---|
| 0.0 mm | 2.86 mm | 2.53 mm | -19.6 … 16.6 | sews |
| 1.0 mm | 1.86 mm | 2.03 mm | -12.5 … 16.6 | sews |
| 1.5 mm | 1.36 mm | 1.78 mm | -9.0 … 16.6 | sews |
| 2.0 mm | 0.86 mm | 1.53 mm | -5.7 … 16.6 | sews |
| 2.5 mm | 0.36 mm | 1.28 mm | -2.4 … 16.6 | sews |
| 2.9 mm | 0.00 mm | 1.10 mm | 0.0 … 16.6 | early — the book setting no longer catches |
| 3.0 mm | 0.00 mm | 1.10 mm | 0.0 … 16.6 | early — the book setting no longer catches |
| 4.0 mm | 0.00 mm | 1.10 mm | 0.0 … 16.6 | early — the book setting no longer catches |
There is 2.86 mm of payout at the meeting to be shared out. Wind the spring past that and nothing at all gets through, the bight falls back to exactly half the rise — 1.10 mm, against a point arriving at 1.10 mm — and the machine starts skipping with the hook timed exactly as the manual says. The identity that made the two settings one number is also the cliff the machine falls off.
That is the piece’s actual finding. The two famous numbers are not a spec, they are the edge of a spec, and the margin you sew on comes from somewhere else.
The other thing: how much thread moves
The loop has to open wide enough to pass a whole bobbin. Nobody says this out loud, and it is the most startling number in the machine:
| what | mm |
|---|---|
| thread below the eye, at its most | 95.30 |
| …and at its least | 0.12 |
| so the hook asks for, and gives back | 95.18 |
| the take-up lever and needle bar return | 52.07 |
| the seam keeps (2.5 stitch + two passes through the cloth) | 7.50 |
12.7 to 1. Nearly a hundred millimetres of thread is dragged down under the plate and hauled back up, every stitch, so that seven and a half millimetres can stay. At 4,000 stitches a minute that is 6.3 metres of thread a second going through the hook, to lay half a metre of seam.
It is also what the take-up lever is for. A lever, and not a roller, because it sits between two fixed anchors — so moving its eye a millimetre changes the road by nearly two, and one swing can pay out and reclaim the tens of millimetres the hook is about to demand. Watch the two curves trade in the demo: the lever bottoms out exactly as the loop starts opening, and starts climbing before the loop is cast off.
| shaft | thread below the eye | thread in the arm | wrap | what is happening |
|---|---|---|---|---|
| 0° | 19.7 mm | 115.7 mm | — | needle at the top, knot set |
| 90° | 1.7 mm | 99.8 mm | — | needle coming down |
| 180° | 11.0 mm | 68.0 mm | — | bottom dead centre |
| 217° | 8.8 mm | 65.1 mm | — | the meeting |
| 240° | 29.4 mm | 67.7 mm | 45° | loop opening around the case |
| 300° | 84.5 mm | 91.1 mm | 165° | loop past the widest point |
| 330° | 17.0 mm | 106.5 mm | — | cast off, take-up hauling |
The drop between 300° and 330° is not the loop easing off. It is the loop slipping off the hook’s tail and the take-up whipping the entire ninety millimetres back up in a fraction of a turn. That snap is the sound a sewing machine makes.
And where the knot ends up
Two tensions pulling on one knot, so the knot goes wherever they balance:
| top tension | bobbin tension | knot depth | what a sewer would call it |
|---|---|---|---|
| 80 | 20 | 1.00 mm (20%) | bobbin thread showing on top |
| 65 | 35 | 1.75 mm (35%) | balanced |
| 50 | 50 | 2.50 mm (50%) | balanced |
| 35 | 65 | 3.25 mm (65%) | balanced |
| 20 | 80 | 4.00 mm (80%) | needle thread looping underneath |
This is the one part of the machine every sewer already knows by its symptom and not its cause. “Loops on the underside” is never a bobbin problem; it is the top tension being too loose to pull the knot up out of the cloth. The cross-section in the sprite says so directly — the seam behind the needle carries the knot at whatever depth the two sliders have agreed on, and it moves while you drag them.
The bight is one pixel, and that is the right size for it
At 0.85 px/mm a 1.1 mm bight is one pixel tall. The sprite draws it at one pixel, because that is how big it is, and because a machine whose whole behaviour turns on something you cannot see at working scale is worth saying plainly.
The demo carries a loupe — the same instant at 9 px/mm, eleven millimetres across — with the needle’s groove and scarf, the bight drawn as the doubled thread it is, and the point coming round on its own circle. Two bars beside it give the only comparison that matters: the crest of the bight, and the height the point actually arrives at. Every position in the loupe is read from the same functions that draw the sprite; nothing is re-posed for the close-up.
Reuse
source/lockstitch.mjs is framework-free, with no canvas in it. The machine is
authored in millimetres and toPx is the only thing that knows about pixels.
needleDrop/needleTipY/needleEyeY/needleRise/angleAtRise— the needle bar as the slider-crank it is. The rod term is what makes the rise out of bottom dead centre something other than a cosine, and the rise is what the entire machine is timed against.hookBearing/hookPoint/meetAngle— the hook at two turns per stitch, withtimingin degrees of hook rotation, positive being late.takeUpEye/clampGuide/armPath/payout— the thread’s road above the eye, as four straight runs between three anchors and one that swings.slackAt/bightAt/pointOverEye/catchTest— the loop, and whether it gets caught.catchTestreturns why it failed, which is the difference between the two skips.catchWindow(cfg)— the band of timings that sew, swept rather than solved: the rise is a slider-crank and the slack has a kink in it where the check spring gives up, so there is no clean inverse.wrapAngle/wrapPoints/castOffAngle/workPath/threadBudget/cycle— the loop’s trip round the bobbin and what it costs in thread.knotDepth/knotPoint— the tension balance, which is one line.renderFrame(cfg)→ an indexed bitmap;renderLoupe(cfg)→ the same instant at 9 px/mm;paintBitmapputs either on a 2D context at an integer scale.validateGeometry()checks the story rather than the syntax: that the book settings land inside the window, that leaving it in either direction fails in opposite ways, that the loop clears the bobbin case, and that some slack gets past the check spring.
The demo is demo/index.html with its own copy of the module (ADR-0002). It
sizes itself to its viewport, so the site’s full-screen button just works.
What is derived here, and what isn’t
- Derived, and the drawing is built from it: the meeting height, from the needle’s offset and the point’s radius; every height in the first table; the slider-crank rise; the identity between 2.2 and 1.1; the two-sided window and its width in shaft degrees and milliseconds; the check spring cliff; the thread the wrap demands, computed off the same arc that gets drawn.
- Measured, not asserted:
scripts/measure.mjsregenerates every table above from the module.scripts/screenshot-demo.mjsboots the demo in a real browser, drives it, and checks ten assertions against the live page’s own readouts — that the book setting sews, that it meets at 2.2 mm with the point 1.1 mm over the eye, that late fails late and early fails early, that the hook asks for more than ten times what the seam keeps, and that tightening the top pulls the knot up. Any page error fails the run. - Chosen: rosewood-free, but still chosen — an industrial DDL-class machine at 30.7 mm of stroke and a 12.5 mm point radius; 5 mm of cloth, which is a hem in heavy denim rather than the poplin you would actually be sewing, because a knot moving inside 1.2 mm of shirting cannot be drawn at 0.85 px/mm; a check spring stroke of 2 mm as the default; a cast-off at 210° of hook rotation; and the bight standing at exactly half its slack, which is the generous end of a range real thread lands anywhere in.
- Not modelled, and it matters: the head above the plate is foreshortened. A real arm is several times as tall as the one drawn, so the take-up lever’s throw is short and it returns 52 mm of the 95 the hook asks for rather than nearly all of it. The hook’s half of the ledger is to scale and is the surprising half; the lever’s is not, and the number in the table is the drawn lever’s, not a DDL’s. The main shaft’s crank and connecting rod are above the frame entirely — in the machine they are behind the face plate, which is why you can watch a sewing machine all day and never see what drives it.
- Not modelled, and it doesn’t matter to the lesson: thread as an elastic body with bending stiffness, which is what actually decides how a bight leans and therefore how forgiving the window really is; the needle deflecting sideways as it enters, which is the other classic cause of skipped stitches and the reason heavy cloth wants a bigger needle; the bobbin case opener; the feed dog’s real four-motion linkage, which is here as a sine and a cosine because all it has to do is be out of the way while the needle is in.
- A game, not physics: the tension sliders are a ratio rather than a force, so the knot moves smoothly to wherever you put it. A real machine gives you no such linearity, which is why the tension dial is the part everyone hates.