Vowel gestures calibrated by measurement; exporter sample rate from callers #18

Merged
aqua merged 10 commits from aqua/tract-voice into main 2026-11-10 18:13:29 +00:00

2026-11-08

Aqua
Weksa phones line reader: strict typed parse, unsupported phones reported, stress moves only intensity
The DSL's IPA table becomes PatchScript.TryIpaDescriptor so the reader asks the one table instead of keeping its own.
Fixture is Weksa PR 16 at a7bc2478, byte for byte.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-08 04:43:20 +00:00
Aqua
Radiation highpass is a fixed 200 Hz, not 40 + 500 * aperture
The corner sat at 540 Hz for a vowel, above /u/'s F1, and the envelope read that F1 at 450 Hz. The ladder's lip cell already carries the lip area; aperture stays the gain consonant closures use. Tests: u F1 250-350 and F2 near 876; i F1 band widened to 20% (the harmonic-line reading of i moves 230-260 Hz with the corner).

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-08 04:29:17 +00:00
Aqua
Vowel gestures keep the radiating aperture open: the lip cell already carries the lip area
The gesture also scaled the aperture (an output gain and highpass corner) by lip cm / 2.2, so /u/ (lip .05 cm) rendered 29 dB under /i/. A vowel now holds aperture at 1; consonant closures still use it. Test: /u/ rms within -10..+3 dB of /i/, F2 under 1000 Hz.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-08 04:04:03 +00:00
Aqua
Vowel gestures: tract shapes found by grid search over the exported ladder
EmitVowelGesture now holds tongue index, tongue and lip diameters (cm) from anchors measured by impulse response toward textbook F1/F2 (i 271/2313, u 292/876, a 703/1084, plus ae, e, o, schwa), with the constriction opened. The old targets put a at 310/2130 and i at 620/1620 through the same ladder. Tests render the authored gestures end to end and read LPC envelope peaks.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-08 03:41:20 +00:00
Aqua
Callers of FaustEmitter that render at a known rate pass it: the ladder's cell length follows the sample rate
The vocal ladder has one cell per sample, so exporting at the 48 kHz default and rendering at 44.1 kHz (daemon, IPA trial, song worker, graph renderer) shifted every formant down 8%. Speech-loss surface and AquaLower still take the default; the wasm compile path has no rate.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-08 03:41:20 +00:00
Aqua
vocal_network: Kelly-Lochbaum ladder replaces the per-path delay*loss primitive
Each waveguide path is a one-sample-per-cell ladder (N = round(L*SampleRate/c)) written as a Faust letrec; the glottal source
feeds cell 0 and the lip wave is the radiated signal. A branch port joining two paths of the network is a three-port velum
junction (Pink Trombone's), opening*coupling*0.4 cm wide. Lip reflection is the radiation load's live reflection.
The Gaussian area deformation of TerminalAreaExpression and SegmentAreaExpression is one helper, DeformedAreaExpression,
which the ladder cells also use. PrimitiveAreaExpression and PrimitiveDelayExpression are deleted. FaustExportOptions.SampleRate
(default 48000) is passed by the native runtime. Scaffold: contact opening 1, nostril radiation load.
Tests: F1/F2 of i, schwa, a, vowel ordering, stability with velum open, nasal exit with the mouth shut; the aliasing test
now measures the whole non-harmonic grid since the tract reshapes the harmonics.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-08 03:21:59 +00:00
Aqua
Tests: serialize the classes that compile through native libfaust
Three native-compiling classes running at once crashed the test host (reproduced at 271 passed, every run, once a third
native class existed). They now share one xUnit collection.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-08 03:21:59 +00:00
Aqua
Glottal source: band-limited saw through a one-pole lowpass with SourcePort.Tilt
Replaces the sine os.osc in the primitive vocal source. Tilt (default .5, DSL tilt=, surface /vocal/sources/i/tilt): 0 brightest, 1 steepest rolloff; cutoff 200*2^((1-tilt)*5) Hz. Opening and tension amplitude factors kept. ProbeTimelineReport models only the source's flow level (no oscillator), so tilt does not enter it.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-08 02:23:57 +00:00
Aqua
Exporter and probe report take the timeline's merged spline per surface; WordRender uses exporter splines
ControlSplineTimeline.SurfaceSplines is the one owner of which spline decides a surface (>=2 enabled splines merge into one bezier curve over the union of points; one spline unchanged). FaustExport and ProbeTimelineReport no longer sum per-spline offsets; WordRender drops its no-spline emit and timeline-driven sliders.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-08 02:16:52 +00:00