Extend DX7 MellowSolo tail artifact
This commit is contained in:
parent
80bca4f48e
commit
64a326fa4f
6 changed files with 43 additions and 7 deletions
|
|
@ -157,9 +157,10 @@ math is still fake in the places that matter perceptually.
|
|||
- `DX1 LEAD B` and `MELLOWSOLO` also sounded harmonically closer with COM
|
||||
disabled and graph gain restored, but they still fail the current numeric
|
||||
parity gates. `MELLOWSOLO` now has a pressure artifact test that writes
|
||||
listening WAVs without claiming parity. Keep them as pressure for branch
|
||||
emphasis, envelope detail, and LFO/operator attack behavior, not as
|
||||
passing stock.
|
||||
listening WAVs without claiming parity. Its pressure render is `1.25s`
|
||||
so the candidate release is not cut off at the artifact boundary. Keep
|
||||
these voices as pressure for branch emphasis, envelope detail, and
|
||||
LFO/operator attack behavior, not as passing stock.
|
||||
|
||||
## Rejected Path
|
||||
|
||||
|
|
@ -169,3 +170,7 @@ is the exam, not the textbook.
|
|||
Do not lower the summed route scale merely because a patch has three sources in
|
||||
one summed branch. A `5.25`/`5.75` fan-in route experiment made `{ Mooger }`
|
||||
less coherent by metric and did not isolate the overtone-emphasis problem.
|
||||
|
||||
Do not replace the applied-envelope release with a naive traced threshold
|
||||
duration. That experiment shortened releases too aggressively and broke PRC,
|
||||
`Piano Bass`, `RES SYNTH1`, and `ANLGSYN 1`.
|
||||
|
|
|
|||
|
|
@ -55,3 +55,4 @@
|
|||
{"kind":"dx7_com_compensation_cut","lesson":"ROM COM carrier compensation was louder but harmonically wrong for the analog1 community pass. User listening preferred the no-COM renders across patches; the real issue was that they were too quiet. Cut hidden per-carrier COM boosts: `OperatorOutputCompensation` returns unity and graph gain owns loudness recovery. Passing community gains with no COM are Mooger 0.75, Piano Bass 0.90, RES SYNTH1 0.75. DX1 LEAD B and MELLOWSOLO sound closer by ear with no COM but remain numeric pressure targets.","source":"community DX7 listening correction on 2026-05-14"}
|
||||
{"kind":"dx7_effective_note_scaling","lesson":"DX7 operator key-scaling and rate-scaling must lower against the effective played MIDI note after voice transpose, not hardcoded MIDI 60. `Dx7SysEx.OperatorRateScaling` now feeds the block-interpolated applied envelope trace, and imported operator levels use the effective note. This improves RES SYNTH1 attack/log-mel and Piano Bass harmonic metrics; Piano Bass graph gain rebalances from 0.90 to 0.72. MELLOWSOLO remains the clearest harmonic mismatch and now has a pressure artifact test rather than a fake parity pass. A trial output-level-dependent applied-envelope trace was cut because it worsened MELLOWSOLO and ANLGSYN 1.","source":"community DX7 listening correction on 2026-05-14"}
|
||||
{"kind":"dx7_modulator_peak_headroom","lesson":"Listening found ANLGSYN 1 and RES SYNTH1 blowing out into a drone at the modulator-envelope peak while Piano Bass was spot on. The surviving DX7 probe change caps only algorithm-2 non-carrier applied-envelope Level1 at 0.92, preserving Piano Bass and improving RES SYNTH1 while keeping ANLGSYN judged by log-mel and sustained high-band evidence rather than aggregate score. A wider summed-route headroom experiment for Mooger fan-in was tested and cut because it worsened Mooger metrics and did not isolate the overtone-emphasis issue.","source":"community DX7 listening correction on 2026-05-14"}
|
||||
{"kind":"dx7_mellowsolo_tail_window","lesson":"MELLOWSOLO pressure artifacts need a longer render window than 1.0s because the Aquarium candidate emits a 0.6s release from a 0.65s gate, so the old WAV cut the tail before it could finish. Extending only the MELLOWSOLO pressure render to 1.25s improves log-mel from about 0.429 to 0.347 and makes the tail audible without changing the synth lowering or passing parity targets. A global traced-release-duration experiment was tested and cut because it shortened releases too aggressively and broke PRC, Piano Bass, RES SYNTH1, and ANLGSYN 1. RES SYNTH1 has oscillator sync enabled, so its phase-like attack issue is more likely relative operator attack/peak shape than free-running oscillator phase.","source":"community DX7 listening correction on 2026-05-14"}
|
||||
|
|
|
|||
|
|
@ -76,7 +76,7 @@
|
|||
},
|
||||
"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 Aquarium DSL rebuild attempts, first-class OperatorGraph support, public-domain SysEx fixture coverage, dexed-py reference rendering, project-authored Dexed patch rendering, Aquarium 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 Aquarium voices. Algorithm 8 justified OperatorGraph: operators, modulation edges, carriers, and feedback 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 Aquarium 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 Aquarium 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. 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; a later output-level-dependent applied-envelope trace was also cut because it worsened MELLOWSOLO and ANLGSYN 1. 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. Mooger's overtone-emphasis issue is unresolved; a wider summed-route headroom experiment was tested and cut. PRC remains passing on log-mel/envelope/RMS, with score floor lowered to 0.74 after rate scaling changed the aggregate score.",
|
||||
"lesson": "Algorithm 32's additive six-carrier shape maps cleanly to six Aquarium voices. Algorithm 8 justified OperatorGraph: operators, modulation edges, carriers, and feedback 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 Aquarium 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 Aquarium 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. 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.",
|
||||
"next": "Use the now-validated algorithm-8 route scale, transpose lowering, and fixed-frequency lowering as fixed inputs while isolating remaining community-voice timbre mismatch, then expand to broader public-domain banks."
|
||||
},
|
||||
"note_and_envelope_model": {
|
||||
|
|
@ -92,7 +92,7 @@
|
|||
},
|
||||
"last_verified": {
|
||||
"command": "AQUARIUM_DX7_PYTHON=<bundled python> dotnet test AquariumSynthCSharp.slnx --no-restore",
|
||||
"result": "focused DX7 pass: 28 passed; alg-2 modulator peak cap prevents ANLGSYN/RES peak blowout without moving Piano Bass; Mooger fan-in route experiment cut",
|
||||
"commit": "pending DX7 modulator peak headroom"
|
||||
"result": "76 passed; MELLOWSOLO pressure artifact render extended to capture release tail; global traced-release experiment cut",
|
||||
"commit": "pending DX7 mellowsolo tail artifact"
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -15,6 +15,23 @@ Doctrine update:
|
|||
|
||||
Completed this slice:
|
||||
|
||||
- Reframed the latest ear report as envelope pressure, not harmonic pressure:
|
||||
`{ Mooger }` needs a more aggressive attack contour; `MELLOWSOLO` needed a
|
||||
smoother captured tail; `RES SYNTH1` still has a phase-like attack-modulation
|
||||
issue even though oscillator sync is enabled.
|
||||
- Extended only the `MELLOWSOLO` pressure render from `1.0s` to `1.25s` so the
|
||||
existing `0.6s` release after a `0.65s` gate is not chopped by the artifact
|
||||
boundary. Latest pressure metrics improve to score `.5722256`, log-mel
|
||||
`.3472474`, RMS `.9883968`.
|
||||
- Tested and cut a global traced-release-duration change. It shortened releases
|
||||
too aggressively and broke PRC, `Piano Bass`, `RES SYNTH1`, and `ANLGSYN 1`;
|
||||
release duration remains part of the broader DX7 envelope model pressure.
|
||||
- Verified with bundled Python/dexed-py:
|
||||
`AQUARIUM_DX7_PYTHON=<bundled python> dotnet test AquariumSynthCSharp.slnx --no-restore`:
|
||||
76 passed.
|
||||
|
||||
Previous slice:
|
||||
|
||||
- Listening split the latest community set again: `Piano Bass` is currently the
|
||||
anchor and should not be disturbed; `ANLGSYN 1` and `RES SYNTH1` were blowing
|
||||
out into drone at the modulator peak; `{ Mooger }` and `MELLOWSOLO` still
|
||||
|
|
|
|||
|
|
@ -63,7 +63,9 @@ live_invariants:
|
|||
- Do not add an `env=dx7` runtime surface until it matches Dexed plugin audio with the block-interpolated gain model, not only the raw trace helper.
|
||||
- DX7 applied envelope lowering now lives in `Dx7SysEx.ApproximateAppliedRateLevelEnvelope`; it normalizes traced applied gain so operator output level remains a separate authority.
|
||||
- Current DX7 analog1 algorithm-2 lowering caps non-carrier applied-envelope Level1 at 0.92 to avoid modulator peak blowout; treat this as pressure on exact DX7 EG/output modeling, not as permission to add broad peak clamps.
|
||||
- `MELLOWSOLO` is a pressure artifact, not passing parity; its render window is 1.25s so the candidate release tail is not cut at the artifact boundary.
|
||||
- Do not reduce summed route scale merely because an edge has three sources; a Mooger fan-in route experiment worsened evidence and was cut.
|
||||
- Do not replace applied-envelope release with a naive traced threshold duration; it shortened releases too aggressively and broke broader DX7 parity.
|
||||
- Recompile only for graph shape changes; vary declared parameters through the hosted DSP control API.
|
||||
- Reference fixtures must preserve provenance, license status, source hash, and feature pressure.
|
||||
- Public-domain reference fixtures and dexed-py helpers are test/development material only; the NuGet package must ship only AquariumSynth.Dsl.
|
||||
|
|
@ -145,6 +147,17 @@ next_agent_start_here:
|
|||
- "dotnet test AquariumSynthCSharp.slnx --no-restore"
|
||||
|
||||
completed_slices:
|
||||
- date: 2026-05-14
|
||||
summary: >
|
||||
Reframed the latest community listening as envelope pressure rather than
|
||||
harmonic pressure. `{ Mooger }` needs a more aggressive attack contour;
|
||||
`RES SYNTH1` still has a phase-like attack-modulation issue even though
|
||||
oscillator sync is enabled; `MELLOWSOLO` needed its pressure artifact to
|
||||
capture the release tail. Extended only `MELLOWSOLO` from a 1.0s render
|
||||
to 1.25s, improving pressure log-mel to 0.3472474 and score to 0.5722256.
|
||||
Tested and cut a global traced-release-duration change because it broke
|
||||
PRC, `Piano Bass`, `RES SYNTH1`, and `ANLGSYN 1`.
|
||||
verification: "AQUARIUM_DX7_PYTHON=<bundled python> dotnet test AquariumSynthCSharp.slnx --no-restore: 76 passed"
|
||||
- date: 2026-05-14
|
||||
summary: >
|
||||
Added scoped modulator peak headroom after listening found `ANLGSYN 1`
|
||||
|
|
|
|||
|
|
@ -197,7 +197,7 @@ public sealed class Dx7ReferenceParityTests
|
|||
public async Task PublicDomainDx7MellowSoloWritesPressureWavsWhenInstalled()
|
||||
{
|
||||
var result = await RenderAndComparePublicDomainDx7VoiceAsync(
|
||||
new CommunityDx7VoiceCase(14, "MELLOWSOLO", 0.65f, 1.0f, 0.65f));
|
||||
new CommunityDx7VoiceCase(14, "MELLOWSOLO", 0.65f, 1.25f, 0.65f));
|
||||
|
||||
if (result is null)
|
||||
{
|
||||
|
|
|
|||
Loading…
Reference in a new issue