The Wedge You Can Bow In
A bowed string will only speak inside a wedge of bow force and bow position. Two boundaries, two different power laws, and the gap between them closes near the bridge.
What it is
Hold anywhere and keep the pointer moving. Across is where along the string you are bowing, as a fraction of its length from the bridge. Up is how hard you press. How fast you move is the bow speed, so if you stop moving the note dies.
That last part is not a gimmick I added, it falls out of the model. A bow held still against a string is a damper.
The shaded wedge is where it should speak. Every dot is somewhere it actually did: green for the note, blue for surface sound, red for a raucous tear. Play around and you paint the real region over the predicted one.
Three strings. body switches the box off, so you can hear what the bare string sounds like on its own. marks at one bow speed divides each dot’s force by the speed you were bowing at when you found it, which is the difference between a scatter plot and a test.
How it works
The clarinet’s reed was a valve. A bow is friction, which behaves differently. The hair grips the string and drags it sideways until the string pulls hard enough to break away, snaps back, and gets caught again. One break-away per period is Helmholtz motion and it is the note. Nothing in the code schedules it.
The string is two delay lines, one to the bridge and one to the nut, and the bow sits at the junction. Each sample solves one scalar equation: the string says an applied force produces a velocity at the contact point, the bow says the force depends on how fast hair and string are sliding, which depends on that velocity. Same shape of problem as day 56’s reed, different physics inside it.
Schelleng worked out in 1973 that there are two limits. Too little force and the string breaks away several times per period, which is thin and real and called surface sound. Too much and the period stops being regular. His prediction is that the floor goes as 1/β² and the ceiling as 1/β, where β is your distance from the bridge as a fraction of the string.
Two different powers is the whole point. It means the two bounds are not parallel, so the region between them closes, and there is a place near the bridge past which no bow force works at all.
Measured off the model, at 65 Hz with the bow moving at 0.15:
| bowing at | minimum force | maximum force | how wide |
|---|---|---|---|
| 0.15 | 0.568 | 0.876 | 1.5x |
| 0.17 | 0.402 | 0.984 | 2.5x |
| 0.21 | 0.264 | 1.058 | 4.0x |
| 0.24 | 0.253 | 0.745 | 2.9x |
| 0.27 | 0.230 | 0.569 | 2.5x |
Fitting power laws to those: the floor comes out at β^-1.55 and the ceiling at β^-0.73. Sampling a slightly different set of positions gives -1.80 and -1.08, so each exponent is only good to about a quarter, against Schelleng’s -2 and -1.
What survives that wobble is the thing that matters. The floor is consistently steeper than the ceiling, by about 0.8 either way I measure it, and that difference is what makes it a wedge. Extending the fitted lines, they meet at β = 0.064, about a sixteenth of the string from the bridge, past which there is no playable force.
That is a fact about geometry, not about skill. Bowing sul ponticello is hard because the target is genuinely tiny, and eventually there is no target.
One caveat I only found while shooting the poster. The wedge is fitted on the C string and drawn unchanged on the other two, and it should not be. Bowing the G string at the same 0.21 from the bridge with the same force of 0.50 gives 2.02 slips a period, which is surface sound, where the C string at those exact numbers gives 1.01 and is the note. The shape of the region carries over between strings, the coefficients do not.
None of that is what makes it sound like an instrument. A bare bowed string sounds like a bare bowed string, thin and buzzy, and almost everything anyone recognises as a cello is what the box does to that signal afterwards. There are six resonances in here: the air inside at 100 Hz, the plates at 175, 215 and 400, a hole between them at 700, and the broad hill the bridge itself has around 1400.
I normalised the whole bank by its own loudest point, so switching the body on is a change of colour and never a change of volume. Rendering the shipped chain offline, the G string’s fundamental comes through at -0.5 dB, its octave at -2.8, and the partial that falls in the hole at -10.9. A 10 dB spread across neighbouring partials is the entire difference between a buzz and a cello.
The body sits downstream of the string and has no vote in whether the string speaks, so it cannot move the wedge. That is worth saying, because it is the reason I could bolt it on without re-measuring any of the above.
It runs in an AudioWorklet importing the same bow.ts the tests measure, and reports its
own mechanism back a few times a second: how often it broke away and what share of the
time it was gripped. Those two numbers are what the page colours the dots with, so the
region you paint is measured rather than assumed.
What surprised me
Three separate things went wrong before any of the above was measurable, and all three were in my instruments rather than the string.
Static friction is not a value, it is a limit. I wrote the friction force as
mu(relative) * force * sign(relative), which is how the textbooks draw the curve. But
sign(0) is zero, so that expression says the grip supplies no force at all at the exact
moment it is supposed to supply the most. The string could never stick. It made noise
across the whole spectrum at every setting I tried, and a 7 by 7 parameter sweep found
nothing that looked like a note.
While the hair grips it supplies whatever force the string demands, up to a limit, and the relative speed is exactly zero. That is a set-valued condition and it has to be written as a branch, not a formula.
Losses have to be per period, not per trip. The obvious way to damp a string is to lose a percentage every time a wave reaches an end. Bow near the bridge, though, and the short side round-trips twenty times a period while the long side goes once, so a per-trip coefficient makes the string’s decay depend on where the bow is.
I was measuring a law about bow position through a model whose losses already depended on bow position. Raising each side to its share of the period fixes it, and then the product across a full cycle is the same wherever the bow sits.
And measuring the pitch by counting crossings read every note an octave high. The bridge force in Helmholtz motion carries enough ripple to cross its own mean more than once a cycle, so a working string looked like it was playing 390 Hz instead of 195, my classifier rejected it, and the entire playing region measured as empty.
Days 7 and 28 both taught me to use autocorrelation with a submultiple guard for exactly this. I wrote the crossing counter anyway. Third time.
The instrument that finally worked is not a sound measurement at all. All three regions can sit at the same pitch and similar loudness, so what separates them is the motion: break-aways per period, and the share of the period spent gripped. Helmholtz motion is one break-away and 60 to 90 per cent gripped. Bowed far too hard the string still breaks away once a period, but it is gripped for 98% of it and merely dragged along, which is loud and is not a note.
Counting slips alone would have called that a perfect fifth of the wedge. The stuck share is what tells them apart, and I only went looking for it after the force sweep reported a playable region six hundred times wider than the one I could hear.
One thing went right without being asked. When I moved bow speed onto the pointer I expected to need a special case, some rule that zero speed means release the string. There is not one. Zero speed means hair being held against a moving string, the solver hands back a force that opposes the string’s motion, and the note is damped rather than driven. Rendering it offline, the peak falls from 0.789 to 0.096 in the quarter second after the hand stops.
The honest version of the friction law already knew that. A version with my special case bolted into it would have been a worse model that behaved the same way.
What I would do next
The bow speed law is the loose end. Schelleng says both bounds should be proportional to bow speed, and my measurements give something closer to speed to the power 1.5. Two of his three predictions came out and one did not, which either means my upper boundary is defined by a threshold I chose rather than by the physics, or something in the friction curve is wrong.
The page now argues about it in public. marks at one bow speed divides each dot’s force by speed to the 1.5, so if that exponent is right then a cloud collected at every speed you happened to bow at should collapse onto the drawn wedge, and if it is wrong the cloud stays smeared. Switch it off and the wedge itself lifts with your hand instead.
I have not got a clean answer out of it by hand, and getting one means sweeping speed the way I swept force. That is a day on its own.