Add IPA vocal tract roadmap

This commit is contained in:
Meta Vens 2026-05-19 12:58:03 +01:00
commit 5f305007ad
5 changed files with 460 additions and 1 deletions

View file

@ -0,0 +1,426 @@
# IPA Vocal Tract Roadmap
AquaSynth can get close to a Pink Trombone-class tract model, then move past it
by treating IPA as an authoring input rather than the synth itself. The machine
we want is not a giant table from symbol to sound. It is a pipeline:
```text
IPA text
-> phonetic tokens
-> language phonology profile
-> timed articulatory gesture plan
-> morphology-specific tract and excitation curves
-> Faust DSP
-> rendered speech, song, chant, and nonhuman vocalization
```
The target user feeds Weksa text as IPA or IPA-like phonetic strings. AquaSynth
keeps the real authority below that surface: phonetic features, gestures,
anatomy, excitation, and acoustic simulation.
## Objective
Build a research-grounded vocal-tract instrument for human and alien speech:
- parse IPA into structured phonetic intent;
- lower phonetic intent through a language profile into articulatory gestures;
- render those gestures through human and nonhuman tract morphologies;
- keep coarticulation continuous rather than stepping between phoneme presets;
- make every layer testable with mocks, fixtures, and deterministic outputs;
- grow supported IPA exponentially as the tract model earns new physics.
The Weksa goal is conlang speech rendering for Zyphos worldbuilding. IPA gives
authors a familiar entry point. The tract model gives us the power to make Weksa
sound like Weksa instead of like English wearing ceremonial markup.
## Research Spine
The first implementation should stand on old, durable work:
- Kelly-Lochbaum / digital waveguide vocal tract models simulate 1D wave
propagation through connected tube sections using reflection coefficients.
This is the practical spine behind Pink Trombone-like realtime tract synthesis.
- Pink Trombone demonstrates that a simplified tract, glottis, turbulence, oral
cavity, and nasal coupling can produce interactive intelligible speech-like
sound in realtime.
- Liljencrants-Fant-style glottal source models give a better voiced excitation
than a naive sawtooth or pulse train, and can parameterize voice quality.
- Articulatory phonology and task dynamics provide the right control model:
phonetic units become overlapping gestures, not isolated frames.
- Vocal-tract area-function work is the middle layer between anatomy and DSP:
vowels and constrictions can be expressed as cross-sectional area over tract
distance before being lowered to reflection coefficients.
- IPA feature databases and phoneme-table implementations are reference
material for metadata, not authorities over the sound. They help keep the
parser and feature mapper honest while the gesture and morphology layers own
synthesis.
- Source-filter speech theory still matters, but this lane should not collapse
back into static formant filters. Formants are useful diagnostics; tract shape
is the synthesis authority.
Useful starting sources:
- Pink Trombone / Neil Thapen interactive tract model:
<https://dood.al/pinktrombone/>
- Pink Trombone overview at IMAGINARY:
<https://www.imaginary.org/program/pink-trombone>
- Recent Pink Trombone optimization paper describing PT as a realtime
Kelly-Lochbaum tract model:
<https://link.springer.com/article/10.1186/s13636-025-00414-5>
- Story 2005 vocal-tract area-function model:
<https://bpb-us-e2.wpmucdn.com/sites.arizona.edu/dist/f/80/files/2023/10/story_jasa2005-1.pdf>
- Kelly-Lochbaum / time-domain articulatory synthesis summary:
<https://www.isca-archive.org/eurospeech_1989/owens89b_eurospeech.html>
- Waveguide vocal tract acoustics:
<https://eprints.whiterose.ac.uk/id/eprint/3713/>
- Voice source model comparison including LF:
<https://pmc.ncbi.nlm.nih.gov/articles/PMC4491021/>
- LF model fitting for speech synthesis:
<https://www.cs.cmu.edu/~awb/papers/is2013/is2013_lfmodel.pdf>
- Haskins TADA gestural planning model:
<https://www.haskinslaboratories.org/tada>
- PanPhon IPA feature vectors:
<https://pypi.org/project/panphon/>
- PHOIBLE phoneme inventories and distinctive features:
<https://phoible.org/>
- eSpeak NG phoneme-table implementation reference:
<https://deepwiki.com/espeak-ng/espeak-ng/4.2-phoneme-model>
## Architecture
### 1. IPA Parser
Owns Unicode IPA tokenization and notation, not sound.
Inputs:
- IPA string;
- optional language tag;
- optional inline stress, length, tone, syllable, and boundary marks.
Outputs:
- ordered `PhoneticToken` records;
- diacritic attachments;
- suprasegmental marks;
- source spans for diagnostics.
The parser should be table-driven and deterministic. It should reject unknown
clusters with useful diagnostics instead of guessing heroically and making a new
little bureaucracy out of Unicode.
### 2. Phonetic Feature Mapper
Owns IPA-to-feature interpretation.
Examples:
- `/p/` -> voiceless bilabial stop;
- `/ɬ/` -> voiceless alveolar lateral fricative;
- `/qʼ/` -> uvular ejective stop;
- `/aː/` -> long open vowel, front/central depending on profile defaults.
Outputs:
- `PhoneticSegment` with manner, place, voicing, airstream, length, stress,
vowel height/backness/rounding, and diacritics.
This layer should support language profiles. IPA has broad and narrow uses, and
Weksa may assign phonemic categories to articulatory targets that are only
human-adjacent. PanPhon, PHOIBLE, and eSpeak NG are useful references for feature
schemas and inventory sanity checks, but AquaSynth should own its feature record
instead of importing a third-party schema as the permanent internal model.
### 3. Gesture Planner
Owns time and coarticulation.
Inputs:
- phonetic segments;
- language timing profile;
- prosody vector;
- speaking style;
- morphology capability map.
Outputs:
- overlapping gestures for tract constriction, tongue body, tongue tip, lips,
velum, glottis, pressure, turbulence, burst release, and auxiliary organs.
This is where consonants and vowels smear into each other. Stops close before
their release. Vowels pull neighboring consonants. Fricatives hold a narrow
constriction and noise source. Nasals open a branch. Ejectives and clicks become
pressure/airstream events rather than cute punctuation.
The gesture planner should resemble a small task-dynamics compiler: phone
features become overlapping constriction tasks and source events. It should not
linearly interpolate phone presets unless a test proves that shortcut works for
the current stage.
### 4. Morphology Model
Owns anatomy.
Human baseline:
- tract length;
- section count;
- palate/tongue mapping;
- lip opening/protrusion;
- velum and nasal branch;
- one glottal source;
- oral tract radiation.
Alien/Weksa extensions:
- longer or shorter tract families;
- asymmetric or split oral branches;
- additional resonant sacs;
- secondary glottal or membrane exciters;
- nonhuman nasal/side-channel coupling;
- constrained articulator ranges by species or caste;
- morphology-specific mappings from human IPA-like features to physical organs.
IPA does not get to own alien anatomy. IPA names intent; morphology realizes it.
### 5. Tract DSP
Owns sound.
First spine:
- 1D Kelly-Lochbaum-style tube sections;
- reflection coefficients from section area;
- glottal excitation at the source;
- lip radiation;
- nasal branch switch/coupling;
- turbulence injection at constriction points;
- closure and burst primitives for stops.
Use area functions as the stable middle representation: a morphology and gesture
plan produce tract-area curves over time; the DSP compiler turns those curves
into reflection coefficients, source injection points, and coupling events.
Later spine:
- losses and dispersion;
- lip/larynx impedance refinements;
- side branches and sacs;
- multiple sources;
- differentiable or search-assisted parameter fitting for vowel targets;
- morphologies that are not merely scaled human throats.
Generated Faust should remain boring enough to inspect. If tract DSP becomes
large, generate a specialized Faust module from a typed tract plan instead of
stuffing a hundred magic controls into ordinary `voice`.
## Supported IPA Roadmap
Do not support all IPA first. That is the trap where the parser looks mighty and
the synth says five ugly vowels. Expand by doubling the useful surface each time
the physical model earns another category.
### Stage 0: Token Spine
Goal: lossless-enough IPA tokenization and diagnostics.
Support:
- whitespace and word boundaries;
- `/.../` and `[...]` wrappers;
- primary and secondary stress;
- length marks `ː` and `ˑ`;
- common tie mark for affricates;
- combining diacritic storage without full interpretation.
Tests:
- round-trip token spans;
- unknown-symbol diagnostics;
- diacritic attachment fixtures.
### Stage 1: Vowels And Simple Voice
Goal: intelligible sustained vowel targets through a human tract.
Support:
- monophthong vowels: `i y ɨ ʉ ɯ u ɪ ʏ ʊ e ø ɘ ɵ ɤ o ə ɛ œ ɜ ɞ ʌ ɔ æ ɐ a ɶ ɑ ɒ`;
- length and stress as duration/prosody modifiers;
- modal voiced glottal source;
- simple pitch, intensity, and breathiness controls.
Machine growth:
- vowel feature space;
- tract area targets informed by area-function references;
- glottal source model;
- vowel fixture renderer.
Validation:
- check approximate formant regions for `/i e a o u ə/`;
- compare tract-area curves against known vowel-shape expectations;
- keep listening fixtures because a formant table can still lie with confidence.
### Stage 2: Core Pulmonic Consonants
Goal: CV, VC, and CVC syllables with recognizably different places and manners.
Support:
- stops: `p b t d k g ʔ`;
- nasals: `m n ŋ`;
- fricatives: `f v s z ʃ ʒ h`;
- approximants: `w j l ɹ`;
- basic aspiration `ʰ`;
- syllable and word timing.
Machine growth:
- closure/release events;
- plosive burst noise;
- fricative turbulence source;
- nasal branch;
- simple coarticulation curves.
Validation:
- verify voice onset timing for stops;
- verify burst timing and broad noise bands;
- verify nasal/oral contrast;
- reject fricative support that is only a filtered noise preset with no
constriction/source location.
### Stage 3: Expanded Human IPA
Goal: useful conlang coverage without pretending to be a universal phonetician.
Support:
- places: dental, alveolar, postalveolar, retroflex, palatal, velar, uvular,
pharyngeal, glottal;
- manners: trills, taps/flaps, lateral fricatives, lateral approximants,
affricates;
- symbols: `θ ð ɕ ʑ ç ʝ x ɣ χ ʁ ħ ʕ ɸ β ʂ ʐ ɲ ɳ ɴ ɾ r ʀ ɭ ʎ ʟ ɰ`;
- affricate tie sequences such as `t͡s`, `d͡ʒ`, `t͡ɬ`;
- voiceless/voiced and dentalized/palatalized/labialized/velarized diacritics
where they map to real gestures.
Machine growth:
- tongue tip/body split;
- lateral constriction;
- trill/tap event generators;
- profile-specific place maps.
This is the point where a language profile starts earning its keep. The same IPA
symbol may need different timing, place bias, or allophonic behavior by language;
that belongs in the profile, not in the global token parser.
### Stage 4: Airstream And Phonation
Goal: Weksa can use sounds that feel physically intentional instead of being
ornamental apostrophes.
Support:
- ejectives: `ʼ`;
- implosives: `ɓ ɗ ʄ ɠ ʛ`;
- clicks: `ʘ ǀ ǃ ǂ ǁ`;
- breathy, creaky, slack/stiff voice diacritics;
- voiceless vowels and sonorants;
- tone marks if Weksa needs lexical or prosodic tone.
Machine growth:
- pressure reservoirs;
- glottal closure timing;
- ingressive/egressive event modeling;
- richer glottal source parameterization;
- non-pulmonic test fixtures.
### Stage 5: Weksa And Alien Morphologies
Goal: IPA can drive nonhuman vocal anatomy without reducing aliens to exotic
human accents.
Support:
- morphology profiles with declared organ inventory;
- feature remapping per morphology;
- unsupported-feature diagnostics that explain the missing organ or gesture;
- dual-source phonation;
- resonant sacs and side branches;
- nonhuman lateral or split-tract continuants;
- authored Weksa phoneme inventories and allophones.
Machine growth:
- morphology capability negotiation;
- tract graph beyond a single tube plus nasal branch;
- multi-source DSP;
- Weksa fixture corpus;
- Zyphos scene hooks for speaker, body, place, and emotional pressure.
## Testing And Mocking
The implementation should be built as a set of injectable services:
- `IIpaTokenizer`
- `IPhoneticFeatureMapper`
- `IPhonologyProfile`
- `IGesturePlanner`
- `ITractMorphology`
- `ITractPlanCompiler`
- `ITractFaustEmitter`
- `IAudioRenderer`
- `IReferenceFixtureStore`
Mock seams are not ceremony here. They protect the machine:
- tokenizer tests do not need DSP;
- feature tests do not need coarticulation;
- gesture tests can snapshot control curves;
- morphology tests can assert capabilities and remaps;
- Faust emitter tests can verify generated structure without rendering;
- renderer tests can compare short deterministic buffers;
- Weksa profile tests can prove unsupported IPA fails clearly.
Golden fixtures:
- IPA tokenization fixtures;
- feature bundle fixtures;
- gesture-plan JSON fixtures;
- tract-area curve fixtures;
- rendered vowel and CVC WAV artifacts;
- Weksa phrase fixtures once the language profile exists.
Metrics:
- formant target distance for vowels;
- envelope and burst timing for stops;
- noise-band distance for fricatives;
- nasal/oral spectral contrast;
- intelligibility/listening notes for complete syllables;
- script/IPA terseness only after audio is credible.
## First Work Packets
1. Add `docs/ipa-vocal-tract-roadmap.md` and preserve the boundary doctrine.
2. Add an IPA tokenizer and feature model with Stage 0/1 fixture tests.
3. Add a human baseline vowel planner that emits tract-area targets, not audio.
4. Add a tiny tract renderer prototype in AquaSynth.Faust or a test-only lab
lane, then decide the package boundary once the prototype proves itself.
5. Render five vowels and three CVC syllables through fixtures.
6. Add the first Weksa phonology profile with explicit unsupported-feature
diagnostics.
7. Only then add Stage 2 consonant synthesis to the shipping path.
## Non-Goals
- Full CFD, finite-element airflow, or anatomical medical simulation.
- A black-box neural TTS voice that hides anatomy and cannot explain itself.
- A complete IPA parser before the tract can render basic syllables.
- Alien sounds as random effects. Nonhuman output needs morphology, not glitter.

