Methodology
Principle
Nothing on this site was typed by hand. A program reads the original selectorconve.xls
workbook and produces the data files the calculators use; the same tools check that the
site’s calculation engine returns the original’s results. The file and its code are not
published: the data, the rules and the evidence are.
Extraction
- Catalogue. The sheet
diam_monoholds the plain-string series (gauge in %mm and reference) and the five wound-string families (linear weight and reference). The columns are read as they are, quirks included: one linear weight with two references (BFA482 and BFA484), or series that end in “NO”. - Formulas. The workbook’s formulas are stored as defined names in Excel’s binary format (tokens in reverse Polish notation). A purpose-built decoder evaluates them directly on those bytes, without transcription; this recovers the coefficients (150, 156.9767, 162.6506, 170, 155), the tier thresholds (100 and 150) and the PUL constant 24500.
- Tunings and instrument rules. The 31 instrument sheets provide notes, positions and frequencies; the base tunings at A 415 of the lute, vihuela, viols and baroque guitar were embedded as lists in the macros and are extracted from there. Which strings each instrument computes as plain and which as wound is a fixed rule of the program, transcribed as data and flagged as such in the report.
- Routines. Part of the calculation lived not in formulas but in Visual Basic macros. Those routines were re-expressed preserving their semantics: 32-bit variables for nylon and gut, tension read as text with two decimals, a fixed KF coefficient in the instrument sheets. Every quirk is noted in the extraction report shown below.
Verification
The calculators’ JavaScript engine is compared against two things. First, a Python reference model that evaluates the original formulas over a grid of frequencies, lengths and tensions. Second — and this is what proves fidelity — cells that Excel itself computed at the time and left stored in the Renaissance lute sheet: nineteen gauge and PUL values reproduced bit for bit. All of this is part of an automated test battery that runs before every release, together with the accessibility audit and the per-page weight budget.
What is not replicated
- The original’s inch-and-pound mode. It existed, with its own conversions (2.541 cm per inch; 2.20458 pounds per kilogram) and a bug in one of its formulas; it is documented, but this site’s calculators work in metric units only.
- The 1998 interface (Excel 5 dialog boxes). It is replaced by accessible web forms; the sheets are shown reconstructed in the museum-mode gallery.
- Savarez’s Visual Basic code. It is neither published nor transcribed.
Reproducibility
The project repository includes the extractor, the tests and a make check that
regenerates the data and checks that it does not change. Anyone with a copy of the original
file can redo the extraction and verify that they obtain exactly the same JSON (the file’s
SHA-256 fingerprint is shown below).
Source
- SHA-256
cb761067d4aa2c920494acdaf9c39273e766d2264a6dc1b0339d45d45b724601- bytes
- 2717696
- sheets · defined names
- 50 · 430
Fidelity evidence
- 19 cells computed by Excel itself in the Renaissance lute sheet, reproduced with relative error < 10⁻¹²
- 293 grid cases evaluated with the original formulas
- 23 instrument cases
- Tolerance between the JavaScript engine and the reference model: 10⁻⁹ relative
- Bit-exact values: 34.61706216083882 (KF gauge) and 117.12066107226997 (PUL)
Extraction counts
| Dataset | Count |
|---|---|
| mono | GUT: 38 · KF: 43 · NYLON: 37 |
| wound | GUT_AG: 41 · GUT_CU: 35 · NYL_AG: 23 · NYL_CU: 24 · NYL_PLAS: 21 |
| instruments | 31 |
| strings | 344 |
| golden | excelObserved: 19 · instrumentFromTension: 17 · instrumentTension: 6 · monoDiameters: 79 · monoTension: 56 · transpose: 19 · woundPul: 79 · woundTension: 79 |
Quirks of the original (reproduced as is)
- Nylon/gut diameters use the tension read as text with format 0.00 and Single (VBA) arithmetic.
- The instrument sheets use KF with a fixed coefficient of 150 (no tiers) and are metric only.
- The hypotheses are floor-type LOOKUPs (largest value <= x), not 'nearest'; offsets +2/+3/+4/+5 %mm and +15..+60 PUL.
- BOYFILAG contains PUL 480 twice (BFA482 and BFA484); the exact lookup returns the first one.
- COEF_KF and DIAMETRE_KF (and DOn_440/REn_440...) are broken #REF! names in the original.
- recdipulviolb (viols) and recdipulviuhl (vihuela) write both plain gauge AND PUL into overlapping rows (14-15 / 20-23).
- Imperial mode (not replicated): 2.541 cm/inch (not 2.54), 2.20458 lb/kg (not 2.20462); DIAMETRE_KFI3 divides by L/2.541 (x6.4567); dmonoinch = diam_mono/2541 and nylon is missing NN42, NN52, NN72, NN112.
Detected anomalies
- CONCHARP · KF · FORTE · #23: 126 — gauge missing from the KF catalogue
Data provenance
- constants.coefficients.COEF_STEEL, RECDIPUL_CONSTANT and hypothesisOffsets are literals from the VBA code declared in extract_constants.py.
- tunings.instruments[].rules (showMonoBelowPosition, fromTension.plainRows/woundRows, byTuning) are rules derived from reading the VBA (*acc and recdipul* routines), not parsed data; GUITERZ is marked assumed=true.
- brokenNames includes the direct #REF! names (source.nameKinds['ref-error']) plus the transitive ones that reference them (e.g. DIAMETRE_KF), hence the difference in counts.
Broken defined names in the original
COEF_KF, DIAMETRE_KF, DO0_415, DO2_440, DO3_440, DO4_440, DO5_440, DO6_440, DO7_440, FA2_440, FA3_440, FA4_440, FA5_440, FA6_440, FA7_440, INF2, INT1, INT2, LA1_440, LA2_440, LA3_440, LA4_440, LA5_440, LA6_440, LA7_440, MI2_440, MI3_440, MI4_440, MI5_440, MI6_440, MI7_440, NOTE1, PIN1, PIN2, RE2_440, RE3_440, RE4_440, RE5_440, RE6_440, RE7_440, SI1_440, SI2_440, SI3_440, SI4_440, SI5_440, SI6_440, SI7_440, SOL1_440, SOL2_440, SOL3_440, SOL4_440, SOL5_440, SOL6_440, SOL7_440