Tune Pink Trombone utterance controls

This commit is contained in:
Meta Vens 2026-05-26 22:28:00 +01:00
commit d3cbe11f3b
3 changed files with 66 additions and 50 deletions

View file

@ -550,6 +550,7 @@ public sealed class PinkTromboneReferenceRenderer(int sampleRate = 44100)
private int lastObstruction = -1;
private float velumTarget;
private float lastTurbulencePosition = float.NaN;
private float transientStrength = 1;
public TractShaper(Tract tract)
{
@ -572,6 +573,7 @@ public sealed class PinkTromboneReferenceRenderer(int sampleRate = 44100)
ReduceTargetDiametersByTouch(controls.ConstrictionIndex, Math.Max(0, controls.ConstrictionDiameter - 0.3f));
targetDiameter[Tract.N - 1] = Math.Min(targetDiameter[Tract.N - 1], Math.Max(0, controls.LipOpening));
velumTarget = controls.Velum > 0.08f ? Math.Clamp(controls.Velum, VelumClosedTarget, VelumOpenTarget) : VelumClosedTarget;
transientStrength = Math.Clamp(controls.Burst, 0, 2);
if (controls.Turbulence > 0.001f)
{
if (float.IsNaN(lastTurbulencePosition) || MathF.Abs(lastTurbulencePosition - controls.ConstrictionIndex) > 0.5f)
@ -628,7 +630,7 @@ public sealed class PinkTromboneReferenceRenderer(int sampleRate = 44100)
if (lastObstruction > -1 && newLastObstruction == -1 && tract.NoseDiameter[0] < 0.223f)
{
tract.AddTransient(lastObstruction, 1);
tract.AddTransient(lastObstruction, transientStrength);
}
lastObstruction = newLastObstruction;

View file

@ -25,11 +25,12 @@ public static class PinkTromboneUtteranceFixtures
private static readonly PinkTromboneFixtureControls U = A with
{
Frequency = 128,
TongueIndex = 12,
TongueDiameter = 2.9f,
Tenseness = 0.5f,
TongueIndex = 11.2f,
TongueDiameter = 3.05f,
ConstrictionIndex = 38,
ConstrictionDiameter = 1.45f,
LipOpening = 0.55f,
ConstrictionDiameter = 1.55f,
LipOpening = 0.42f,
LipReflection = -0.9f
};
@ -82,35 +83,37 @@ public static class PinkTromboneUtteranceFixtures
private static readonly PinkTromboneFixtureControls PClosure = A with
{
Frequency = 126,
Intensity = 0.04f,
Intensity = 0.01f,
Tenseness = 0.22f,
ConstrictionIndex = 41,
ConstrictionDiameter = 0.02f,
Turbulence = 0.08f,
Turbulence = 0.02f,
Velum = 0.01f,
LipOpening = 0.35f,
Burst = 0.9f,
LipOpening = 0.08f,
Burst = 1.35f,
Gain = 0.7f
};
private static readonly PinkTromboneFixtureControls PRelease = PClosure with
{
Intensity = 0.28f,
Tenseness = 0.36f,
ConstrictionDiameter = 0.52f,
Turbulence = 0.75f,
Burst = 1.0f
Intensity = 0.34f,
Tenseness = 0.3f,
ConstrictionDiameter = 1.22f,
Turbulence = 0.9f,
LipOpening = 1.25f,
Burst = 1.55f
};
private static readonly PinkTromboneFixtureControls L = E with
{
Frequency = 144,
TongueIndex = 28,
TongueDiameter = 1.2f,
ConstrictionIndex = 30,
ConstrictionDiameter = 0.85f,
Frequency = 136,
Tenseness = 0.5f,
TongueIndex = 29,
TongueDiameter = 0.9f,
ConstrictionIndex = 30.5f,
ConstrictionDiameter = 0.62f,
Turbulence = 0.02f,
LipOpening = 1.25f
LipOpening = 1.05f
};
private static readonly PinkTromboneFixtureControls KClosure = A with
@ -129,22 +132,23 @@ public static class PinkTromboneUtteranceFixtures
private static readonly PinkTromboneFixtureControls KRelease = KClosure with
{
Intensity = 0.26f,
ConstrictionDiameter = 0.62f,
Turbulence = 0.58f,
Burst = 1.0f
ConstrictionDiameter = 1.12f,
Turbulence = 0.72f,
Burst = 1.45f
};
private static readonly PinkTromboneFixtureControls Th = A with
{
Frequency = 118,
Intensity = 0.18f,
Tenseness = 0.2f,
TongueIndex = 31,
TongueDiameter = 0.72f,
ConstrictionIndex = 32,
ConstrictionDiameter = 0.32f,
Turbulence = 0.86f,
LipOpening = 1.05f
Intensity = 0.03f,
Tenseness = 0.14f,
TongueIndex = 30,
TongueDiameter = 0.95f,
ConstrictionIndex = 31.5f,
ConstrictionDiameter = 0.48f,
Turbulence = 0.62f,
LipOpening = 1.0f,
Gain = 0.58f
};
private static readonly PinkTromboneFixtureControls R = O with
@ -161,16 +165,18 @@ public static class PinkTromboneUtteranceFixtures
private static readonly PinkTromboneFixtureControls BClosure = M with
{
Velum = 0.01f,
Intensity = 0.2f,
Burst = 0.85f
Intensity = 0.08f,
LipOpening = 0.08f,
Burst = 1.25f
};
private static readonly PinkTromboneFixtureControls BRelease = BClosure with
{
Intensity = 0.58f,
ConstrictionDiameter = 0.62f,
Turbulence = 0.35f,
Burst = 0.9f
Intensity = 0.5f,
ConstrictionDiameter = 1.18f,
LipOpening = 1.2f,
Turbulence = 0.45f,
Burst = 1.35f
};
private static readonly PinkTromboneFixtureControls S = I with
@ -207,13 +213,16 @@ public static class PinkTromboneUtteranceFixtures
1.02f,
Points(
(0.00f, PClosure, "p closure"),
(0.12f, PClosure, "p pressure"),
(0.16f, PRelease, "p release"),
(0.145f, PClosure, "p pressure"),
(0.157f, PRelease, "p release"),
(0.19f, PRelease, "p burst tail"),
(0.25f, A, "a"),
(0.45f, A, "a hold"),
(0.52f, PClosure, "p closure"),
(0.64f, PRelease, "p release"),
(0.73f, A with { Frequency = 142 }, "a"),
(0.645f, PClosure, "p pressure"),
(0.657f, PRelease, "p release"),
(0.69f, PRelease, "p burst tail"),
(0.74f, A with { Frequency = 142 }, "a"),
(1.02f, A with { Intensity = 0.46f }, "fade")),
["p", "a", "p", "a"]),
new(
@ -221,14 +230,17 @@ public static class PinkTromboneUtteranceFixtures
"lulek",
1.22f,
Points(
(0.00f, L, "l"),
(0.13f, U, "u"),
(0.39f, U, "u hold"),
(0.48f, L with { Frequency = 148 }, "l"),
(0.00f, L, "l onset"),
(0.07f, L, "l hold"),
(0.11f, U, "u"),
(0.40f, U, "u hold"),
(0.47f, L with { Frequency = 142 }, "l"),
(0.55f, L with { Frequency = 142 }, "l hold"),
(0.61f, E, "e"),
(0.86f, E, "e hold"),
(0.95f, KClosure, "k closure"),
(1.07f, KRelease, "k release"),
(1.055f, KClosure, "k pressure"),
(1.067f, KRelease, "k release"),
(1.22f, KRelease with { Intensity = 0.02f, Turbulence = 0.12f }, "stop")),
["l", "u", "l", "e", "k"]),
new(
@ -237,14 +249,15 @@ public static class PinkTromboneUtteranceFixtures
1.72f,
Points(
(0.00f, Th, "th"),
(0.17f, Th, "th hold"),
(0.25f, R, "r"),
(0.39f, O, "o"),
(0.12f, Th, "th hold"),
(0.19f, R with { Frequency = 124 }, "r"),
(0.34f, O, "o"),
(0.59f, O, "o hold"),
(0.68f, M, "m"),
(0.82f, M, "m hold"),
(0.90f, BClosure, "b closure"),
(0.98f, BRelease, "b release"),
(0.975f, BClosure, "b pressure"),
(0.987f, BRelease, "b release"),
(1.07f, O with { Frequency = 140 }, "o"),
(1.25f, S, "s"),
(1.42f, I, "i"),

View file

@ -160,3 +160,4 @@
{"timestamp":"2026-05-26T21:38:50+01:00","topic":"pink-trombone-graph-nasal-level-balance","claim":"The graph tract nasal path no longer reuses velum as both branch valve and nostril aperture. Generated tract graphs now square velum at the nasal branch entrance, keep nostril radiation independent, and use a lower graph radiation gain so corrected topology does not drive the patch into soft clipping. Playground Ma is now level-matched with Open instead of overdriven.","evidence":"PT log-mel graph run passed with open cosine 0.6219 RMS 0.9743, front 0.6407 RMS 1.0024, nasal 0.5375 RMS 1.1476, new bilabial-nasal-ma 0.4743 RMS 1.2206, sibilant 0.3233 RMS 1.0008, closure 0.0817 RMS 1.5534. Live renderer smoke after lowering patch gain reported Open peak/RMS 0.498/0.257 and Ma 0.480/0.243."}
{"timestamp":"2026-05-26T21:52:30+01:00","topic":"pink-trombone-time-varying-utterance-reference-fixtures","claim":"AquaSynth now has explicit time-varying Pink Trombone reference utterance fixtures for mama, papa, lulek, and thrombosis. The PT renderer can interpolate timestamped control points sample-by-sample and write reference WAVs plus control CSVs before Aqua parity golf begins.","evidence":"Focused test PinkTromboneUtteranceFixturesWriteReferenceWavs passed and wrote artifacts/parity/pink-trombone-utterances/20260526T205230009. PT reference summaries: mama peak/RMS 0.7033/0.4213, papa 0.7012/0.3618, lulek 0.7200/0.4087, thrombosis 0.7600/0.4658."}
{"evidence":"Pinned external/pink-trombone-mod at 359c2d3b42b10280404c1650dc601902112b4c90; focused dotnet test passed and wrote artifacts/parity/pink-trombone-utterances/20260526T211902375 with mama/papa/lulek/thrombosis reference WAVs.","claim":"The previous Pink Trombone reference renderer was invalid as a parity oracle because it hand-rolled PT-shaped DSP instead of porting the source graph. The renderer now ports the pinned MIT chdh/pink-trombone-mod DSP source: LF glottis, filtered noise, 512-sample block updates, 2x tract stepping, 44 oral/28 nasal waveguide cells, nasal junction, target-diameter slew, touch-style constriction, frication, and obstruction release transients. Earlier utterance WAVs are invalid for parity golf.","timestamp":"2026-05-26T22:20:18+01:00","topic":"pink-trombone-reference-renderer-authority"}
{"evidence":"Focused dotnet test passed and wrote artifacts/parity/pink-trombone-utterances/20260526T212732321. Summary peaks/RMS: mama 0.1745/0.0420, papa 0.2061/0.0423, lulek 0.1283/0.0188, thrombosis 0.1704/0.0248.","claim":"First listening-driven PT utterance control correction after source-porting the renderer: plosive controls now use abrupt closure/release timing, burst strength is wired into obstruction transients, lulek uses a tighter darker u and shorter lateral gestures, and thrombosis has a quieter less chirpy th onset.","timestamp":"2026-05-26T22:27:53+01:00","topic":"pink-trombone-utterance-control-curve-correction"}