View file

@ -51,6 +51,29 @@ missing graph feature instead of smuggling it through unrelated parameters.
## Target Families
### New Lane: IPA Vocal Tract / Weksa
This is not merely another reference synth. It is a new authoring and rendering
lane: IPA text lowers into phonetic features, timed articulatory gestures,
morphology-specific tract/excitation curves, and Faust DSP. The roadmap lives in
[`docs/ipa-vocal-tract-roadmap.md`](ipa-vocal-tract-roadmap.md).
Pressure on AquaSynth DSL:
- IPA as an input surface, not an internal patch model.
- Phonology profiles separated from tract morphology.
- Gesture planning and coarticulation before audio rendering.
- Human and alien vocal anatomies driven by the same structured phonetic intent.
- Mockable tokenizer, feature mapper, gesture planner, morphology, emitter, and
renderer seams.
First deliverable:
- Stage 0/1 IPA tokenization and vowel feature fixtures.
- Human baseline vowel tract-area planner.
- A small render proof that can say a few vowels before the supported IPA table
expands.
### Tier 1: DX7/Dexed
Use this first. DX7 SysEx is compact, structured, and musically meaningful:

View file

@ -104,3 +104,4 @@
{"date":"2026-05-17","topic":"zyn-formant-parity-fixtures","lesson":"The first formant-motion parity workout needs multiple multi-frame ADD/formant fixtures and a real Zyn ADD note oracle. Avoid letting drum-kit envelope/source failures masquerade as formant evidence. Use Wide Bass, Ghost Ensemble, and Ghost Choir as the initial chorus; all currently fail enough to be useful.","evidence":"Added test-only `tools/zyn-reference/ZynVoiceReference.cpp`, wired it into the MSYS reference build, and added `ZynVoiceReferenceRendererSurveysUpstreamFormantFixturesWhenBuilt`. The batch writes ignored artifacts under `artifacts/parity/zyn-upstream-formant-fixtures/`; baseline scores were Wide Bass 0.280990, Ghost Ensemble 0.312813, Ghost Choir 0.363644. The native Zyn reference build succeeded and the focused formant fixture test passed."}
{"date":"2026-05-19","evidence":"Added docs/ipa-vocal-tract-roadmap.md with staged IPA support from tokenization/vowels through pulmonic consonants, expanded IPA, airstream/phonation, and Weksa alien morphologies; linked it from docs/reference-synth-roadmap.md and state.","lesson":"AquaSynth should treat IPA as an authoring input for phonetic intent, not as the internal synth model. The planned machine is tokenizer -\u003e feature mapper -\u003e phonology profile -\u003e gesture planner -\u003e morphology -\u003e tract plan -\u003e Faust renderer, growing supported IPA only as tract/excitation physics earn each category.","topic":"ipa-vocal-tract-roadmap"}

