Methodology

How the tension numbers are calculated, and where the data comes from.

The Formula

Tension is computed with the standard string-tension formula used throughout lutherie and string manufacturing:

T = UW × (2 × L × F)² / 386.4

Where T is tension in pounds, UW is the string's unit weight in pounds per linear inch, L is scale length in inches, F is the target pitch in Hz, and 386.4 is standard gravitational acceleration (in/s²), which converts the string's unit weight (a force) into the mass term the underlying physics needs.

This isn't an arbitrary industry formula. It falls directly out of the standard physics of a vibrating string. The fundamental frequency of a string under tension is f = 1/(2L) × √(T/μ), where μ is mass per unit length (the basis of Mersenne's laws). Solving that for T, with μ = UW/g, reproduces the formula above exactly. We confirmed it two ways before writing any code: against D'Addario's own published technical documentation, and independently from this first-principles derivation. (A small number of references round the gravitational constant to 386.09 instead of 386.4; the difference is under 0.1% and immaterial at string-gauge precision.)

Unit Weight: Where the Data Comes From

Unit weight is the part most likely to be wrong if guessed, and it depends on both gauge and construction: it isn't a simple function of diameter alone for wound strings. We used three different approaches depending on what's actually knowable, and we're explicit about which is which:

Plain steel, nylon, and fluorocarbon strings: exact physics. A plain string is a solid cylinder, so its unit weight is just density × π/4 × diameter². We use published material densities (music-wire steel ≈ 0.2836 lb/in³, confirmed against two independent steel-density references; nylon ≈ 1.15 g/cm³ and fluorocarbon (PVDF) ≈ 1.78 g/cm³, both standard materials-reference values). This is exactly how manufacturers derive plain-string unit weight themselves, and it's fully reproducible.

Phosphor bronze wound strings: a real published table. For phosphor bronze, we have an actual manufacturer data table: 28 gauges (0.020"–0.070") republished by a third-party lutherie technical reference, which states its figures were converted from D'Addario's own catalog unit-weight specifications. We use this table directly with linear interpolation between published gauges, not a model.

Nickel wound, pure nickel wound, 80/20 bronze wound, and stainless steel wound: a calibrated physical model. We could not retrieve a direct manufacturer table for these constructions (the manufacturer PDF we found is no longer reachable, and mirrors were blocked). Instead we model a wound string as a steel core plus a helically-wrapped layer, where the wrap's effective density includes a geometric packing factor (π/4, the standard estimate for a single contact-wound layer of round wire). The core-to-total proportion at each gauge isn't assumed. It's back-calculated from a real, published D'Addario per-string tension chart (the EXL110 10-46 nickel wound electric set), which is solvable directly because nickel-wound wrap wire is nickel-plated steel (the plating is microns thick, negligible mass), making its density essentially equal to the core's. That curve is then reused for the other three wrap materials, scaled by each material's own bulk density. This is a disclosed estimate, not tabulated data. See the validation numbers below for how well it holds up, including well outside its calibration range (bass gauges).

Validation

Before writing any UI, we validated the calculation module against real, published D'Addario per-string tension charts, run as an automated test suite that re-runs on every change to the formula, the unit-weight data, or the calculation logic:

The plain-string predictions above have zero free parameters (pure physics, no calibration), and still landed within 1% of D'Addario's published numbers, which also cross-confirms the 25.5"/34" scale-length assumptions baked into their generic tension charts.

The “Unbalanced” Flag

Each string's tension is compared against the median tension of the whole set, and flagged if it deviates by more than 35%. We deliberately don't compare a string to its physical neighbors: re-entrant tunings (a standard ukulele's G-C-E-A, where the G string is tuned above the C string) aren't pitch-monotonic across string order, so a neighbor-smoothness check would flag every string in a perfectly normal set. The median-based check is order-independent and only flags genuine outliers, like a gauge that doesn't suit its tuning.