dings-voices v4: pin that a followed Void note ends by the next onset; correct loudness text
Test 6: after note N+1 starts, note N is under -120 dB re its peak, for every Void clip (fails with the cap reverted: invite note 0 still at -33.4 dB). Page text: the loudness target moved ~0.005 dB (min over clips, set by void/mention) and Vorbis quantisation is not linear in gain. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
parent
5e9368cd3d
commit
a85316033d
2 changed files with 6 additions and 1 deletions
|
|
@ -76,7 +76,7 @@ audio{{width:100%;min-width:10rem}}img{{max-width:100%;height:auto;width:48%}}fi
|
|||
</style></head><body>
|
||||
<header><h1>Ratatoskr dings: what changed after v3 (v4)</h1>
|
||||
<p class="notice"><strong>Nobody has heard v4.</strong> Not Meta, not Nibu, not its author. The Void diagnosis comes from spectrograms and from renders with one suspect removed; that the tick is what was heard as a double hit is a hypothesis until someone listens. Nothing plays until you press play. The clips are quiet (at most {S["maxTruePeakDbTP"]} dBTP), so start with your volume low. Not installed into Ratatoskr.</p>
|
||||
<p>Changed: Void (no tick; a note that something follows ends by the next onset) and Nibu (proposal 3 for all four events). The other six voices are the same renders as v3, sample for sample (hashes of the raw renders checked); the shared loudness target did not move ({S["targetLaeDb"]} dB in v3 and v4), so their Ogg files are fresh encodes of the same raw audio: decoded, they differ from v3's by at most 0.0028 of full scale (-51 dB), measured; the cause (encoder variance) was not investigated</p>
|
||||
<p>Changed: Void (no tick; a note that something follows ends by the next onset) and Nibu (proposal 3 for all four events). The other six voices are the same renders as v3, sample for sample (hashes of the raw renders checked); the shared loudness target is the minimum over all clips and is set by void/mention, which changed, so it moved by about 0.005 dB (both round to {S["targetLaeDb"]} dB); with that gain change the Vorbis quantisation differs, so decoded they differ from v3's by up to 0.015 dB of gain, at most 0.0028 of full scale (-51 dB) as a residual. Re-encoding the same input at the same gain is bit-exact</p>
|
||||
<p>Loudness: every clip is matched to one A-weighted exposure; across all {len(M["clips"])} sender clips and {len(M["proposals"])} proposal clips as decoded, the spread is {S["laeSpreadDb"]} dB (target {S["targetLaeDb"]} dB, limited by {S["limitingClip"]}); the loudest true peak is {S["maxTruePeakDbTP"]} dBTP.</p></header>
|
||||
<main>
|
||||
{void_section()}
|
||||
|
|
|
|||
|
|
@ -56,4 +56,9 @@ for (const m of ["dm", "message", "invite"]) for (let i = 0; i < RHYTHM[m].lengt
|
|||
const x = renderNote("nibu", m, i), nextAt = Math.round(RHYTHM[m][i + 1][0] * 48), after = x.subarray(nextAt).reduce((a, v) => Math.max(a, Math.abs(v)), 0);
|
||||
assert.ok(after < 1e-6 * peak(x), `nibu ${m} note ${i} still sounds at ${after / peak(x)} of its peak after note ${i + 1} starts`);
|
||||
}
|
||||
// 6. Void: a note something follows is silent (under -120 dB re its own peak) once the next note starts, so a ring never swells under the next attack.
|
||||
for (const m of MOTIFS) for (let i = 0; i < RHYTHM[m].length - 1; i++) {
|
||||
const x = renderNote("void", m, i), nextAt = Math.round(RHYTHM[m][i + 1][0] * 48), after = x.subarray(nextAt).reduce((a, v) => Math.max(a, Math.abs(v)), 0);
|
||||
assert.ok(after < 1e-6 * peak(x), `void ${m} note ${i} still sounds at ${(20 * Math.log10(after / peak(x))).toFixed(1)} dB re its peak after note ${i + 1} starts`);
|
||||
}
|
||||
console.log(`ok: ${names.length * MOTIFS.length} clips are the sum of per-note renders; notes are independent of each other's pitch and noise; Void has one onset per note; Nibu notes do not overlap`);
|
||||
|
|
|
|||
Loading…
Reference in a new issue