View file

@ -16,6 +16,7 @@ surfaces:
patch_library: patches
tests: tests/AquaSynth.Dsl.Tests
reference_roadmap: docs/reference-synth-roadmap.md
ipa_vocal_tract_roadmap: docs/ipa-vocal-tract-roadmap.md
faust_toolchain_boundary: docs/faust-toolchain-boundary.md
dx7_public_domain_fixtures: tests/AquaSynth.Dsl.Tests/Fixtures/Dx7/PublicDomain
zyn_reference_source: external/zynaddsubfx
@ -36,6 +37,7 @@ modules:
dx7_reference_render_tests: tests/AquaSynth.Dsl.Tests/Dx7ReferenceParityTests.cs
zyn_reference_reader: src/AquaSynth.Core/ZynInstrument.cs
zyn_coverage_survey: src/AquaSynth.Core/ZynInstrument.cs
ipa_vocal_tract_roadmap: docs/ipa-vocal-tract-roadmap.md
package_boundary_tests: tests/AquaSynth.Dsl.Tests/PackageBoundaryTests.cs
sfxr: src/AquaSynth.Core/SfxrParams.cs
analysis: src/AquaSynth.Core/AudioAnalysis.cs
@ -57,6 +59,7 @@ boundaries:
- Faust source generation in AquaSynth.Core
- target-code generation, compile-product contracts, dynamic patch compilation policy, cache identity, generated artifact manifests, and Faust toolchain selection in AquaSynth.Faust
- live patch compilation, native Faust factory lifetime, and offline sample-buffer render proof in AquaSynth.Faust
- IPA-to-phonetic-feature planning, articulatory gesture planning, and human/alien vocal-tract roadmap design
dev_only:
- public-domain DX7 SysEx fixtures
- pinned GPL ZynAddSubFX source for parity tests

View file

@ -79,10 +79,16 @@
"ZynAddSubFX instruments for additive, subtractive, PAD, formant, and layered patches",
"Faust examples/libraries for general DSP graph topology",
"Surge XT for modern hybrid synth modulation",
"Cardinal/VCV-style patches for modular cable/rate semantics"
"Cardinal/VCV-style patches for modular cable/rate semantics",
"IPA/Weksa vocal tract synthesis for phonetic gesture planning, human and alien tract morphologies, and conlang speech rendering"
],
"rule": "Add DSL abstractions only when reference rebuilds prove the missing invariant. Do not consume references that cannot be backed by parity tests; parsing alone is inventory, not evidence of expressivity."
},
"ipa_vocal_tract_path": {
"status": "Roadmap drafted for an IPA-to-vocal-tract lane. IPA is an authoring input only: tokenization and feature mapping lower into language phonology profiles, timed articulatory gestures, morphology-specific tract/excitation curves, and Faust DSP. The staged support plan starts with tokenization and vowels, then core pulmonic consonants, expanded human IPA, airstream/phonation, and Weksa/alien morphologies.",
"lesson": "Do not build a complete IPA parser before the tract can say basic syllables. The durable machine is tokenizer -> feature mapper -> phonology profile -> gesture planner -> morphology -> tract plan -> Faust renderer, with dependency-injected seams and mocks at each boundary. Weksa should use IPA-like phonetic input without letting human IPA semantics own alien anatomy.",
"next": "Implement Stage 0/1 fixtures: IPA token spans, vowel feature bundles, human baseline vowel tract-area targets, and a tiny render proof before expanding consonants."
},
"dx7_reference_path": {
"status": "DX7 SysEx parser extracts voice edit buffers, packed voices, packed 32-voice banks, six operators, envelopes, algorithm, feedback, oscillator sync, LFO, transpose, voice name, checksum validation, ReferencePatch features, algorithm topology from the reverse-engineered OPS algorithm ROM table, envelope-to-ADSR approximations, measured carrier output amplitude, isolated two-op modulation route scale, summed/cascaded route scale, calibrated feedback amount table, ratio detune lowering, voice transpose lowering, fixed-frequency operator lowering, ROM COM output compensation cut, operator key/rate scaling at the effective played note, topology-aware route lowering, staged operator envelopes with per-segment curves, raw and block-interpolated DX7 envelope tracing, applied-envelope curved lowering with optional sustain floor, two AquaSynth DSL rebuild attempts, first-class OperatorGraph support with graph-level vibrato, public-domain SysEx fixture coverage, dexed-py reference rendering, project-authored Dexed patch rendering, AquaSynth candidate rendering through Faust-generated C#, one thresholded rendered parity test for analog1.syx voice 13, a hard PRC SYNTH1 parity probe with listening WAV artifacts and log-mel <= 0.145, project-authored algorithm-8 summed-stack/cascade/summed-pair parity, rendered community parity for Mooger, Piano Bass, RES SYNTH1, and ANLGSYN 1 with a sustained high-band gate, a MELLOWSOLO pressure artifact test, and renderable delayed operator feedback.",
"lesson": "Algorithm 32's additive six-carrier shape maps cleanly to six AquaSynth voices. Algorithm 8 justified OperatorGraph: operators, modulation edges, carriers, feedback, and graph-level pitch motion belong to a graph authority, not Voice fields. The first rendered parity rung is behavioral and sine-like, not exact DX7 operator execution. A harder algorithm-8 target exposed that feedback must be delayed recursion in Faust, not a direct cyclic self-reference. Static DX7 output-level approximation helped import/rebuild math but was mathematically wrong for carrier amplitude. A single-carrier Dexed sweep shows carrier amplitude follows 2^((outputLevel - 99) / 8). Isolated two-op DX7 FM maps full-level modulation to AquaSynth route index 6.275; summed/cascaded algorithm-8 branches now use 6.0 after PRC listening, a project-authored combined stack probe, and split cascade/summed-pair probes showed lower values were under-bright. Feedback lowers through a fitted table instead of PRC-local constants; ANLGSYN 1 showed max feedback value 7 needs a hotter AquaSynth amount 2.2 to recover buzzy high bands, while value 5 remains 0.19 for PRC. ANLGSYN 1 then exposed a sustained-buzz gap: output soft clip helped but did not stop mid-note drift; max-feedback source operators need an applied-envelope sustain floor so the feedback loop stays driven after the attack. ANLGSYN 1's remaining beat is pitch LFO: AMD is nonzero but all operator AMS values are 0, while PMD/PMS lower cleanly to operator-graph vibrato with faded delay. Ratio-mode detune belongs in operator frequency lowering. DX7 voice transpose belongs in graph base frequency: transpose 24 is neutral, transpose 12 lowers MIDI note 60 to 130.8128 Hz. DX7 fixed-frequency operators are absolute Hz, not note ratios; ANLGSYN 1 proved fixed op1/op3 must lower to ratios around 0.007615/0.009227 against a 130.8128 Hz graph base to preserve low buzzing modulation. ROM COM carrier compensation was cut: user listening found no-COM renders harmonically closer and mainly too quiet, so `OperatorOutputCompensation` returns unity and graph gain owns loudness recovery. Operator key-scaling and rate-scaling must lower against the effective played MIDI note after transpose; hardcoded MIDI 60 made RES SYNTH1 too soft on attack and Piano Bass less harmonically accurate. Project-authored Dexed patch rendering now gives lawful calibration targets. Reusing the operator output curve for EG levels was tested and cut because it failed hard-target log-mel; later output-level-dependent and naive traced-release applied-envelope experiments were also cut because they worsened broader parity. Direct envelope tracing shows current linear `env=rl` cannot express DX7 EG spike/drop behavior. Dexed-style audio samples EG once per 64-sample block and interpolates applied gain, so raw EG parity alone is not audio parity. Staged operator envelopes now support linear/exponential segments and supranormal levels. `ApproximateAppliedRateLevelEnvelope` uses that surface and now picks the first near-peak before gate so slower rising modulators hit early instead of swelling late; it can also preserve a floor for max-feedback source sustain. Community gains with no COM and played-note scaling: Mooger 0.75, Piano Bass 0.72, RES SYNTH1 0.75. Algorithm-2 non-carrier applied envelopes currently cap the first peak at 0.92 to prevent ANLGSYN 1/RES SYNTH1 peak blowout while preserving Piano Bass. MELLOWSOLO is a pressure artifact test, not passing parity; its render window is 1.25s so the candidate release is audible instead of cut at the artifact boundary. Mooger needs a more aggressive attack contour, and RES SYNTH1's phase-like attack issue is likely relative operator attack/peak shape because oscillator sync is enabled. PRC remains passing on log-mel/envelope/RMS, with score floor lowered to 0.74 after rate scaling changed the aggregate score.",