Forty-one rows whose sources are a column, and two the page marks with a dash (#837)
Everest 4e's appendix prints the source of every row beside it, in a column
headed "Reference (Chapter)": "Mankovsky, ref 9-4", "Compendium, ref 9-1",
"BBC, ref 9-18". The row holds that text exactly as printed; the appendix
never explains the form and this catalogue does not expand it.
Two rows print an em dash where the source goes, and nothing on the page says
what the dash means, so those two carry no credit at all rather than
borrowing the row above them.
Eleven printed rows carry no numbers: seven are a label whose variants follow
underneath and four are underlined sub-headings. Their text is the name and
the printed row is the variant, because "draped to 1/2 area" is three
different drapes on one page and "Perf: 0.18%" two different panels.
Read twice: 246 cells and 41 credits, no difference.
Read the quasi-peak value method, not an r.m.s. through its network (#647)
* Read the quasi-peak value method, not an r.m.s. through its network
ITU-R BS.468-4 clause 3 reserves dBqps for the quasi-peak value method,
and NOTE 1 says an r.m.s. meter reading the same network gives figures
that are not directly comparable. The network was already exposed and the
curve landed in #645; the detector itself was missing.
Clause 2 prints no time constant, so the three are solved for against the
eleven reference readings of Tables 2 and 3 rather than quoted. How well
eleven windows pin three constants is measured and stated with the
procedure that produced it, because the answer depends on the question:
with the other two frozen, charge holds from 1.014 to 1.894 ms, discharge
from 233 to 367 ms and the reading device from 96 to 200 ms, so the
reading device is what the tables pin down least.
Four ballistics that all pass all eleven windows still read 2.61 dB apart
on a click and 0.03 dB apart on a steady tone. That is a property of the
standard, so it is documented as a lower bound on any reading here.
Four misprints found on the way are recorded in docs/ERRATA.md, none of
which changes what this library computes. IEC 60268-1:1985 Figure A1
prints the last shunt capacitor as 41.47 nF where BS.468-4 Figure 1a
prints 31.47 nF, and the annex contradicts itself two pages earlier:
against Table AI the printed value breaks that table's own tolerance
column at seven frequencies.
MicrophoneNoise(weighting="CCIR") stays metadata and weighted_thd stays
an r.m.s. through the network; both are now documented as such.
* Key the quasi-peak caches by the ballistics, and remeasure what they identify
The published statement about how far each of the three time constants can
move before one of the eleven windows fails could not be measured. The chain
caches the clause 2.6 calibration factor and the steady 5 kHz reference on the
sample rate alone, and both run through the detector, so moving the constants
left the caches answering with a reference computed for a different
instrument. The symptom was that the same value passed or failed depending on
what order the probes ran in.
It was correct while nothing could change the constants, and wrong for a
module whose documentation publishes a claim about exactly that. The
ballistics now travel through the chain as an argument and into both cache
keys, and verify_quasi_peak_dynamics takes them too, so the claim is
re-derivable rather than a number to be believed.
Remeasured on that footing, all eleven windows hold from 1.02 to 1.90 ms of
charge (1.88), 230 to 370 ms of discharge (1.61) and 96 to 200 ms of reading
device (2.09), each edge a value that conforms rather than one rounded past
the boundary. The earlier figures were taken through the contaminated path and
were wrong in both directions; one published edge did not even conform.
Two things follow that were not said before. The ranges are marginal and not a
box: the fastest charge with the shortest indicator misses by 1.11 dB. And the
spread between conforming instruments is larger than reported, because the
first measurement read the needle before it had finished rising. Sampling the
region and keeping the 243 sets that meet all eleven windows gives 4.61 dB on
a transient, more than the widest window the tables draw, against 0.00 dB on a
steady tone, which is the calibration doing what it promises.
Four tests hold the range from both sides, so it can be neither widened nor
quietly narrowed, and one asks in the order that used to give a wrong answer.
* Build the fixture before the block that expects it to raise
Ten pytest.raises blocks across nine files built their argument inside the
block. If the construction itself raised, the test would pass for the wrong
reason and the call it exists to check would never run. Sonar flags this as
S5778 but only on new code, so eight of the ten would never have been
reported: the two it did report were in a file that happens to be new.
Also removes a redefinition in _plot/signals.py, where _TIME_LABEL and
_LAG_LABEL are each assigned twice at module level. Both pairs carry the same
string so nothing is wrong today, but editing the first has no effect, which
is the kind of thing that is discovered the hard way. A sweep of the rest of
src finds no other case.
* Say on every page that this documentation is ahead of the release
The site documents the tree, which is ahead of what is on PyPI: pages here
describe modules, entry points and names that 3.3.0 does not have, so a reader
who installs the published version and follows a page gets an ImportError and
no reason for it. A standing banner says so.
Starlight's banner is per page, set in frontmatter, and its config-level form
takes one string with no way to vary it by locale. Half this site is Spanish,
so the component picks the text from the route's language. A page that sets
its own banner still wins: that one is about the page, this one is about the
site.
* Say the verdict in words, show how much of each tolerance is spent
The conformance tables marked every row with a tick or a cross, which can only
say two things. There are four verdicts: a check can also be by design, as the
Chebyshev and Bessel architectures are against a mask they cannot meet, or not
applicable. Those two had nowhere to go and were carried in a display string
where nothing could count them. A word says all four, reads the same in a
plain-text diff and needs no colour.
The Markdown report also never showed the number that matters most for a
metrology library: how much of a clause's published tolerance the deviation
actually consumes. The artefact has carried it since the report became
structured data, the site page has shown it, and the report itself did not.
It is there now on 469 of the 566 rows, with the dash on the other 97
explained rather than left to be guessed: those clauses state no two-sided
tolerance, so there is no budget to spend.
The same column appears twice in the PR comment and was explained under the
second table, which the reader reaches after meeting the column under the
first. The note moves to the head of the section.
Two responsive defects, both measured in a browser at a 390 px viewport rather
than reasoned about:
- The domain filter on the conformance page is sized by its longest option,
"2D FDTD wave simulation (Attenborough & Van Renterghem 2021, Ch. 4)", which
asks for 552 px inside a 374 px row. A flex item's automatic minimum size is
its content, so it refused to shrink and took the document to 582 px. With
min-width: 0 it is 390.
- Inline KaTeX had no scroll box, only display math did, and KaTeX never breaks
a formula. One acceleration formula on the errata page is 1011 px wide and
carried that document to 1067 px.
Wide tables were not part of it: they already scroll inside their own
containers, and only looked guilty because getBoundingClientRect reports an
element's full width whether or not its container clips it.
* Draw the verdicts and the count, instead of spelling them in emoji
The report says Pass, Fail, By design and n/a in words now, which fixed the
meaning an emoji could never carry, but left the tables with nothing to scan.
This adds the pictures back as SVG the repository owns and generates: four
verdict marks and a summary banner under .github/badges, redrawn by
`make conformance` from docs/conformance.json so the count on the banner is
always the tree's own. Nothing points at them yet; the documents come next.
A mark is one file with no dark twin, and that is a measured decision rather
than a shortcut. Each fill clears 3:1 on GitHub light, GitHub dark, GitHub dim
and the documentation site's ground alike, so the same file is right in every
theme, the way a shields.io badge has been for a decade. Pairing them instead
would need a <picture> element on every row, which costs 163 kB on the 566-row
table against 9.6 kB for reference-style images of a single-file mark. The
banner is the opposite case, once per page, where the pair costs 278
characters and buys a card that sits properly on its page, so it ships as a
light and a dark variant on the _dark naming the README and ThemeImage.astro
already pair on.
Shape carries the meaning alongside colour: a filled disc, a hexagon, a
rounded square and a hollow ring stay apart from each other in greyscale and
to a reader who cannot separate the hues. Every file states its verdict in a
<title> as well, because an image of a tick is not a verdict to anyone who
cannot see it.
The blue moved off Primer's #0969da, which measures 2.89:1 on GitHub Dim, onto
#1f6feb at 3.24:1. The whole contrast table is measured by the tests rather
than asserted in a comment.
Glyphs are outlines of the committed fonts, as the brand assets already are,
so the shared conversion moved into scripts/svg_text.py and generate_brand.py
now calls it; the brand output is byte for byte what it was. The banner is
drawn ten units to the pixel so every coordinate is a whole number, which
leaves no float to be formatted two ways on two machines. Two runs, three hash
seeds, a different timezone and a Turkish locale all write identical bytes.
Also fixes an assertion left pointing at a tick that no longer renders.
* Say why inline math has no scroll box, having measured what one costs
The commit before this gave inline KaTeX the scroll box display math already
had, on the reasoning that a formula wider than the column should scroll rather
than push the page sideways. The reasoning is right and the fix is not
available: overflow does nothing on an inline box, so the box has to become
inline-block, and that changes how every formula in the corpus takes part in
line layout.
Measured over the 991 inline formulas on the four most formula-heavy pages,
990 of them move. Their x and their width are untouched, but each box grows
from 22 px to 24 px tall, which lifts the line it sits on, and down a long page
the shift accumulates to 3645 px. Every variant gives the same 24 px, because
the growth is inline-block itself and not the overflow: vertical-align baseline,
a negative vertical-align, and dropping the overflow entirely all do. Only
overflow: clip keeps the document height, and it clips the formula instead of
scrolling it, which is worse than the defect.
Two formulas on one page do not justify taxing the typography of the 990 that
are already the right width, so the rule is gone and the comment says why, with
the numbers, so the next reader does not re-derive it. A formula wide enough to
need a scroll box gets fixed where it is written, as display math.
* Draw the verdict beside the word, wherever the report is read
The indicators the last commit generated were sitting in .github/badges
with nothing pointing at them. Now the three places that publish a
conformance verdict cite them, and each does it the way its own renderer
allows.
docs/CONFORMANCE.md gets a mark in front of every Status cell and in the
filter-class showcase, as reference-style images with one definition per
mark at the foot of the document. Measured on the real 566-row table, the
three ways of writing a per-row indicator cost +10.6 kB by reference,
+58.0 kB inline, and +162.8 kB for a per-theme <picture> on every row; the
mark is one file that clears 3:1 on every ground, so the last option buys
nothing. The head of the document gets the summary banner as the <picture>
pair the README already uses, and a legend that lists the marks the page
actually draws. Every mark keeps the word beside it: the word is the
verdict, the picture illustrates it, and the word is what survives a raw
view, a plain-text diff and an image that never arrives.
The pull-request comment gets the banner pinned to the head SHA, so it
reports the branch under review rather than main, and loses the last of the
emoji: the tick, the cross and the warning sign on its own test-status line
are now marks and words.
The site inlines the same four marks as an SVG sprite read off the
committed files at build time, which costs no request and lets the Spanish
page say "Por diseño" where the English one says "By design". It also fixes
a live defect there: the status cell asked whether the verdict was "pass"
and drew everything else as a red cross announced as "Fail", so a by-design
row was published as a failure, and the "failing rows only" filter listed it
as one. Both now know all four verdicts.
The README carries the banner under the paragraph that makes the
conformance claim, linked to the report.
Two measurements changed a decision. Starlight's own green is 1.53:1 on the
light card, so the site bar uses the marks' measured fills instead. And the
green and the red are within 1.02:1 of each other, so a failing bar reads as
a full one in greyscale; both bars now leave a sliver of track between the
segments.
* Lead every conformance row with its verdict, in words
On the documentation site the verdict was the eighth and last cell of a table
wider than the content well, drawn as a mark with the word hidden from sight,
and the box around that table never scrolled. A table whose columns cannot fit
is laid out at its min-content width anyway, but Chromium reports its border
box as the containing block's width, so the scroll container saw scrollWidth
equal to clientWidth, offered no scrollbar and clipped everything past its
right edge. Measured at 1280 px, the status cell ended 106 px outside the box
and scrollLeft stayed pinned at 0; at 360 px it ended 863 px outside. A pixel
census of untouched screenshots found exactly one verdict mark painted in the
viewport at twelve of the fourteen width and language combinations, and that
one was the mark in the section heading. Below 1440 px no data row carried a
verdict a sighted reader could reach, while the Markdown mirror printed the
word in every row.
min-width: min-content gives the container something to scroll, the verdict
moves to the first column, and its word is drawn rather than hidden. The mark
needed display: inline-block as well, because Starlight's content reset makes
every svg a block and had been placing the mark on a line above the word it
belongs to in every cell that draws one; and the column after the verdict
carries the gutter, because a nowrap verdict runs past its own cell where the
table is squeezed and padding on the overflowing cell cannot hold a gap open.
The mark stays aria-hidden, so a screen reader still hears the verdict exactly
once.
Measured afterwards at 360, 390, 768, 1024, 1280, 1366 and 1440 px in both
languages: the status cell is inside the container at all fourteen, the
container reports real overflow of 28 to 867 px and scrolls to the last
column, the page body never scrolls sideways, the verdict and its mark share a
line with at least 13 px to the citation beside them, and the marks painted in
the viewport go from one to one per visible row.
The palette's "clears 3:1 on every ground" was measured against five grounds,
four of which were not grounds. GitHub stripes even table rows, so half of the
report's rows sit on a stripe rather than a canvas, and this site overrides
Starlight's page colour, so the #17181c that three comments named is not a
ground anywhere here. Against the nine real grounds, eight clear 3:1 and
GitHub's dimmed table stripe does not: the four fills measure 2.75 to 2.82
there. They stay as they are, because no colour can do better. Clearing 3:1 on
#2d333b needs a relative luminance of at least 0.1972 while a white glyph
reading at 4.5:1 on the fill allows at most 0.1833, so the two windows do not
overlap; the glyph wins, because it is the part of the mark that is read and
every surface prints the verdict in words in the same cell. The test now
measures all nine grounds, pins the one exception, and proves the arithmetic
behind it.
What a picture pair follows was stated backwards in one direction and
correctly in the other, so both were measured across all four crossings of
desktop theme and GitHub theme. On github.com the pair follows the GitHub
theme: GitHub upgrades it into a themed-picture element that rewrites the
source's media to "not all" or to a pair of prefers-color-scheme queries.
Rendered without that JavaScript, as the /markdown API output under GitHub's
own stylesheet is, the media stays as authored and the desktop decides, so two
of the four crossings serve the wrong twin. The docstring now says both, and
says why the choice is safe either way: the banner paints its own card, whose
ink reads at 14.84:1 light and 15.91:1 dark, and which separates from a
mismatched page at 17.3:1 and 17.8:1.
The committed report drops its summary banner. That file is regenerated from
the tree it sits in and gated byte for byte, so it claims to be that tree's
report, while an image can only be cited at a fixed ref; on any branch that
adds or removes a check, a picture of main's count sat directly above a
sentence carrying the branch's. The sentence carries every number the picture
did. In its place the report gains the ten checks closest to their published
limit, which the pull-request comment and the site page have both ranked since
they were written and the published report never showed.
Two smaller corrections. The pull-request comment no longer reports a missing
test artefact as "0 tests, 0 failures (all green)". And the report's legend and
the renderer's docstring no longer say the mark sits beside its word in
Markdown: measured under GitHub's own table stylesheet, the Status column
settles at about 53.5 px of content box against the 54 px a mark plus its word
needs, so the word wraps under the mark in 563 of 566 cells at 1012 px and 493
at 1400, and a non-breaking space does not change it.
* Make the measurements in the comments the ones this tree produces
Five sentences quoted figures the tree does not give, and the branch
contradicted itself on two of them.
The scroll comment said the container reports 106 px of overflow at 1280 px.
It reports 116. The 106 is what it reported before the gutter rule sixty lines
below, which the same comment says grows the table by 10 px, so the file
disagreed with itself by exactly the amount it documented.
The byte figures were taken against a baseline that had neither the banner nor
the legend, and came out 0.6 kB high: +10.6, +58.0 and +162.8 where the
committed report gives +10.0, +57.3 and +162.2. Two other places in the same
branch already quoted the right ones.
The wrap counts came from one harness and do not survive another, which is
fair enough because the count depends on the width the harness gives the
container: 566 of 566 in one and 563 in the other. The wrapping is the
finding, so the sentence states that and stops pretending to a tally.
The line-box note said the cell is no wider. True in English and false in
Spanish, where the longer word costs 4.8 px. Both twins are peers, so the
sentence now says which is which.
And the report and the PR comment do not share two functions; they build their
markup separately and meet at asset_url, which is the one that matters,
because a path that is wrong there is wrong on both.
Give the tree a formatter, and a gate that keeps it (#602)
* Give the tree a formatter, and a gate that keeps it
Ruff was the linter and nothing was the formatter. There was no
`[tool.ruff]`, no `ruff.toml`, no pre-commit and no `.editorconfig`, and CI
ran `ruff check .` on ruff's default rules alone, which are four families of
outright errors. Nothing looked at shape, so 673 of the 812 Python files had
drifted from any single style.
The line length is 88 because that is what the tooling defaults to and,
measured, what moves this tree least: 100 rewrites 708 files and 120 rewrites
717, since a longer limit rejoins lines that were split by hand. Only 0,8 %
of the lines here were over 88 to begin with.
Markdown stays out of it. Ruff formats fenced Python inside `.md` and does
not recognise `.mdx` at all, and every snippet in `docs/` is mirrored by hand
into the site in English and Spanish, so formatting one copy would drift the
three apart with nothing to notice. Those snippets also align their trailing
comments to show what each line prints, which is a teaching device.
The linter now selects the families this tree already satisfied or nearly
did, and the fifty-odd findings they raised are fixed. Two of those fixes are
worth naming because the formatter caused them: reflowing a call moves a
`# type: ignore` onto a line that no longer holds the error it silenced, and
mypy caught four such cases. One rename is reverted with the reason written
down, because renaming an unused binding moves the fingerprint the clip
freshness gate reads, and that is not worth re-rendering an FDTD animation.
* Keep the reformat out of git blame
A tree-wide reformat stands in front of every line it touched. This file
names it so `git blame` walks past, which GitHub honours without any
local configuration and which `git config blame.ignoreRevsFile` turns on
for a checkout.
* Stop selecting the rule that reads a constant as a literal
SIM300 calls any upper-case name a literal, and on that reading it gets
three idioms in this tree backwards.
`spectrum[OCTAVE_BANDS == f]` is a numpy mask, not a condition.
`res.transmission_loss[BANDS <= f0]` reads "the bands at or below f0" until
it becomes `f0 >= BANDS`. And `value == pytest.approx(x)` is how pytest is
written here: 1755 of the 2065 `pytest.raises`-adjacent assertions in the
suite already put the expected value on the right.
It is right about two of the nineteen it finds and wrong about the other
seventeen, and SonarCloud caught the result as `python:S3415`, assertions
whose argument order no longer agrees within a file. The nineteen are
reverted by rebuilding those files as they would have been had the rule
never been selected, which keeps the `C420` and formatting changes two of
them also carry.
A sound calibrator gets its IEC 60942:2017 verdict, by the conformance rule of the IEC TC 29 instrument standards (#872)
* A sound calibrator gets the IEC 60942:2017 verdict, by the conformance rule of the IEC TC 29 instrument standards
metrology.verify_conformance is the rule IEC 60942 and IEC 61672-1 print in
the same sentence: a measured deviation within its acceptance limits and the
laboratory's expanded uncertainty within the maximum permitted, both
inclusive. The verdict object says which of the four outcomes it is, in the
words of Tables E.1 and C.1, draws itself as Figure E.1 does, and has no
truth value.
metrology.verify_sound_calibrator grades a laboratory's record of a class LS,
1 or 2 calibrator (LS/M and 1/M included) against Tables 2 to 7, Tables A.1 to
A.5, the supply-voltage and field-immunity figures printed in the text and the
reduced limits of the abbreviated environmental test. Every table is
published read-only. The static-pressure correction of a pistonphone is an
input from the manufacturer's data, and a calibrator that is not one is
refused any correction.
sensitivity() now screens a calibrator take against the Table 2 limit of the
calibrator's class, read from the published table, instead of a private copy
of the class 1 column.
* The eighteen printed conformance examples of IEC 60942 and IEC 61672-1 are conformance rows, and the calibration guides grade the calibrator itself
Twenty-seven rows in a new calibrators domain of the conformance report: the
eight examples of IEC 60942:2017 Table E.1 and the ten of IEC 61672-1:2013
Table C.1, which had no row before, each reproducing the printed verdict and
the printed reason, the boundary cases included (a deviation equal to its
limit, an uncertainty equal to its maximum, -1,2 dB on the lower limit of
C.1); every cell of Tables 2 to 7, A.1 to A.5 and the limits 5.9.4.2, A.5.5.7
and A.6.4.7 print in their text, dashes and range ends included; and the
verdicts where the tables meet the rule.
The calibration guide gains a section on verifying the calibrator itself,
with its figure, the pistonphone correction and the abbreviated environmental
test; the compliance guide gains the conformance rule of IEC TC 29, drawn on
the eighteen examples as the standards draw them. The sound level meter,
signals and metrology pages stop saying the calibrator goes ungraded and say
instead what is graded and what is not, in English and Spanish, and the
plain-Markdown calibration guide no longer attributes the class 1 tolerance
to Table 1, which lists the classes.
* The calibrator verdict grades the in-band static pressures against Table 2, and its figures and rows follow what the pages print
IEC 60942:2017 A.6.2.4 judges each point of the static-pressure sweep against Table 2 or Table 5, as appropriate for the pressure. A laboratory record now has environmental_level_in_band for the points inside the band of 5.3.2, graded against Table 2 with the Table A.4 maximum, and the abbreviated test leaves them alone. The record also says that the level measured at each end of the supply range goes into level_deviation_db, since 5.3.4 holds it to Table 2 as well.
The overall figure colours a bar from the verdict rather than from its share, so a level that lands on its limit through floating-point arithmetic is no longer drawn red under a title that says it conforms. Its legend sits below the x label at a distance set in points, so it clears the label on a record of one requirement as on one of twenty, and names the red bars and the dashed 100 % line. A fluctuation or a distortion is drawn against its maximum alone, with its own quantity on the axis. The Table E.1 panel of the conformance rule figure draws its limits at 0 dB and 0.25 dB, as Figure E.1 does.
The conformance rows compare the two frequencies of every printed range as well as which of them it includes, and the printed reason of every Table E.1 and C.1 example as well as its verdict. A new row grades class 1 at 2 kHz, where Table 2 and Table 5 part. The tests check the limits and maximum uncertainty every requirement reads, for every class at a frequency in every printed row, against the page transcription.
The guides and the CHANGELOG scope the rule to the IEC TC 29 instrument standards written since 2013, say that the guard band of Annex D lowers the risk of passing an instrument outside its tolerance rather than removing it, count at least three couplings, and describe ISO 8041-1 the right way round.
* The acceptance limit's legend entry is named once
* The calibrator claims say what the verdict grades and that it runs no physical test
* The llms files follow the calibrator claims
Four more printed tables, a guard that they reach the reader, and an index of the fiches (#845)
* Seventeen damping materials, and the temperature their loss factor peaks at
Every loss factor this library held until now was one number. Bies prints
0.0001 for steel, Cremer 0.0002 for a different steel, Hopkins an estimate for
plasterboard, and none of them says at what temperature or at what frequency,
because for a metal it hardly moves. For a viscoelastic damping treatment it
moves by two orders of magnitude, and a single number is not a property of it
at all: the loss factor peaks in the narrow band where the polymer is worked
near its glass transition, and that band climbs in temperature as the
frequency rises.
TABLE 14.1 of Vér and Beranek is the only table in this corpus that prints
that. Seventeen commercial materials, each with the greatest loss factor it
reaches and the temperature at which it reaches it at 10, 100 and 1000 Hz,
plus the modulus at the stiff end, at the soft end, in the transition and the
imaginary one.
The page is in degrees Fahrenheit and pounds per square inch, so every
converted cell is marked as derived and says what was printed. Its footnote
offers 7e3 to reach N/m2 and this catalogue does not take it: a psi is
6894.757293 Pa by definition, and the rounded factor is 1.5 per cent above
that, which is larger than the last digit the page prints. A test pins the
difference so nobody quietly restores the shortcut.
Two readers transcribed the page without seeing each other's work: 136 cells,
no difference, including the eight temperatures set with a true minus sign and
the three glyph strings the printing corrupted. Those three are registered in
docs/ERRATA.md and the rows refuse them rather than finishing the number
themselves.
* A hundred and thirty-two rows from four more tables, and a page that lists the fiches
Four catalogues join the published tables: forty-eight floor and ceiling
assemblies with their impact insulation class (Harris 3e Tables 32.1 to 32.8),
forty-six duct walls with breakout and break-in kept apart (ASHRAE 2019
Chapter 49 Tables 29 to 34), twenty-nine resistive facings (Ver & Beranek 2e
TABLES 8.5 to 8.7) and nine machine equipment room constructions that join the
transmission loss table (ASHRAE Chapter 49 Table 40). Each was read twice from
the pages by readers who never saw each other's work, compared cell by cell,
and the second reading is the oracle the suite holds the catalogue against.
A new guard requires every published catalogue to reach the page that
publishes catalogues. It found six that never did, two of them years old, and
they are on the page now.
The source census learned to recognise an organisation that writes its own
handbook. It required a comma or a full stop after the lead of a bibliography
entry, so ASHRAE (2019) never matched and three tables already in the package
were uncited without the gate noticing.
The catalogues page shows one catalogue at a time, with a single panel that
chooses the category, the name and the book; the notes behind a dotted
underline open on a tap. Every fiche the library ships is listed at
/reference/reports/, built from the declaration each guide already carries, and
the landing page counts material values instead of figures.
* The generated indexes list the three new modules and the fiche index
* The machine-readable index names the catalogues and the fiches
* The errata pages carry the entries the branch added
* A row whose own page contradicts itself, and fourteen other things an adversarial read found
3M ISD-113 was published with a transition modulus below its own smallest
modulus. The page prints both, and the same page defines the smallest modulus
as the smallest value there is, so the two cells contradict each other and
nothing on the page says which is wrong: the printed transition modulus is
supported by its neighbour through the chapter's own relation, while every
other row puts it one to two orders of magnitude higher. Both are served as
printed, the row says so, the errata registers it in both languages, and a
test now requires the ordering on every other row.
The derived markers on that table were asserted on one row and two fields.
Deleting the rest left the suite green, which would have let a converted value
be served as a reading off the page. Every converted cell of every row is now
checked, and so is the printed figure kept beside it.
The catalogue guard matched a substring, so a catalogue whose name is a prefix
of a registered one would have been reported as reaching a page that had never
heard of it. There are three such prefixes in the tree already. It now matches
whole words, and attributes a catalogue to the module that defines it rather
than to the parent package that re-exports it.
A frequency of infinity reached the integer conversion before the catalogue
looked at it, so a method that documents ValueError raised OverflowError.
The rest are sentences that said something the repository does not: the
diameters of the round ducts given as a closed set that left out the spiral
blocks, every cell of the damping table called converted when the loss factor
is dimensionless and is not, a loss factor attributed to Cremer as one number
when the book prints an interval, the double-unit pairs of the Harris tables
counted as three hundred and twenty when they are three hundred and twenty-one,
a provenance note pointing one row up instead of two, two attribute names
abbreviated in the API table until they no longer existed, and a fiche index
that wrote "1 fiches".
* Two sources the Spanish bibliography did not carry, and a label that counted the wrong thing
The Spanish bibliography had neither ASHRAE (2019) nor Harris 3e, both of
which the Spanish catalogues page now cites. They are written as Spanish
rather than translated, in the section and the alphabetical position each one
belongs to.
The landing page called its catalogue number "material values read from
printed pages". It counts rows rather than values, it includes fluids, gases,
air conditions and duct walls rather than materials alone, and some of those
rows were computed from a printed geometry rather than read off a page. It now
says what is true of all of them: published catalogue rows, each naming the
source it came from.
The source census widened one of its two bibliography patterns and not the
other. The narrow one is not reachable today, because a corporate designation
carries its year and the full stop follows it, but one written without a year
would have been rejected against an entry that has one. Both now read the
same.
`published-catalogues` joins .PHONY, and docs/README.md records the fiche
index and why it has no hand-written mirror, next to the catalogues entry that
carries the same exemption.
* The one assertion in the duct-wall tests that read expected-first
Twenty-nine surfaces at three angles, computed rather than measured (#840)
* Twenty-nine surfaces at three angles, computed rather than measured, and a width its own geometry contradicts
Cox & D'Antonio 3e Appendix B is the diffusion half of ISO 17497: how even a
surface's polar response is, which is a different question from how much
energy left the specular direction and can answer the other way round for the
same surface. So `materials.diffusers.PUBLISHED_DIFFUSION` is a catalogue of
its own rather than more rows of the scattering one, and its numbers were
computed with a two-dimensional boundary element model, not measured.
The page prints three lines per surface, headed 0, 57 and Random, so a surface
is three rows here. The random one carries no angle at all: it is an
arithmetic mean over ten angles, without the weighting a measurement standard
would apply, and zero degrees already means the normal incidence row this same
table prints. Asking it for the angle gets that sentence, not a number.
The table's argument is in its numbers, and the tests pin two of them. One
semicylinder scores 0.77 at 1 kHz at random incidence and twelve of the same
semicylinder score 0.22, so an array is not one device repeated. Six
semiellipses go from 0.02 to 0.65 at 5 kHz as they deepen from 1 cm to 30 cm.
One surface is printed twice, in two sections, with the same fifty-four values,
because six semicylinders spanning 3.66 m and a 30 cm deep semicylinder array
are the same object read into two series. Both rows stay.
The first width of the first section reads "0.61 cm" where the other four of
its series are in metres, where the doubling series requires 0.61 m, where the
heading's own geometry gives 0.61 m, and where Table C.3 of the next appendix
prints the same surface as "0.61 m". That is in the errata register, with both
pages cited, and the row keeps what the page says.
Read twice from the pages by readers who never saw each other's work: 1566
cells, no difference, and the same twenty-nine descriptions and seven section
headings on both sides. Five deliberate defects were injected to watch the
tests fail against them, including an angle given to the random row and two
angle lines swapped.
The five catalogues of this library that hold a spectrum each kept their own
copy of the same three methods, and this would have been a sixth. They now
declare their bands and how their band fields are spelled, and inherit the
rest. Nothing about any of them changed from the outside.
* The errata page carries the width entry too
* The reference stopped documenting the methods a row inherits
When the five catalogue classes that hold a spectrum moved their three shared
methods onto a private base, the methods left the reference with them.
`bands()` and `spectrum()` had been on every one of those pages; afterwards
they were on none, while the curated index went on promising `.bands()` five
times and `.spectrum()` ten.
The generator collected methods from `vars(cls)`, which is what a class
defines and not what it carries. It now also walks the bases whose module a
reader cannot open, because those have no page to link to: a method inherited
from a published class is one click away, and a method inherited from a
private one is nowhere.
That restores what the refactor took and adds what was never there:
`why_missing()` and `printed()` come from `CatalogueRow` and had never been
documented on a single catalogue page, although telling an empty cell from a
cell holding a word is the whole point of these rows.
Four more printed tables, a guard that they reach the reader, and an index of the fiches (#845)
* Seventeen damping materials, and the temperature their loss factor peaks at
Every loss factor this library held until now was one number. Bies prints
0.0001 for steel, Cremer 0.0002 for a different steel, Hopkins an estimate for
plasterboard, and none of them says at what temperature or at what frequency,
because for a metal it hardly moves. For a viscoelastic damping treatment it
moves by two orders of magnitude, and a single number is not a property of it
at all: the loss factor peaks in the narrow band where the polymer is worked
near its glass transition, and that band climbs in temperature as the
frequency rises.
TABLE 14.1 of Vér and Beranek is the only table in this corpus that prints
that. Seventeen commercial materials, each with the greatest loss factor it
reaches and the temperature at which it reaches it at 10, 100 and 1000 Hz,
plus the modulus at the stiff end, at the soft end, in the transition and the
imaginary one.
The page is in degrees Fahrenheit and pounds per square inch, so every
converted cell is marked as derived and says what was printed. Its footnote
offers 7e3 to reach N/m2 and this catalogue does not take it: a psi is
6894.757293 Pa by definition, and the rounded factor is 1.5 per cent above
that, which is larger than the last digit the page prints. A test pins the
difference so nobody quietly restores the shortcut.
Two readers transcribed the page without seeing each other's work: 136 cells,
no difference, including the eight temperatures set with a true minus sign and
the three glyph strings the printing corrupted. Those three are registered in
docs/ERRATA.md and the rows refuse them rather than finishing the number
themselves.
* A hundred and thirty-two rows from four more tables, and a page that lists the fiches
Four catalogues join the published tables: forty-eight floor and ceiling
assemblies with their impact insulation class (Harris 3e Tables 32.1 to 32.8),
forty-six duct walls with breakout and break-in kept apart (ASHRAE 2019
Chapter 49 Tables 29 to 34), twenty-nine resistive facings (Ver & Beranek 2e
TABLES 8.5 to 8.7) and nine machine equipment room constructions that join the
transmission loss table (ASHRAE Chapter 49 Table 40). Each was read twice from
the pages by readers who never saw each other's work, compared cell by cell,
and the second reading is the oracle the suite holds the catalogue against.
A new guard requires every published catalogue to reach the page that
publishes catalogues. It found six that never did, two of them years old, and
they are on the page now.
The source census learned to recognise an organisation that writes its own
handbook. It required a comma or a full stop after the lead of a bibliography
entry, so ASHRAE (2019) never matched and three tables already in the package
were uncited without the gate noticing.
The catalogues page shows one catalogue at a time, with a single panel that
chooses the category, the name and the book; the notes behind a dotted
underline open on a tap. Every fiche the library ships is listed at
/reference/reports/, built from the declaration each guide already carries, and
the landing page counts material values instead of figures.
* The generated indexes list the three new modules and the fiche index
* The machine-readable index names the catalogues and the fiches
* The errata pages carry the entries the branch added
* A row whose own page contradicts itself, and fourteen other things an adversarial read found
3M ISD-113 was published with a transition modulus below its own smallest
modulus. The page prints both, and the same page defines the smallest modulus
as the smallest value there is, so the two cells contradict each other and
nothing on the page says which is wrong: the printed transition modulus is
supported by its neighbour through the chapter's own relation, while every
other row puts it one to two orders of magnitude higher. Both are served as
printed, the row says so, the errata registers it in both languages, and a
test now requires the ordering on every other row.
The derived markers on that table were asserted on one row and two fields.
Deleting the rest left the suite green, which would have let a converted value
be served as a reading off the page. Every converted cell of every row is now
checked, and so is the printed figure kept beside it.
The catalogue guard matched a substring, so a catalogue whose name is a prefix
of a registered one would have been reported as reaching a page that had never
heard of it. There are three such prefixes in the tree already. It now matches
whole words, and attributes a catalogue to the module that defines it rather
than to the parent package that re-exports it.
A frequency of infinity reached the integer conversion before the catalogue
looked at it, so a method that documents ValueError raised OverflowError.
The rest are sentences that said something the repository does not: the
diameters of the round ducts given as a closed set that left out the spiral
blocks, every cell of the damping table called converted when the loss factor
is dimensionless and is not, a loss factor attributed to Cremer as one number
when the book prints an interval, the double-unit pairs of the Harris tables
counted as three hundred and twenty when they are three hundred and twenty-one,
a provenance note pointing one row up instead of two, two attribute names
abbreviated in the API table until they no longer existed, and a fiche index
that wrote "1 fiches".
* Two sources the Spanish bibliography did not carry, and a label that counted the wrong thing
The Spanish bibliography had neither ASHRAE (2019) nor Harris 3e, both of
which the Spanish catalogues page now cites. They are written as Spanish
rather than translated, in the section and the alphabetical position each one
belongs to.
The landing page called its catalogue number "material values read from
printed pages". It counts rows rather than values, it includes fluids, gases,
air conditions and duct walls rather than materials alone, and some of those
rows were computed from a printed geometry rather than read off a page. It now
says what is true of all of them: published catalogue rows, each naming the
source it came from.
The source census widened one of its two bibliography patterns and not the
other. The narrow one is not reachable today, because a corporate designation
carries its year and the full stop follows it, but one written without a year
would have been rejected against an entry that has one. Both now read the
same.
`published-catalogues` joins .PHONY, and docs/README.md records the fiche
index and why it has no hand-written mirror, next to the catalogues entry that
carries the same exemption.
* The one assertion in the duct-wall tests that read expected-first
Realise the ITU-R BS.468-4 curve from the network the Recommendation prints (#645)
* Realise the ITU-R BS.468-4 curve from the network the Recommendation prints
Clause 1 makes the Fig. 1a passive network the primitive and Table 1 a rounded
sampling of it, so the curve is defined at every frequency and the 21 rows are
an oracle rather than the definition. The shipped implementation had it the
other way round, interpolating the table logarithmically, which departs from the
network by 0.6108 dB at 11 058 Hz, about 60 per cent of the mask budget there.
The prototype is now built at design time from the seven printed component
values by a polynomial ABCD chain, so a reader can check the module against
Fig. 1a rather than against opaque roots. In double precision it reproduces the
exact rational denominator to 3.4e-16 and the poles to 2.5e-15, and it
reproduces all 21 published rows to 0.0503 dB. The curve joins weighting_filter
as '468' with its own 384 kHz oversample target, which is what a skirt falling
at 30 dB per octave needs, and refuses the plain design rather than shipping a
23 dB error at 16 kHz under a name that promises the mask.
Published numbers move, all of them towards the network: weighted_thd by
+0.1111 dB, idle_channel_noise by +0.0845 dB, dynamic range by -0.029 dB, and
the 6.3 kHz conformance row from 12.2 to 12.2167. The nine table pins were
tautological against an interpolator that returns its own knots; against the
network they say something for the first time.
* Say the measured bound, and follow each source's own decimal separator
Four review findings on the curve.
The docstrings promised 0.050 dB and 0.0502 dB against Table 1 where the
measurement is 0.050221, so both understated the bound the code actually meets.
They now say 0.0503, which is what the shipped constant carries.
Three decimal commas sat in English prose describing BS.468-4, whose Table 1
prints a point, verified on the rendered page. The one in the AES 17 sentence
stays, because AES 17 prints a comma there and the separator follows the
document being quoted; the docstring now says so, since the mix looks like an
oversight until you know why.
The stateful parameter presented itself as generally available while '468'
refuses it, and the hand-written weighting guide still listed seven curves in
all three editions.
* Name both doors to the plain design in the weighting guide
The guide rows said '468' needs stateful=False, which is only half of it: the
refusal is on high_accuracy=False, and stateful merely forces that off. A reader
following the rows could still ask for high_accuracy=False directly and be
turned away by a precondition the page never stated.
* Put a chip behind the annotations that sit on the curves
Both 1 kHz labels land where another curve passes, so they were read against a
line. They now carry the chip the plot corpus uses for exactly that, opaque
COLOR_PANEL with a COLOR_GRID edge, which is a different object from the
translucent grey one used for text boxes in an empty corner: over a line in the
dark theme the translucent one loses its contrast.
* Take the 468 design out of the curve chain, and say what the resampler costs
Adding the 468 branch pushed _analog_design to a cognitive complexity of 16.
It is the only curve that both reads its prototype from a network and raises
its own design rate, and the reason for that rate takes a paragraph, so it
moves to its own method and the chain comes back to 11.
The prose beside it claimed that raising the oversample factor makes the
20 kHz row worse because a sharper anti-alias FIR cuts harder. Measured, that
is false in both halves. The FIR's transition band in hertz is invariant with
the factor, since its tap count grows as 20 L while its normalised cutoff falls
as 1/L: the -3 dB point sits at 21.17 kHz for every L from 2 to 16. And the row
improves with the factor rather than worsening, from -10.4 dB at x2 to -1.7 dB
at x16, all of it the sections decompressing while the resampler holds a fixed
-1.66 dB. The pair of figures the old text quoted turned out to come from
raising the design rate without raising the runtime factor, so they describe a
filter designed for a rate the path never ran at.
* Say that the 468 gain arrives already normalised
The prototype puts 0 dB at 1 kHz itself, as its own docstring states, so the
extracted design method was wrong to call the tuple unnormalised. The shared
renormalisation still runs, and is an identity for this curve; it stays that
way rather than being special-cased, so the reference lives in one place for
every curve that has one.
Determine the sound power of a whole multisource industrial plant from a contour round it, by ISO 8297 (#911)
A quarry, a crushing plant or a petrochemical complex is too large for an enveloping surface and too full of sources to measure one at a time, so ISO 8297:1994 measures the plant as one source for the prediction of the levels at its neighbours. The new emission.sound_power_plant module lays the positions on a contour drawn as a polygon round the plant, with the distances, aspect angles, microphone directions and heights of clause 9, and runs the nine steps of clause 10 to the octave-band and A-weighted sound power with the uncertainty of Table 1. The air absorption is Table 3 as printed, or the ISO 3891 Annex A coefficient for the weather of the measurement. check_plant_measurement gives one verdict on the requirements of clauses 1.2, 6 b), 7.1, 9.1, 9.3, 9.5.1, 9.5.3 and 10.2, keeping apart those the standard lets go unmet if reported, and partial_plant_contributions puts together the parts of an industrial area measured on their own contours. Every result has a plot, a new guide in English and Spanish measures a crushing plant whose sources are known and lands within half a decibel of their power, and four misprints of the standard are in the errata.
Six places where the clause and the code had parted, from a microphone standing under its own clearance to an area that is not one number (ISO 10847, ISO 11820, ISO 11821, EN 16487) (#785)
* Six places where the clause and the code had parted, from a microphone standing under its own clearance to an area that is not one number (ISO 10847, ISO 11820, ISO 11821, EN 16487)
The reference microphone of ISO 10847 could stand lower than 7.2.2 allows.
The clause puts it at least 1,5 m above the top edge of the barrier with
"shall", and its NOTE lets a close source raise it until it looks 10 degrees
over the top; the height returned was the NOTE's alone whenever the source was
nearer than 15 m, which for a 3 m barrier 5 m away is 4,34 m against the 4,5 m
the clause asks for, and past 80 degrees a negative height. It is the higher of
the two now, and where no height reaches the 10 degrees the clearance holds and
a warning says why. The test and the conformance row had both pinned the short
geometry as correct.
ISO 11820 caps its energy subtraction at 3 dB, and Table 1 prints what that
3 dB is: the correction at a 3 dB margin, which the subtraction writes
unrounded as 3,0206 dB. The cap is judged on the margin of the two energy means
now, so the two routes the clause offers agree at the boundary they share and a
printed 3,0 dB pair is no longer decided by floating point. The window that
keeps such a pair out of the cap is the one the module declares and nothing
wider: the comparison names a relative tolerance of zero, as every other
closeness test in the package does, so the constant sets the tolerance it
documents instead of three times it. ISO 11821 7.4 c) reports the attenuation
of a screen to the nearest whole decibel, which the result now gives with
rounded() and rounded_a_weighted() as the barrier, enclosure and cabin results
already did.
The two loss functions of ISO 11820 took their areas as single numbers, where
the area of a diffuse room is a quarter of its absorption and moves with the
reverberation time band by band. They take each area and the field correction
as one value or one per band, and the two fields of the result are arrays of
one value per band even when single values went in. The thesis oracle that had
to be driven one band at a time is one call per table.
check_ceiling_specimen judged three of the limits clause 4 of EN 16487 prints
and published the rest as constants nothing applied. It judges the support
units of 4.1.1.2.3.6 and, given one value per measurement, the 50 % of 4.2.2;
the verdict carries both, and a type E depth other than 200 mm passes with a
warning that no longer calls the arrangement outside the test code. And
room_to_room_transmission gains receiver_distance_m, the direct field the
partition radiates into the receiving room, from Equations (7-71) and (7-72) of
Barron (2003), whose Example 7-6 a new conformance row holds; Norton's Equation
(4.101) is its far limit and stays the default.
The unit guard then read the new humidity_ok as a humidity without its unit: a
parameter typed bool holds a verdict and no number of the quantity it names, so
it is outside the rule. The printed tables the tests and the conformance rows
of these standards both read were transcribed twice, once on each side; they
are transcribed once now, in tests/reference_data, with the document, the folio
and the PDF page of each, and the report regenerates value for value.
The guides say all of it in both languages, with the mirrors, the curated API
table and the errata entry for the 6,2 dB of ISO 14257 Equation (4), which
stays as printed and is now stated where it is spent.
* Two receiver-correction rows a single band could satisfy, and a denominator with two spellings (ISO 10847, ISO 11820)
Both ISO 10847 receiver-correction rows read the largest shift across the three bands, so a correction that reached one band and left the other two alone would still have printed the 6 dB of the pressure doubling and passed. They now read the largest absolute departure from 6 dB, which is a statement about every band, and the 6 dB is written into the expected column as prose so the row still says what it is checking.
The Ver and Beranek absorption row said it was checking a quarter of the printed Sabine absorption area. It multiplies the quarter back up and compares the full printed 10,7 m2, so the row described a different quantity from the one it evaluates.
`receiving_absorption` is the denominator of the reverberant term, and the two books write that term over two different quantities: Norton over S2 alpha2 and Barron over the room constant R2. The module prose, the function docstring and the guide all say so, but the parameter line said only the first, and the parameter tables of the reference pages print that line on its own, away from the paragraph that explains it. It now names both, with the link to `room_constant` beside the one to `equivalent_absorption_area`.
The normalisation cell of the API table printed `spectrum_distribution_value(values, PINK_NOISE_WEIGHTS_DB values)`, two arguments juxtaposed with no accessor between them. The second argument is a sequence of the six weights, so it is `list(PINK_NOISE_WEIGHTS_DB.values())`.
* The background of Annex B case A goes with the label that carries it, not with the coordinates beside it (ISO 11690-3)
Table B.5 prints the 50 dB of background against the workstation it calls W1, and the entry already registered that the labels of that table are the half it gets right: Figure B.1 puts W1 beside machine M2, and that is where the levels of Table B.6 come back. The background was being heard in the far corner instead, which is where the other label belongs.
It is worth 0,004 dB, both readings round to the tenth Table B.6 prints, and no verdict moves. What changes is the second decimal of the two recomputed levels the entry quotes, 82,09 dB and 80,27 dB becoming 82,10 dB and 80,26 dB, and the entry now says where the background sits and what the other reading would cost.
The two counts in the Annex B check labels were written out by hand while the cells they describe were counted in the code beside them, so a row added or removed would have left the prose saying six and twelve. They come from the cells now.
* The Eq. (4) offset row judges every claim it prints, not only the first (ISO 14257)
The row publishes three findings about the fourteen Annex C values: the sum of the Table 1 weights puts none of them outside their rounding, the printed 6,2 dB puts nine outside, and every departure the printed constant gives is high. Its verdict only counted the first. The other two were computed and printed beside it and never judged, so the row would have gone on passing the day the printed constant agreed with the annex, while still saying it does not.
All three are judged now, with a fourth the description also claims, that none of the high cells reaches a second unit of the tenth. The nine is recorded as the finding it is rather than derived, and the fourteen comes from the cells. Made to fail both ways before committing: with the recorded count set as if the constant agreed with the annex, and with the printed departures pushed low.
In the release note, "both use one the angle governs now" becomes "both now use the height the angle governs".
* The two Annex B distances in the ISO 11690-3 entry are the ones the coordinates give
The entry said the position Table B.5 calls W2 is one metre from machine M2 and the one it calls W1 eleven metres from the nearer machine. From the printed coordinates they are 1,17 m and 11,42 m: W2 stands a metre away in plan but 0,6 m higher than the machine. Both now read 1,2 m and 11,4 m, in English and in Spanish. The argument does not change, since the near position is still the quieter one the table claims.
* The generated artefacts are regenerated on top of the measurement diagrams
Moving the layer onto main kept llms-full.txt, the materials absorbers bundle and the conformance artefact as this layer had written them, which dropped what the diagram stack added to the suspended ceilings guide and the ISO 4866 re-citation. Regenerated from the tree, they carry both.
Find the free-field corrections of a sound level meter on a calibrator, a coupler or an actuator, with their uncertainty and the verdict on it, by IEC 62585 (#880)
* A sound level meter's free-field corrections, their uncertainty and the verdict on them, by IEC 62585
The four measurement models of IEC 62585:2012: the adjustment value at the calibration check frequency fitted over the free-field response (Annex A), and the corrections for a multi-frequency sound calibrator, a comparison coupler and an electrostatic actuator (Formulas (D.7), (E.6) and (F.13)), averaged over the determinations with their range kept. The budget of Table I.1 is built on combine_uncertainty with its 15 components, the clause 6 component below 97 kPa and the Welch-Satterthwaite degrees of freedom, and the expanded uncertainties are verified against the maxima of clauses 9 to 14, with the range over the microphones for clauses 12 to 14. The exact frequencies of Annex H come from Formula (H.1). Every result plots, and the verdict renders the documentation of clause 15 n) and o) as a fiche.
* The IEC 62585 figures and example fiche, drawn by the results' own plot and report
Four figures for the free-field correction guide: the adjustment value of Annex A for a synthetic class 1 meter, its corrections on a calibrator and on an actuator, the budgets of Tables I.2 and I.3, and the clause 12 verdict on the calibrator's corrections, each in both languages and both themes. The example fiche renders that verdict. The descriptors a1 to a4 keep the ind subscript Table I.1 prints in the Spanish figure.
* IEC 62585 is checked against Tables I.2, I.3 and H.1, and three of its printed defects are errata
Fifteen conformance rows: the budgets of Tables I.2 and I.3, the 41 exact frequencies of Table H.1, the maxima of clauses 9 to 14 either side of each boundary, the clause 6 static-pressure component, and the three measurement models against the equations they are derived from. Table I.2 prints k = 2,11 beside its own 29,98 effective degrees of freedom, for which the factor at 95 % is 2,04, so the row pins the value the page's numbers give. Table H.1 prints the exponent of index 31 as 31/80, and Formulas (E.4) to (E.6) exchange the two readings in the coupler that Figure E.1 defines; all three are in the errata register. The module is mapped in the API reference and every new name has its row in the curated table.
* A guide to the free-field corrections of a sound level meter, by IEC 62585
The new guide under Calibration and uncertainty runs the adjustment value of Annex A on a synthetic class 1 meter weighed against the IEC 61672-1 tolerances, its corrections on a multi-frequency calibrator and on an electrostatic actuator, the budgets of Tables I.2 and I.3 with the coverage factor their own degrees of freedom give, and the clause 12 verdict with its fiche, in English, in Spanish and in the plain-Markdown mirror. The IEC 61183 guide now points to it, the guide counts and the indexes carry it, and the changelog says what was added. Grouped decimals in the new prose hold together with narrow no-break spaces, and the maths of the Annex E erratum no longer starts a line with a list marker.
* The IEC 62585 fiche names the clause's subject from the verdict it renders
The basis line read what each clause corrects for from a table of its own that repeated the one the verdict already carries; it now reads the verdict's subject, so the two cannot drift apart.
* The free-field corrections guide shows how each method's readings are taken
A diagram in "How the measurement goes" lays the three substitutions of
IEC 62585 side by side: the meter and the reference microphone in the free
field, then on a sound calibrator (Formula (D.7)), face to face on a
comparison coupler (Formula (E.6), with the labels of Figure E.1) or with an
electrostatic actuator on the meter (Formula (F.13)). The reference
conditions in the English table now read 101.325 kPa.
* A free-field correction's range is taken over its microphones, and its verdict derives the maximum it is judged against
IEC 62585 clauses 12 to 14 judge the range of the corrections measured with three microphones. FreeFieldCorrection now takes the range over the microphones' mean corrections, and the three correction functions take microphones= to say which determinations share one, so the nine determinations of three microphones on three calibrators are not judged on the spread between the calibrators.
CorrectionUncertaintyVerification derives maximum_uncertainty_db from its clause and frequencies instead of storing it, and compares with the rule of the IEC TC 29 conformance verdict, so a value that reaches its maximum through floating-point arithmetic is on it. A CorrectionUncertaintyBudget refuses a combination its own columns do not give.
The Table I.2 row pins the expanded uncertainty the page's own numbers give, 0,121 dB, which tells it apart from the misprinted 0,12(4); the clause 6 component is pinned either side of 3 kHz, and the adjustment value of Annex A gets a closed-form row. The verification axis names the range it also carries, the Spanish fiche keeps the U_max subscript, and the fiche's plot ends at the right margin.
* The IEC 62585 errata state the expanded uncertainty Table I.2's numbers give, and how far the printed (E.6) can be off
The Table I.2 entry now writes the expanded uncertainty from the unrounded factors, 2,0423 times 0,059031 dB, that is 0,121 dB with the guard digit 0,12(1), where it used to multiply the rounded factors. The Formulas (E.4) to (E.6) entry now says that the error of the printed (E.6), read with the labels of Figure E.1, carries the difference of the two channels' absolute sensitivities and is there at every frequency, since the reference channel reads the microphone's output voltage and the method needs no absolute calibration; it reduces to twice the difference of the two pressure responses only when both channels read sound pressure level.
* The free-field corrections guide groups determinations by microphone, and its diagram shows the coupler readings as the standard prints them
The guide shows how nine determinations of three microphones on three calibrators are grouped with microphones=, states the expanded uncertainty of Table I.2 as 0,121 dB, gives the actuator's 80 dB to 105 dB at 1 kHz as clause 14 does, and names what it covers as the calculations of Annexes A, D, E, F, H and I: the corrections of clauses 9 to 11 are judged against their maxima but not computed, which the IEC 61183 pages now say too, and the mirror of that guide links here.
In the diagram L_ind3a and L_ind3b are upright from end to end, as Figure E.1 and Table I.1 print them; (D.7) and (E.6) are marked as the forms that hold with stable sources, the coupler pair may be read together or in turn, and the footer's substitution at one place is said of the free-field pairs only.
* The generated pages follow the layers below
* The reference-microphone label is named once, and the repeatability's degrees of freedom are checked on their own
* The free-field corrections guide, written to the periodic test of IEC 61672 meters, is among the pages a search for IEC 61672-1 must lead with
Two books print the gases, and six cells of one of them are not served (#827)
* Two books print the gases, and six cells of one of them are not served
A gas table prints what a gas is rather than what one sample of it was
doing: the molar mass and the ratio of specific heats, which between them
fix every state the gas can be in. So the thirty-seven rows of Bies Table
C.2 and the six of Hopkins Table A1 become a catalogue of their own,
`fluids.PUBLISHED_GASES`, and `Gas.ideal_state` walks from that pair to a
`Fluid` at whichever conditions are asked for, with the page carried along.
Six cells of Table C.2 are not served as values. Four molar masses do not
belong to the molecule their row names, and two ratios of specific heats
are outside what the quantity can be. What makes those six a defect rather
than a convention is the other thirty-one: they reproduce their formula
mass to better than a twentieth of a per cent, so the table's own precision
is two parts in a thousand, against which the four exceptions are 1.6, 6.9,
50 and 110 per cent out. `CatalogueRow.misprinted` is the hedge for it, and
reading such a cell raises, quoting what the page prints and pointing at
the registry entry that argues it. The derivations of all three catalogues
treat it the way they treat a cell the page left empty.
* The pair closes an ideal-gas state, and the two books are a per cent apart on the speed
Three from the review, and the middle one is an arithmetic slip worth
stating plainly: the four per cent I claimed between the two carbon
dioxides is the difference on the ratio of specific heats, not on the
speed of sound, which goes as its square root and is 1,2 per cent apart.
The guides and the module said the two constants fix every state the gas
can be in. They close the ideal-gas state at a given temperature and
pressure, which is a narrower claim and the true one; the text now says so
and points at IDEAL_GAS_VALIDITY for what that closure is worth.
And the filter on the gases table said "Filter by material" over a
placeholder reading methane, argon, steam.
* A filter example that finds nothing is worse than no example
The Spanish placeholders named materials the filter cannot find. It
matches what a row carries, which is the material name as its book prints
it, and every book behind these tables prints English: "hierba" found
none of the eleven grasses, "metano" none of the methane. The gas
placeholder I added yesterday had the same defect, and so did the ground
one already there.
All six now carry terms that resolve, with a comment saying why they are
not translated, because translating them is the obvious thing to do to a
string in a copy object and it is what breaks them.
A hearing protector's measured attenuation comes with its uncertainty and significance test, and an active noise reduction earmuff with its total attenuation (#866)
* A hearing protector's measured attenuation comes with its uncertainty and a test of whether two measurements differ
ISO 4869-1:2018 is where the attenuation grid of ISO 4869-2 comes from, and
none of it was implemented. hearing.real_ear_attenuation takes the individual
attenuations, or the open and occluded thresholds they are the difference of,
and returns per test signal the mean, the standard deviation, u = s/sqrt(N) and
U95 = 2u of Annex A; its grid goes into assumed_protection_value, hml_rating
and snr_rating unchanged, and .plot() draws the mean downwards on the IEC 60263
grid Clause 6 l) asks for.
hearing.assess_attenuation_difference applies the Annex B test band by band,
hearing.minimum_significant_difference gives its sqrt(2) U95 form, and the
typical budgets of Tables A.2 and B.2 are published as their three components,
with the combined and expanded values derived. hearing.check_reat_sound_field
judges the test room against 4.2.2 and Table 1.
Every derived cell of Tables A.2, A.3, B.1 and B.2 and the four minimum
differences of B.1.1 and B.2 are conformance rows. B.1.1 and B.2 compute those
differences from the rounded U95 their tables print and write that input out,
so they are a stated convention, not a misprint; the unrounded earplug values
are 3.21 dB and 9.37 dB, and the module and the guide say so.
* An active noise reduction earmuff's total attenuation, its uncertainty and where it stops being linear
ISO 4869-6:2019 was not implemented. hearing.active_insertion_loss takes the
MIRE levels at both ears with the circuit off and on, or the insertion loss
directly, keeps the ear with the lower value in each band as 5.5 b) asks, and
returns the mean, the standard deviation, u = s/4 and U95 = 2u of Annex A. The
typical budget of Table A.2 is hearing.ANR_WITHIN_LABORATORY_UNCERTAINTY, an
instance of the ISO 4869-1 budget type.
hearing.anr_total_attenuation runs the chain of 5.5: the ISO 4869-1 attenuation
interpolated into one-third octaves linearly in hertz, as the calculation
workbook ISO publishes with the standard does it, the lower-ear insertion loss
added, Formula (1) back to octave bands, and the ISO 4869-2 APV, HML and SNR at
84 %. hearing.assess_anr_linearity finds the highest external level up to which
every ear follows the 5 dB steps of 5.4.4 within 1 dB. Each result has .plot().
The mean and standard deviation of Table A.3 and every stored step of the
workbook are conformance rows; the workbook rounds each step to 0.1 dB and the
library does not, so its octave totals agree to within that rounding. Table
A.3 forms its u and U95 rows from the rounded row above each, which puts one u
cell and six of its eight U95 cells a tenth above the values A.1 and A.2 define;
the library returns the defined values, the table's own arithmetic is a
separate conformance row, and the defect is registered in the errata.
* The active insertion loss reads its three inputs through one helper each
active_insertion_loss splits into a helper for an insertion loss given
directly, one for the loss formed from the passive and active levels, and one
for the band frequencies, so each form is read in one place. The APV84 and
5 dB step labels of the hearing plots are named once. No result changes.
* The active noise reduction section states the scope of ISO 4869-6
Its methods are meant for steady noise exposures and do not apply to noise
with impulsive components (Clause 1); the guide now says so in English, in
Spanish and in the docs mirror.
Four more printed tables, a guard that they reach the reader, and an index of the fiches (#845)
* Seventeen damping materials, and the temperature their loss factor peaks at
Every loss factor this library held until now was one number. Bies prints
0.0001 for steel, Cremer 0.0002 for a different steel, Hopkins an estimate for
plasterboard, and none of them says at what temperature or at what frequency,
because for a metal it hardly moves. For a viscoelastic damping treatment it
moves by two orders of magnitude, and a single number is not a property of it
at all: the loss factor peaks in the narrow band where the polymer is worked
near its glass transition, and that band climbs in temperature as the
frequency rises.
TABLE 14.1 of Vér and Beranek is the only table in this corpus that prints
that. Seventeen commercial materials, each with the greatest loss factor it
reaches and the temperature at which it reaches it at 10, 100 and 1000 Hz,
plus the modulus at the stiff end, at the soft end, in the transition and the
imaginary one.
The page is in degrees Fahrenheit and pounds per square inch, so every
converted cell is marked as derived and says what was printed. Its footnote
offers 7e3 to reach N/m2 and this catalogue does not take it: a psi is
6894.757293 Pa by definition, and the rounded factor is 1.5 per cent above
that, which is larger than the last digit the page prints. A test pins the
difference so nobody quietly restores the shortcut.
Two readers transcribed the page without seeing each other's work: 136 cells,
no difference, including the eight temperatures set with a true minus sign and
the three glyph strings the printing corrupted. Those three are registered in
docs/ERRATA.md and the rows refuse them rather than finishing the number
themselves.
* A hundred and thirty-two rows from four more tables, and a page that lists the fiches
Four catalogues join the published tables: forty-eight floor and ceiling
assemblies with their impact insulation class (Harris 3e Tables 32.1 to 32.8),
forty-six duct walls with breakout and break-in kept apart (ASHRAE 2019
Chapter 49 Tables 29 to 34), twenty-nine resistive facings (Ver & Beranek 2e
TABLES 8.5 to 8.7) and nine machine equipment room constructions that join the
transmission loss table (ASHRAE Chapter 49 Table 40). Each was read twice from
the pages by readers who never saw each other's work, compared cell by cell,
and the second reading is the oracle the suite holds the catalogue against.
A new guard requires every published catalogue to reach the page that
publishes catalogues. It found six that never did, two of them years old, and
they are on the page now.
The source census learned to recognise an organisation that writes its own
handbook. It required a comma or a full stop after the lead of a bibliography
entry, so ASHRAE (2019) never matched and three tables already in the package
were uncited without the gate noticing.
The catalogues page shows one catalogue at a time, with a single panel that
chooses the category, the name and the book; the notes behind a dotted
underline open on a tap. Every fiche the library ships is listed at
/reference/reports/, built from the declaration each guide already carries, and
the landing page counts material values instead of figures.
* The generated indexes list the three new modules and the fiche index
* The machine-readable index names the catalogues and the fiches
* The errata pages carry the entries the branch added
* A row whose own page contradicts itself, and fourteen other things an adversarial read found
3M ISD-113 was published with a transition modulus below its own smallest
modulus. The page prints both, and the same page defines the smallest modulus
as the smallest value there is, so the two cells contradict each other and
nothing on the page says which is wrong: the printed transition modulus is
supported by its neighbour through the chapter's own relation, while every
other row puts it one to two orders of magnitude higher. Both are served as
printed, the row says so, the errata registers it in both languages, and a
test now requires the ordering on every other row.
The derived markers on that table were asserted on one row and two fields.
Deleting the rest left the suite green, which would have let a converted value
be served as a reading off the page. Every converted cell of every row is now
checked, and so is the printed figure kept beside it.
The catalogue guard matched a substring, so a catalogue whose name is a prefix
of a registered one would have been reported as reaching a page that had never
heard of it. There are three such prefixes in the tree already. It now matches
whole words, and attributes a catalogue to the module that defines it rather
than to the parent package that re-exports it.
A frequency of infinity reached the integer conversion before the catalogue
looked at it, so a method that documents ValueError raised OverflowError.
The rest are sentences that said something the repository does not: the
diameters of the round ducts given as a closed set that left out the spiral
blocks, every cell of the damping table called converted when the loss factor
is dimensionless and is not, a loss factor attributed to Cremer as one number
when the book prints an interval, the double-unit pairs of the Harris tables
counted as three hundred and twenty when they are three hundred and twenty-one,
a provenance note pointing one row up instead of two, two attribute names
abbreviated in the API table until they no longer existed, and a fiche index
that wrote "1 fiches".
* Two sources the Spanish bibliography did not carry, and a label that counted the wrong thing
The Spanish bibliography had neither ASHRAE (2019) nor Harris 3e, both of
which the Spanish catalogues page now cites. They are written as Spanish
rather than translated, in the section and the alphabetical position each one
belongs to.
The landing page called its catalogue number "material values read from
printed pages". It counts rows rather than values, it includes fluids, gases,
air conditions and duct walls rather than materials alone, and some of those
rows were computed from a printed geometry rather than read off a page. It now
says what is true of all of them: published catalogue rows, each naming the
source it came from.
The source census widened one of its two bibliography patterns and not the
other. The narrow one is not reachable today, because a corporate designation
carries its year and the full stop follows it, but one written without a year
would have been rejected against an entry that has one. Both now read the
same.
`published-catalogues` joins .PHONY, and docs/README.md records the fiche
index and why it has no hand-written mirror, next to the catalogues entry that
carries the same exemption.
* The one assertion in the duct-wall tests that read expected-first
How often a distant blast is how loud: the ISO 13474 distribution of its sound exposure level (#868)
* How often a distant blast is how loud: the ISO 13474 distribution of its sound exposure level
environment.sel_distribution turns the levels of a set of replica atmospheres and their probabilities into the statistical distribution of ISO 13474:2009 clause 5: the ordered classes with their boundaries and densities, the subclasses, the Gaussian spread for turbulence shifted by Equation (22) so that each subclass keeps its energy, the probability of exceeding a level and the level exceeded by any percentage of the events, and both long-term levels of Annex A. long_term_sel gives Equations (7) and (8), with the rating adjustment K; frequency_weighted_sel the weighted level of Equation (5); replica_probabilities the joint probability of Equation (14); turbulence_level_shift the shift in closed form. SelDistribution.plot draws the class density, the spread density or the exceedance curve.
Equal levels keep their own classes, as Annex A keeps its pairs at 30,8 dB and 31,8 dB; only a run that would leave a class of no width is combined. Table A.4 is reproduced digit for digit from Table A.3 in the tests.
* Annex A of ISO 13474 is checked against the page, and two of its numbers are errata
Eight conformance rows start from Table A.3: the 81 levels and boundaries, the 27 probabilities and the 27 densities of Table A.4 to the printed digit, LT1 and LT2 of Figure A.3, the median level, the shift of Equation (22) against the printed integral evaluated by quadrature, and all five exceedance levels of Figure A.3.
Two things in the annex do not follow from its own equations and are in the errata register, in English and Spanish. The running text gives the shift as 1,04 dB with a standard deviation of 5 dB, where Equation (22) gives 2,878 dB; 1,04 dB is its value at 3 dB, and LT2 and Figure A.2 were computed with 2,878 dB. And four of the five exceedance levels of Figure A.3 are not the roots of Equation (25): they are reproduced to the printed digit by a curve accumulated from the 15 dB its axis starts at, which is how the row that holds them reads the figure.
* A guide to how often a distant blast is how loud, in English and Spanish
The new page under Assessment and regulation runs the TOW launcher of ISO 13474 Annex A from its band levels to its exceedance curve: the weighted level of a replica atmosphere, the long-term and rating levels, the classes of Table A.4, the spread for turbulence and why it is shifted, and the five exceedance levels of Figure A.3, with the two figures the result's own .plot() draws. It is registered in the sidebar, the guides index (now 139 guides) and the section overview in both languages, with its GitHub mirror, and the CHANGELOG says what arrived.
* The long-term line in the ISO 13474 figures says it is LT2
Figure A.3 prints two long-term levels, LT1 from Equation (7) and LT2
from the spread distribution, and both read 37,0 dB. The dashed line of
the density and exceedance views is LT2, and its legend now names it:
"LT2 (long-term level) 37.0 dB", "LT2 (nivel a largo plazo) 37,0 dB".
* The environment overview lists the ISO 13474 guide
The overview of the environment topic named every guide of its sections
except the new one. It now lists "Impulsive Sound Exposure Statistics
(ISO 13474)" under assessment in English and Spanish, names ISO 13474 in
its description and in the paragraph on the assessment pages, and the
docs mirror and the environment llms file carry the same text.
* Figure A.3's printed percentiles of ISO 13474 are a hypothesis, not a conformance row
Four of the five exceedance levels printed on Figure A.3 are not the roots
of Equation (25). A curve accumulated from 15 dB, where the drawn curve
begins at exactly 1, reproduces all five only when it is fed the rounded
07:00 to 19:00 column of Table A.3; with the full-precision probabilities
that reproduce Table A.4 it gives 48,05 dB for L1, which prints 48,1. The
row that pinned the five levels on that reading is gone (1288 checks), the
50 % level stays a row, and the errata entry, the guides, the reference
data and the tests present the reading as a hypothesis with both numbers.
The LT2 row now integrates the library's spread density weighted by
10^(0,1 x) instead of reading the closed form off the result, so the sign
and size of the shift reach the number it checks.
A third Annex A entry goes to the errata register: the paragraph above
Table A.3 credits the level of each excess-attenuation class to Equations
(7) and (8), the long-term averages, where Equations (4) and (5) give it.
The register and the headers describe BS ISO 13474:2009 as the UK
implementation of the standard, which is what its national foreword says,
the equal-levels note no longer puts an "only" in the standard's mouth,
and the quoted shift is written with the Greek mu the page prints.
The tests hold the peak of Figure A.2 to what the printed curve resolves,
every published array of SelDistribution as read-only, and the probability
tolerance on both sides: a set 2 % from one is refused, a table rounded to
four decimals is accepted.
* Regenerate the derived pages on top of the ISO 11819-1 merge, and count the new guide as the 140th
* Refresh the llms files with the conformance count of the merged branch
Judge a hearing loop by IEC 60118-4 and its amplifier, loop and neck loop by IEC 62489-1 (#908)
An installed hearing loop can now be judged by IEC 60118-4 with its Amendment 1: the field reaches its level at one point, stays within 3 dB over the useful volume, keeps its frequency response and its noise, a refuge or a counter is judged at the points of Figures 2 and 3, and the amplifier passes the overload test at the frequency of Table 4. Its components are measured by IEC 62489-1: the Biot-Savart field of a rectangular loop, the current and size a loop needs, its resistance, inductance and impedance, the amplifier's maximum current, compliance voltage, noise, response, AGC range and quadrature error, and a neck loop against the two types of the draft Amendment 2. Every result draws its own figure, a new guide in both languages walks a place of worship, a counter, an amplifier and a neck loop through both standards, the conformance report gains 67 rows and thirteen printed defects are in the errata register.
A resilient layer is a catalogue row, and the dynamic-stiffness functions name their units (#865)
* A resilient layer is a catalogue row, and the dynamic-stiffness functions name their units
ResilientLayer is now an io.CatalogueRow like every other published row: its
quantities are optional, it carries the hedges a page can print in place of a
number, and Hopkins Table A3 moves out of the module into
materials/resilient/data/hopkins-2007-table-a3.json. PUBLISHED_RESILIENT_LAYERS
is keyed "hopkins-2007-table-a3/<row>" like every catalogue, and the credit of
the four rebond foams is attributed_to["row"].
The row gains apparent_dynamic_stiffness_n_m3, the apparent stiffness s't of a
test specimen, beside dynamic_stiffness_n_m3, the s' of the installed layer
that Formula 2 takes. The heading of Table A3 prints s', which the book's List
of symbols (PDF page 23, printed p. xxii) defines as the stiffness of the
installed material and keeps apart from the apparent s't, and Section
3.11.3.1.2 (PDF page 387, printed p. 360) uses the two the same way. So the
fifteen rows keep their values in dynamic_stiffness_n_m3, every number they
returned before they return now, and no packaged row holds an s't; the module
banner and the reference data stop calling them s't.
A layer that gives only s't goes through EN 29052-1 clause 8.2 on its way to
Formula 2. natural_frequency takes the lateral airflow resistivity as
airflow_resistivity_pa_s_m2, in the unit every catalogue holds it in, divides
it by a thousand for the kPa thresholds (which moves no value across either
threshold), and below 100 kPa s/m2 takes the enclosed-gas stiffness as
gas_stiffness_n_m3. Without the resistivity it refuses with CatalogueError,
saying that s't is not s' and what to pass. A layer that gives s' refuses the
two keywords, since nothing would read them.
The functions of the module name their units: resonant_frequency_hz,
total_mass_per_area_kg_m2, thickness_m, apparent_stiffness_n_m3,
airflow_resistivity_kpa_s_m2, gas_stiffness_n_m3, dynamic_stiffness_n_m3,
mass_per_area_kg_m2 and floor_mass_per_area_kg_m2. The resistivity of
installed_dynamic_stiffness is taken by name only, because it is the one
quantity here in kPa s/m2, and below 100 kPa s/m2 a missing gas term is no
longer read as zero. There are no aliases; the migration guide lists every
rename.
The catalogue page generator sends the resilient layers through the same
section() as every other row type instead of building their keys and credit
by hand, and the page data it writes is byte for byte what it was. The golden
fingerprint gains a step that re-keys the fifteen rows, names their table and
turns the credit into a mapping, and a test pins that it moves those rows and
nothing else.
* A bound on a layer's s't is refused by name, and Table A3's blank densities say where they come from
A resilient layer whose apparent stiffness s't is a declared bound, with no
value of s' either, used to fall through to the refusal for s' and say the
page gave no stiffness at all. It now names the s't cell and its bound and
says why no resistivity or gas term turns it into s'. A row that gives s'
refuses the enclosed-gas stiffness passed on its own, as it already refused
the resistivity, and both refusals are tested.
Hopkins Table A3 prints four densities once for a block of rows and leaves
the cell blank on another row of it. Those four rows now carry the figure
marked carried, naming the row that prints it, as Ver and Beranek Table 8.7
does, and the catalogue page shows them as carried with the same values. The
fingerprint step for the resilient layers lists them.
The guide says what a test report gives under EN 29052-1 clause 9 e), s't
and s'a with s' only if possible, takes the thickness of Formula 7 under the
test load that clause 9 b) has the report state, shows the refusal as it
prints, and quotes Hopkins for how large the enclosed-gas term can be.
Give the tree a formatter, and a gate that keeps it (#602)
* Give the tree a formatter, and a gate that keeps it
Ruff was the linter and nothing was the formatter. There was no
`[tool.ruff]`, no `ruff.toml`, no pre-commit and no `.editorconfig`, and CI
ran `ruff check .` on ruff's default rules alone, which are four families of
outright errors. Nothing looked at shape, so 673 of the 812 Python files had
drifted from any single style.
The line length is 88 because that is what the tooling defaults to and,
measured, what moves this tree least: 100 rewrites 708 files and 120 rewrites
717, since a longer limit rejoins lines that were split by hand. Only 0,8 %
of the lines here were over 88 to begin with.
Markdown stays out of it. Ruff formats fenced Python inside `.md` and does
not recognise `.mdx` at all, and every snippet in `docs/` is mirrored by hand
into the site in English and Spanish, so formatting one copy would drift the
three apart with nothing to notice. Those snippets also align their trailing
comments to show what each line prints, which is a teaching device.
The linter now selects the families this tree already satisfied or nearly
did, and the fifty-odd findings they raised are fixed. Two of those fixes are
worth naming because the formatter caused them: reflowing a call moves a
`# type: ignore` onto a line that no longer holds the error it silenced, and
mypy caught four such cases. One rename is reverted with the reason written
down, because renaming an unused binding moves the fingerprint the clip
freshness gate reads, and that is not worth re-rendering an FDTD animation.
* Keep the reformat out of git blame
A tree-wide reformat stands in front of every line it touched. This file
names it so `git blame` walks past, which GitHub honours without any
local configuration and which `git config blame.ignoreRevsFile` turns on
for a checkout.
* Stop selecting the rule that reads a constant as a literal
SIM300 calls any upper-case name a literal, and on that reading it gets
three idioms in this tree backwards.
`spectrum[OCTAVE_BANDS == f]` is a numpy mask, not a condition.
`res.transmission_loss[BANDS <= f0]` reads "the bands at or below f0" until
it becomes `f0 >= BANDS`. And `value == pytest.approx(x)` is how pytest is
written here: 1755 of the 2065 `pytest.raises`-adjacent assertions in the
suite already put the expected value on the right.
It is right about two of the nineteen it finds and wrong about the other
seventeen, and SonarCloud caught the result as `python:S3415`, assertions
whose argument order no longer agrees within a file. The nineteen are
reverted by rebuilding those files as they would have been had the rule
never been selected, which keeps the `C420` and formatting changes two of
them also carry.
A hundred and nineteen rows a solver produced, filed where nobody can mistake them for measurements (#841)
* A hundred and nineteen rows a solver produced, filed where nobody can mistake them for measurements
Cox & D'Antonio 3e Appendix C is three tables of correlation scattering
coefficients, and none of them was measured. Two are three-dimensional
predictions of 3 m by 3 m single-plane diffusers, at normal and at random
incidence, over the bands from 250 Hz upward because the book says the
coefficient below that should be taken as zero and prints nothing there. The
third is two-dimensional, covers 100 Hz to 5 kHz, and prints three lines per
surface at 0, 56.9 and random incidence.
They go in `PUBLISHED_PREDICTED_SCATTERING` and not in the measured catalogue
next to them. A row that reads 0.45 because a solver said so and a row that
reads 0.45 because a reverberation room said so are not interchangeable, and a
caller who mixed them would have no way of finding out afterwards, so the two
have a class each, no key in common, and a test that says so.
`PredictedScatteringSpectrum.model` names the solver on every row.
The book is unusually frank about what these are worth, and the `about` of
each table quotes it with the page: the coefficient reads absorption as
scattering, so the formulation needs revising for a surface that absorbs; the
random incidence values of the two-dimensional table run high at low
frequencies; and the coefficient reads a redirection as a dispersion, so a
45 degree triangle that sends a strong reflection straight back scores as if
it had scattered.
Three things the tables do that a reader has to be told about, and all three
are kept as printed. Each group of the three-dimensional tables closes with a
row labelled "h/L = 20" or "h/L = 40", which cannot be read at face value
since every surface of every group has L = 20 cm and h at most 10 cm; read as
a percentage they resolve, and three of the six carry exactly the values of a
row of their own group, which is what settled the reading. The book explains
them nowhere. One row of Table C.2 is printed twice on one page, as the
reference of two comparisons. And one surface appears in two sections of
Table C.3 with the same fifty-four values, the way the same surface appears
twice in Appendix B.
The two three-dimensional tables print a source line under their last group,
which the appendix's one-item reference list resolves to Lee and Sakuma
(2015). That reference and the source line disagree about the page range,
129-36 against 129-136; the reference list's is the one carried here.
Read twice from the pages by readers who never saw each other's work: 1942
cells, no difference, and the same sixty-seven descriptions and headings on
both sides. Six deliberate defects were injected to watch the tests fail
against them, including the four empty low bands filled with zeros and the
two-dimensional table relabelled with the three-dimensional solver.
* The eighteen band fields were declared twice, and Sonar counted them
The measured catalogue and the computed one carry the same eighteen optional
fields, because a scattering coefficient is a scattering coefficient whoever
produced it. Declaring them in both classes put the duplication of new lines
at 3.9% against a gate of 3, and the gate is right: two copies of a field
list are how the two classes drift apart, one gaining a band or a docstring
that the other never gets.
They now come from one private declaration that both inherit. What the two
public classes keep is what is actually theirs: which kind of number the row
holds, and, on the predicted side, the angle it was computed at and the
solver that computed it.
Neither inherits from the other, which is the point of having two. A caller
narrowing on the type still gets a straight answer about whether a turntable
or a solver produced the row, and the test that says so is unchanged and
still passes.
* The solver reaches the table, and the repeated row says it is the repeat
Two things the layer promised and did not deliver, both found in review.
The prose says every predicted row identifies the solver that produced it,
and the rendered table could not show it: `model` never left the library. It
travels now, as text and never through the cell formatter, which expects
numbers, and it has a column of its own headed "Computed with" that appears
only where a catalogue has computed rows. A coefficient a boundary element
model produced and one a reverberation room measured are the same number and
not the same evidence, and that has to be visible before the number is used.
And the note of the data file says the second printing of one batten row
carries a note saying it is the repeat. It did not. The two rows are
identical in name, group and all thirteen values, so without it a reader has
no way to tell them apart, which is the one thing the note existed to do.
* Sixteen characters broke the solver into six lines, one word each
Read the glossary on a phone, and file the code the way the pages are filed
Read the glossary on a phone, and file the code the way the pages are filed
The glossary was 120 terms spread across markdown tables that read badly on a
phone. It now comes from one source rendered as cards, each term carrying its
symbol, unit, standard, clause and the guide that teaches it, with the guide
link text read from the content collection at build time so a slug that stops
existing fails the build instead of rotting. Three example fiches the guides
described but never showed are generated now, found by a new per-language check
that every committed fiche is actually shown on a page. A topic's landing page
lists what it holds on a phone, and the byline moved off the top of every page
into the footer.
Then the code got the same treatment. scripts/generate_graphs.py had reached
21020 lines; three rounds of splitting brought the largest file in the
repository down to 2862, which is the flat API surface and cannot be shorter.
Files over a thousand lines went from 41 to 40, and that is the point: splitting
a 21000-line file yields several of a thousand, and what changed is that none of
the remaining ones has an honest seam left. CONTRIBUTING now states the rule
those splits followed: there is no line limit, the test is cohesion, and a split
is a move proven by byte-identical generated output.
Splitting a module moves names between modules of the same package, and a
deprecated 3.x import path names only one of them, so 47 names would have
stopped resolving through a path that still promises a warning until 5.0.
_compat.py now knows which modules a split fed, and a test holds every name to
that promise.
Auditing the layout afterwards turned up four things the splits had damaged and
nothing had noticed: the pre-commit hook had quietly stopped regenerating the
conformance report, CONTRIBUTING pointed contributors at a file that holds no
figure builders any more, one figure could not be generated at all because
moving its builder left a parent count one level short, and one renderer was
filed under a result name instead of its domain. Six test files move to
directories that already carried their subject, two guides move into the
directory their sidebar group is named after, and eight section indexes stop
listing pages from other sections under a heading that reads as an inventory.
The ANP fleet database, the bridge from the EASA tables to the ECAC Doc 29
chain, had five public names and no guide: it appeared only in the generated
reference, where you have to already know the name to find it. It has a page in
both languages now, with two figures drawn off a real aircraft record, and it
states the limit nothing user-facing did: only the 13 aircraft with fixed-point
profiles have a ready-to-use trajectory.
Verified throughout by regenerating what the code produces: 1700 committed
figures match within tolerance, 70 fiches byte for byte, docs/CONFORMANCE.md
identically with its 533 checks passing, 8011 tests, and the site building and
validating in both languages.
Find what a sound level meter reads in a field from every direction, by the IEC 61183 free-field and diffuse-field methods (#877)
* A sound level meter's response to sound from every direction, by IEC 61183
metrology.directivity_factor takes the levels a meter indicates at equal
angular steps in two planes, or in four when the reference direction is not
normal to the diaphragm (NOTE 2 of A.6), and returns its directivity factor
by Formula (A.3). metrology.axisymmetric_directivity_factor does the same
from one plane for a rotationally symmetric meter (Formula (A.4)), and
metrology.equal_area_directivity_factor from the 38 equal-area directions of
the note to A.1.8 (Formula (A.5)), whose angles
metrology.equal_area_incidence_angles computes from the construction rather
than from the printed list.
metrology.adjustment_factors gives the weights of Formulas (6), (7), (A.1)
and (A.2) for any angular step that divides 180 degrees and any number of
planes, metrology.largest_element_fraction the largest element of that
division, and metrology.SphereDivisionWarning is raised when it passes the
3 % of A.1.6. metrology.random_incidence_sensitivity applies Formula (1)
band by band, and metrology.diffuse_field_sensitivity the three routes of
Formulas (8) to (11), taking the directivity factor and the
diffuse-to-pressure difference of the reference microphone from
metrology.IEC61183_TABLE_B1 unless it is given others. Every result has
.plot(): the polar response of each plane and the weight of each reading,
the sensitivity levels and the correction against frequency, and the three
terms of the diffuse-field comparison.
The readings at 0 and 180 degrees enter both plane sums of Formula (A.3).
That is what makes the 72 factors of Table A.1 sum to one and an
omnidirectional meter read gamma = 1; counted once, as the paragraph under
the formula could be read, they sum to 0,998097 and every directivity index
comes out 0,008 dB high. The tests hold all ten rows of Table A.1 to their
five decimals, the 2,2 % of A.1.7, the halving of NOTE 2, the convergence
of the sum to the integral of Formula (3) on a cardioid, and every column of
every result as read-only.
* IEC 61183 Annex A is checked against the page, and two of its equal-area angles are errata
Eight conformance rows reproduce what IEC 61183:1994 prints for its
free-field and diffuse-field methods: the adjustment factor of each of the
36 angles of a plane to the five decimals of Table A.1, the same factors
halved for the four planes of NOTE 2 of A.6, the largest of the 70 elements
of 10 degree steps (2,179 % against the "approximately 2,2 %" of A.1.7), the
72 factors summing to one with the poles in both sums of Formula (A.3), an
omnidirectional meter reading 10 lg gamma = 0 dB, the directions of the
equal-area division of the note to A.1.8 and its 2,6 % element, and the 60
cells of Table B.1 that Formulas (10) and (11) take by default.
The note to A.1.8 prints its twenty equal-area angles to 0,1 degree, and two
of them break the list's own symmetry about grazing incidence: every pair of
the list sums to 180,0 degrees except 77,9 + 102,2, and 282,1 mirrors 77,9
where 257,8 mirrors 77,8. The direction that halves each element's area in
polar angle reproduces the other eighteen and gives 77,846 and 282,154
degrees. The entry is in the errata register in English and Spanish, and the
row on the note checks the eighteen and names the two.
* A guide to what a sound level meter reads when sound arrives from every direction
The new page under Calibration and uncertainty runs both methods of
IEC 61183:1994 on a synthetic meter, a microphone whose directivity at each
band is the one Table B.1 prints for an LS2aP/LS2F microphone, on a case
that narrows it in one plane: the directivity factor of Formulas (2) and
(3), the weight each 10 degree reading takes by Table A.1 and why the poles
enter both plane sums, the one-plane and 38-element alternatives with the
two misprinted angles, the random-incidence sensitivity level band by band,
and the diffuse-field comparison with a pressure-calibrated reference, which
returns the level the anechoic measurement gave. The three figures are drawn
by the results' own .plot().
It is registered in the sidebar, the guides index (now 141 guides), the
signal-analysis and calibration overviews in both languages and the docs
index, with its GitHub mirror, and the CHANGELOG says what arrived.
* Annex B of IEC 61183 recommends two reference microphones, and Table B.1 prints the first
The guide, its mirror and the docstrings said Annex B recommends a type
LS2aP/LS2F microphone for the reference of the diffuse-field method. B.1.2
recommends a type LS2aP/LS2F or a type LS2bP, and Table B.1 prints the
characteristics of the first; the text now says both, and which one the
table is for.
* The Spanish IEC 61183 guide takes a title the page head can carry
"Respuesta en incidencia aleatoria y campo difuso (IEC 61183)" ran past the
seventy characters a page title may have once the site name is appended, and
html-validate refused the built page. The guide is now "Incidencia aleatoria
y campo difuso (IEC 61183)", and the guides index and the two overviews that
link it use the same words.
* The diffuse-field figure keeps Formula (8) in the symbols IEC 61183 prints
The Spanish variant of the diffuse-field figure draws the legend entry for the
level difference of Formula (8) exactly as the English one does, with the
subscript D,ref the standard writes. The language gate read ref as an English
word; the label is listed among the strings that stay as they are by design,
with that reason.
* The IEC 61183 guide draws both measurement set-ups, its figures come from the code it prints, and a directivity factor checks itself
Counting the pole readings of Formula (A.3) once puts 10 lg gamma high by -10 lg(1 - gamma K(0) [p(0) + p(180)]): 0,008 dB for an omnidirectional meter and about 0,02 dB at 7 dB. The module notes, the guide and the changelog now say so instead of quoting the omnidirectional figure for every meter, and a test checks the general expression on a directional pattern.
DirectivityFactor refuses a formula other than A.3, A.4 or A.5, a reference level that is not finite and a largest element that is not a fraction of the sphere; the field is named largest_element_fraction. Every refusal names the parameter it is about.
The polar response lays its own figure out with the legend inside, labels its radial scale in dB, and runs the equal-area X-Z curve through the poles it shares with the X-Y plane. The one-plane weights title counts two elements to a reading. G_RI and the diffuse-field reference and difference are drawn with open markers, so the curves stay visible where they coincide.
The guide builds the synthetic meter at every preferred frequency of Table B.1 with a free-field level that rolls off above 10 kHz, so its figure code draws the published figures; it gains a drawing of the anechoic and reverberation-room set-ups with the requirements of each clause. It now says what IEC 61672-1:2013 asks of the random-incidence response (5.5.4, 5.5.5) and what IEC 62585 corrects, and attributes the signal-to-noise ratio to A.2.3.
The Table B.1 conformance row counts the 30 printed cells rather than 60.
* The generated pages follow the layers below
* The guides index counts the random-incidence guide, the IEC 61183 plot labels are named once, and the step check reads as the test it is
Calibrate laboratory standard microphones by reciprocity, in a coupler by IEC 61094-2 and in a free field by IEC 61094-3 (#919)
Three laboratory standard microphones measured in pairs now give their complex sensitivities with no reference microphone: in a closed coupler by IEC 61094-2:2009, and in a free field by IEC 61094-3:2016 read with its corrigendum COR1:2016. Until now the library held only Annex F of IEC 61094-2, the humid air; the primary calibration that air exists for is here in full, in phonometry.metrology, with the coupler impedances of Annexes A, B, C and E, the free-field attenuation of Annex B of IEC 61094-3, the checks of each set-up and the uncertainty budgets keyed by Table 1 of each part. Three printed defects go to the errata register: the radius heading Tables B.1 and B.2 of IEC 61094-2, the factor -j that Formulas (8) and (9) of IEC 61094-3 drop, and a coefficient of the saturation vapour pressure in its Annex B.
Four more printed tables, a guard that they reach the reader, and an index of the fiches (#845)
* Seventeen damping materials, and the temperature their loss factor peaks at
Every loss factor this library held until now was one number. Bies prints
0.0001 for steel, Cremer 0.0002 for a different steel, Hopkins an estimate for
plasterboard, and none of them says at what temperature or at what frequency,
because for a metal it hardly moves. For a viscoelastic damping treatment it
moves by two orders of magnitude, and a single number is not a property of it
at all: the loss factor peaks in the narrow band where the polymer is worked
near its glass transition, and that band climbs in temperature as the
frequency rises.
TABLE 14.1 of Vér and Beranek is the only table in this corpus that prints
that. Seventeen commercial materials, each with the greatest loss factor it
reaches and the temperature at which it reaches it at 10, 100 and 1000 Hz,
plus the modulus at the stiff end, at the soft end, in the transition and the
imaginary one.
The page is in degrees Fahrenheit and pounds per square inch, so every
converted cell is marked as derived and says what was printed. Its footnote
offers 7e3 to reach N/m2 and this catalogue does not take it: a psi is
6894.757293 Pa by definition, and the rounded factor is 1.5 per cent above
that, which is larger than the last digit the page prints. A test pins the
difference so nobody quietly restores the shortcut.
Two readers transcribed the page without seeing each other's work: 136 cells,
no difference, including the eight temperatures set with a true minus sign and
the three glyph strings the printing corrupted. Those three are registered in
docs/ERRATA.md and the rows refuse them rather than finishing the number
themselves.
* A hundred and thirty-two rows from four more tables, and a page that lists the fiches
Four catalogues join the published tables: forty-eight floor and ceiling
assemblies with their impact insulation class (Harris 3e Tables 32.1 to 32.8),
forty-six duct walls with breakout and break-in kept apart (ASHRAE 2019
Chapter 49 Tables 29 to 34), twenty-nine resistive facings (Ver & Beranek 2e
TABLES 8.5 to 8.7) and nine machine equipment room constructions that join the
transmission loss table (ASHRAE Chapter 49 Table 40). Each was read twice from
the pages by readers who never saw each other's work, compared cell by cell,
and the second reading is the oracle the suite holds the catalogue against.
A new guard requires every published catalogue to reach the page that
publishes catalogues. It found six that never did, two of them years old, and
they are on the page now.
The source census learned to recognise an organisation that writes its own
handbook. It required a comma or a full stop after the lead of a bibliography
entry, so ASHRAE (2019) never matched and three tables already in the package
were uncited without the gate noticing.
The catalogues page shows one catalogue at a time, with a single panel that
chooses the category, the name and the book; the notes behind a dotted
underline open on a tap. Every fiche the library ships is listed at
/reference/reports/, built from the declaration each guide already carries, and
the landing page counts material values instead of figures.
* The generated indexes list the three new modules and the fiche index
* The machine-readable index names the catalogues and the fiches
* The errata pages carry the entries the branch added
* A row whose own page contradicts itself, and fourteen other things an adversarial read found
3M ISD-113 was published with a transition modulus below its own smallest
modulus. The page prints both, and the same page defines the smallest modulus
as the smallest value there is, so the two cells contradict each other and
nothing on the page says which is wrong: the printed transition modulus is
supported by its neighbour through the chapter's own relation, while every
other row puts it one to two orders of magnitude higher. Both are served as
printed, the row says so, the errata registers it in both languages, and a
test now requires the ordering on every other row.
The derived markers on that table were asserted on one row and two fields.
Deleting the rest left the suite green, which would have let a converted value
be served as a reading off the page. Every converted cell of every row is now
checked, and so is the printed figure kept beside it.
The catalogue guard matched a substring, so a catalogue whose name is a prefix
of a registered one would have been reported as reaching a page that had never
heard of it. There are three such prefixes in the tree already. It now matches
whole words, and attributes a catalogue to the module that defines it rather
than to the parent package that re-exports it.
A frequency of infinity reached the integer conversion before the catalogue
looked at it, so a method that documents ValueError raised OverflowError.
The rest are sentences that said something the repository does not: the
diameters of the round ducts given as a closed set that left out the spiral
blocks, every cell of the damping table called converted when the loss factor
is dimensionless and is not, a loss factor attributed to Cremer as one number
when the book prints an interval, the double-unit pairs of the Harris tables
counted as three hundred and twenty when they are three hundred and twenty-one,
a provenance note pointing one row up instead of two, two attribute names
abbreviated in the API table until they no longer existed, and a fiche index
that wrote "1 fiches".
* Two sources the Spanish bibliography did not carry, and a label that counted the wrong thing
The Spanish bibliography had neither ASHRAE (2019) nor Harris 3e, both of
which the Spanish catalogues page now cites. They are written as Spanish
rather than translated, in the section and the alphabetical position each one
belongs to.
The landing page called its catalogue number "material values read from
printed pages". It counts rows rather than values, it includes fluids, gases,
air conditions and duct walls rather than materials alone, and some of those
rows were computed from a printed geometry rather than read off a page. It now
says what is true of all of them: published catalogue rows, each naming the
source it came from.
The source census widened one of its two bibliography patterns and not the
other. The narrow one is not reachable today, because a corporate designation
carries its year and the full stop follows it, but one written without a year
would have been rejected against an entry that has one. Both now read the
same.
`published-catalogues` joins .PHONY, and docs/README.md records the fiche
index and why it has no hand-written mirror, next to the catalogues entry that
carries the same exemption.
* The one assertion in the duct-wall tests that read expected-first
Give the tree a formatter, and a gate that keeps it (#602)
* Give the tree a formatter, and a gate that keeps it
Ruff was the linter and nothing was the formatter. There was no
`[tool.ruff]`, no `ruff.toml`, no pre-commit and no `.editorconfig`, and CI
ran `ruff check .` on ruff's default rules alone, which are four families of
outright errors. Nothing looked at shape, so 673 of the 812 Python files had
drifted from any single style.
The line length is 88 because that is what the tooling defaults to and,
measured, what moves this tree least: 100 rewrites 708 files and 120 rewrites
717, since a longer limit rejoins lines that were split by hand. Only 0,8 %
of the lines here were over 88 to begin with.
Markdown stays out of it. Ruff formats fenced Python inside `.md` and does
not recognise `.mdx` at all, and every snippet in `docs/` is mirrored by hand
into the site in English and Spanish, so formatting one copy would drift the
three apart with nothing to notice. Those snippets also align their trailing
comments to show what each line prints, which is a teaching device.
The linter now selects the families this tree already satisfied or nearly
did, and the fifty-odd findings they raised are fixed. Two of those fixes are
worth naming because the formatter caused them: reflowing a call moves a
`# type: ignore` onto a line that no longer holds the error it silenced, and
mypy caught four such cases. One rename is reverted with the reason written
down, because renaming an unused binding moves the fingerprint the clip
freshness gate reads, and that is not worth re-rendering an FDTD animation.
* Keep the reformat out of git blame
A tree-wide reformat stands in front of every line it touched. This file
names it so `git blame` walks past, which GitHub honours without any
local configuration and which `git config blame.ignoreRevsFile` turns on
for a checkout.
* Stop selecting the rule that reads a constant as a literal
SIM300 calls any upper-case name a literal, and on that reading it gets
three idioms in this tree backwards.
`spectrum[OCTAVE_BANDS == f]` is a numpy mask, not a condition.
`res.transmission_loss[BANDS <= f0]` reads "the bands at or below f0" until
it becomes `f0 >= BANDS`. And `value == pytest.approx(x)` is how pytest is
written here: 1755 of the 2065 `pytest.raises`-adjacent assertions in the
suite already put the expected value on the right.
It is right about two of the nineteen it finds and wrong about the other
seventeen, and SonarCloud caught the result as `python:S3415`, assertions
whose argument order no longer agrees within a file. The nineteen are
reverted by rebuilding those files as they would have been had the rule
never been selected, which keeps the `C420` and formatting changes two of
them also carry.
Six places where the clause and the code had parted, from a microphone standing under its own clearance to an area that is not one number (ISO 10847, ISO 11820, ISO 11821, EN 16487) (#785)
* Six places where the clause and the code had parted, from a microphone standing under its own clearance to an area that is not one number (ISO 10847, ISO 11820, ISO 11821, EN 16487)
The reference microphone of ISO 10847 could stand lower than 7.2.2 allows.
The clause puts it at least 1,5 m above the top edge of the barrier with
"shall", and its NOTE lets a close source raise it until it looks 10 degrees
over the top; the height returned was the NOTE's alone whenever the source was
nearer than 15 m, which for a 3 m barrier 5 m away is 4,34 m against the 4,5 m
the clause asks for, and past 80 degrees a negative height. It is the higher of
the two now, and where no height reaches the 10 degrees the clearance holds and
a warning says why. The test and the conformance row had both pinned the short
geometry as correct.
ISO 11820 caps its energy subtraction at 3 dB, and Table 1 prints what that
3 dB is: the correction at a 3 dB margin, which the subtraction writes
unrounded as 3,0206 dB. The cap is judged on the margin of the two energy means
now, so the two routes the clause offers agree at the boundary they share and a
printed 3,0 dB pair is no longer decided by floating point. The window that
keeps such a pair out of the cap is the one the module declares and nothing
wider: the comparison names a relative tolerance of zero, as every other
closeness test in the package does, so the constant sets the tolerance it
documents instead of three times it. ISO 11821 7.4 c) reports the attenuation
of a screen to the nearest whole decibel, which the result now gives with
rounded() and rounded_a_weighted() as the barrier, enclosure and cabin results
already did.
The two loss functions of ISO 11820 took their areas as single numbers, where
the area of a diffuse room is a quarter of its absorption and moves with the
reverberation time band by band. They take each area and the field correction
as one value or one per band, and the two fields of the result are arrays of
one value per band even when single values went in. The thesis oracle that had
to be driven one band at a time is one call per table.
check_ceiling_specimen judged three of the limits clause 4 of EN 16487 prints
and published the rest as constants nothing applied. It judges the support
units of 4.1.1.2.3.6 and, given one value per measurement, the 50 % of 4.2.2;
the verdict carries both, and a type E depth other than 200 mm passes with a
warning that no longer calls the arrangement outside the test code. And
room_to_room_transmission gains receiver_distance_m, the direct field the
partition radiates into the receiving room, from Equations (7-71) and (7-72) of
Barron (2003), whose Example 7-6 a new conformance row holds; Norton's Equation
(4.101) is its far limit and stays the default.
The unit guard then read the new humidity_ok as a humidity without its unit: a
parameter typed bool holds a verdict and no number of the quantity it names, so
it is outside the rule. The printed tables the tests and the conformance rows
of these standards both read were transcribed twice, once on each side; they
are transcribed once now, in tests/reference_data, with the document, the folio
and the PDF page of each, and the report regenerates value for value.
The guides say all of it in both languages, with the mirrors, the curated API
table and the errata entry for the 6,2 dB of ISO 14257 Equation (4), which
stays as printed and is now stated where it is spent.
* Two receiver-correction rows a single band could satisfy, and a denominator with two spellings (ISO 10847, ISO 11820)
Both ISO 10847 receiver-correction rows read the largest shift across the three bands, so a correction that reached one band and left the other two alone would still have printed the 6 dB of the pressure doubling and passed. They now read the largest absolute departure from 6 dB, which is a statement about every band, and the 6 dB is written into the expected column as prose so the row still says what it is checking.
The Ver and Beranek absorption row said it was checking a quarter of the printed Sabine absorption area. It multiplies the quarter back up and compares the full printed 10,7 m2, so the row described a different quantity from the one it evaluates.
`receiving_absorption` is the denominator of the reverberant term, and the two books write that term over two different quantities: Norton over S2 alpha2 and Barron over the room constant R2. The module prose, the function docstring and the guide all say so, but the parameter line said only the first, and the parameter tables of the reference pages print that line on its own, away from the paragraph that explains it. It now names both, with the link to `room_constant` beside the one to `equivalent_absorption_area`.
The normalisation cell of the API table printed `spectrum_distribution_value(values, PINK_NOISE_WEIGHTS_DB values)`, two arguments juxtaposed with no accessor between them. The second argument is a sequence of the six weights, so it is `list(PINK_NOISE_WEIGHTS_DB.values())`.
* The background of Annex B case A goes with the label that carries it, not with the coordinates beside it (ISO 11690-3)
Table B.5 prints the 50 dB of background against the workstation it calls W1, and the entry already registered that the labels of that table are the half it gets right: Figure B.1 puts W1 beside machine M2, and that is where the levels of Table B.6 come back. The background was being heard in the far corner instead, which is where the other label belongs.
It is worth 0,004 dB, both readings round to the tenth Table B.6 prints, and no verdict moves. What changes is the second decimal of the two recomputed levels the entry quotes, 82,09 dB and 80,27 dB becoming 82,10 dB and 80,26 dB, and the entry now says where the background sits and what the other reading would cost.
The two counts in the Annex B check labels were written out by hand while the cells they describe were counted in the code beside them, so a row added or removed would have left the prose saying six and twelve. They come from the cells now.
* The Eq. (4) offset row judges every claim it prints, not only the first (ISO 14257)
The row publishes three findings about the fourteen Annex C values: the sum of the Table 1 weights puts none of them outside their rounding, the printed 6,2 dB puts nine outside, and every departure the printed constant gives is high. Its verdict only counted the first. The other two were computed and printed beside it and never judged, so the row would have gone on passing the day the printed constant agreed with the annex, while still saying it does not.
All three are judged now, with a fourth the description also claims, that none of the high cells reaches a second unit of the tenth. The nine is recorded as the finding it is rather than derived, and the fourteen comes from the cells. Made to fail both ways before committing: with the recorded count set as if the constant agreed with the annex, and with the printed departures pushed low.
In the release note, "both use one the angle governs now" becomes "both now use the height the angle governs".
* The two Annex B distances in the ISO 11690-3 entry are the ones the coordinates give
The entry said the position Table B.5 calls W2 is one metre from machine M2 and the one it calls W1 eleven metres from the nearer machine. From the printed coordinates they are 1,17 m and 11,42 m: W2 stands a metre away in plan but 0,6 m higher than the machine. Both now read 1,2 m and 11,4 m, in English and in Spanish. The argument does not change, since the near position is still the quieter one the table claims.
* The generated artefacts are regenerated on top of the measurement diagrams
Moving the layer onto main kept llms-full.txt, the materials absorbers bundle and the conformance artefact as this layer had written them, which dropped what the diagram stack added to the suspended ceilings guide and the ISO 4866 re-citation. Regenerated from the tree, they carry both.
Forty-six surfaces measured with a turntable, and the two rows the book cannot tell apart (#839)
* Forty-six surfaces measured with a turntable, and the two rows the book cannot tell apart
Cox & D'Antonio 3e Appendix D is the only one of that book's four appendices
whose numbers were measured rather than computed: random incidence scattering
coefficients under ISO 17497-1, in one-third octave bands from 100 Hz to 5 kHz,
for corrugation, battens, blocks, pyramids, grooves cut into rubber, wooden
hemispheres and hedges. A geometric room model wants one of these per surface
per band and cannot derive it, so `materials.diffusers.PUBLISHED_SCATTERING`
holds the forty-six rows with the paper each one is credited to, spelled out
instead of the superscript that means nothing away from the page.
Nothing is smoothed. Ten rows print a dash at 5 kHz and twenty leave the column
blank, which are two different statements and are kept apart. One cell reads
1.17, which is what the standard's ratio gives and not a slipped digit. The
same battens measured by two teams are two rows, 0.28 and 0.44 at 630 Hz.
Two rows of the Pyramids group carry the same description, the same
continuation line and different spectra, on two different pages, so nothing
printed beside either one identifies it. They stay two rows, their keys carry
the folio that separates them, and the errata register says what the page does
without guessing what it meant to say.
The transcription was made twice from the rendered pages by readers who never
saw each other's work: 808 cells, no difference. Five deliberate defects were
injected to prove the tests fail against them, including a credit moved from
one row to the next, which the first version of the suite did not catch.
Two tools learned something on the way. The site's band headings could not
spell a one-third octave: 1250 Hz came out as "1 kHz", and 1.25 kHz needs a
decimal separator that Spanish writes with a comma, so the heading is now
per language. And the group heading a book prints above a block of rows now
travels to the published tables, where 622 rows across four catalogues were
already carrying one that nobody could see.
* The errata page carries the entry the register gained
* Thirteen bands, not fourteen: the two raised-pyramid rows agree in five
Six places where the clause and the code had parted, from a microphone standing under its own clearance to an area that is not one number (ISO 10847, ISO 11820, ISO 11821, EN 16487) (#785)
* Six places where the clause and the code had parted, from a microphone standing under its own clearance to an area that is not one number (ISO 10847, ISO 11820, ISO 11821, EN 16487)
The reference microphone of ISO 10847 could stand lower than 7.2.2 allows.
The clause puts it at least 1,5 m above the top edge of the barrier with
"shall", and its NOTE lets a close source raise it until it looks 10 degrees
over the top; the height returned was the NOTE's alone whenever the source was
nearer than 15 m, which for a 3 m barrier 5 m away is 4,34 m against the 4,5 m
the clause asks for, and past 80 degrees a negative height. It is the higher of
the two now, and where no height reaches the 10 degrees the clearance holds and
a warning says why. The test and the conformance row had both pinned the short
geometry as correct.
ISO 11820 caps its energy subtraction at 3 dB, and Table 1 prints what that
3 dB is: the correction at a 3 dB margin, which the subtraction writes
unrounded as 3,0206 dB. The cap is judged on the margin of the two energy means
now, so the two routes the clause offers agree at the boundary they share and a
printed 3,0 dB pair is no longer decided by floating point. The window that
keeps such a pair out of the cap is the one the module declares and nothing
wider: the comparison names a relative tolerance of zero, as every other
closeness test in the package does, so the constant sets the tolerance it
documents instead of three times it. ISO 11821 7.4 c) reports the attenuation
of a screen to the nearest whole decibel, which the result now gives with
rounded() and rounded_a_weighted() as the barrier, enclosure and cabin results
already did.
The two loss functions of ISO 11820 took their areas as single numbers, where
the area of a diffuse room is a quarter of its absorption and moves with the
reverberation time band by band. They take each area and the field correction
as one value or one per band, and the two fields of the result are arrays of
one value per band even when single values went in. The thesis oracle that had
to be driven one band at a time is one call per table.
check_ceiling_specimen judged three of the limits clause 4 of EN 16487 prints
and published the rest as constants nothing applied. It judges the support
units of 4.1.1.2.3.6 and, given one value per measurement, the 50 % of 4.2.2;
the verdict carries both, and a type E depth other than 200 mm passes with a
warning that no longer calls the arrangement outside the test code. And
room_to_room_transmission gains receiver_distance_m, the direct field the
partition radiates into the receiving room, from Equations (7-71) and (7-72) of
Barron (2003), whose Example 7-6 a new conformance row holds; Norton's Equation
(4.101) is its far limit and stays the default.
The unit guard then read the new humidity_ok as a humidity without its unit: a
parameter typed bool holds a verdict and no number of the quantity it names, so
it is outside the rule. The printed tables the tests and the conformance rows
of these standards both read were transcribed twice, once on each side; they
are transcribed once now, in tests/reference_data, with the document, the folio
and the PDF page of each, and the report regenerates value for value.
The guides say all of it in both languages, with the mirrors, the curated API
table and the errata entry for the 6,2 dB of ISO 14257 Equation (4), which
stays as printed and is now stated where it is spent.
* Two receiver-correction rows a single band could satisfy, and a denominator with two spellings (ISO 10847, ISO 11820)
Both ISO 10847 receiver-correction rows read the largest shift across the three bands, so a correction that reached one band and left the other two alone would still have printed the 6 dB of the pressure doubling and passed. They now read the largest absolute departure from 6 dB, which is a statement about every band, and the 6 dB is written into the expected column as prose so the row still says what it is checking.
The Ver and Beranek absorption row said it was checking a quarter of the printed Sabine absorption area. It multiplies the quarter back up and compares the full printed 10,7 m2, so the row described a different quantity from the one it evaluates.
`receiving_absorption` is the denominator of the reverberant term, and the two books write that term over two different quantities: Norton over S2 alpha2 and Barron over the room constant R2. The module prose, the function docstring and the guide all say so, but the parameter line said only the first, and the parameter tables of the reference pages print that line on its own, away from the paragraph that explains it. It now names both, with the link to `room_constant` beside the one to `equivalent_absorption_area`.
The normalisation cell of the API table printed `spectrum_distribution_value(values, PINK_NOISE_WEIGHTS_DB values)`, two arguments juxtaposed with no accessor between them. The second argument is a sequence of the six weights, so it is `list(PINK_NOISE_WEIGHTS_DB.values())`.
* The background of Annex B case A goes with the label that carries it, not with the coordinates beside it (ISO 11690-3)
Table B.5 prints the 50 dB of background against the workstation it calls W1, and the entry already registered that the labels of that table are the half it gets right: Figure B.1 puts W1 beside machine M2, and that is where the levels of Table B.6 come back. The background was being heard in the far corner instead, which is where the other label belongs.
It is worth 0,004 dB, both readings round to the tenth Table B.6 prints, and no verdict moves. What changes is the second decimal of the two recomputed levels the entry quotes, 82,09 dB and 80,27 dB becoming 82,10 dB and 80,26 dB, and the entry now says where the background sits and what the other reading would cost.
The two counts in the Annex B check labels were written out by hand while the cells they describe were counted in the code beside them, so a row added or removed would have left the prose saying six and twelve. They come from the cells now.
* The Eq. (4) offset row judges every claim it prints, not only the first (ISO 14257)
The row publishes three findings about the fourteen Annex C values: the sum of the Table 1 weights puts none of them outside their rounding, the printed 6,2 dB puts nine outside, and every departure the printed constant gives is high. Its verdict only counted the first. The other two were computed and printed beside it and never judged, so the row would have gone on passing the day the printed constant agreed with the annex, while still saying it does not.
All three are judged now, with a fourth the description also claims, that none of the high cells reaches a second unit of the tenth. The nine is recorded as the finding it is rather than derived, and the fourteen comes from the cells. Made to fail both ways before committing: with the recorded count set as if the constant agreed with the annex, and with the printed departures pushed low.
In the release note, "both use one the angle governs now" becomes "both now use the height the angle governs".
* The two Annex B distances in the ISO 11690-3 entry are the ones the coordinates give
The entry said the position Table B.5 calls W2 is one metre from machine M2 and the one it calls W1 eleven metres from the nearer machine. From the printed coordinates they are 1,17 m and 11,42 m: W2 stands a metre away in plan but 0,6 m higher than the machine. Both now read 1,2 m and 11,4 m, in English and in Spanish. The argument does not change, since the near position is still the quieter one the table claims.
* The generated artefacts are regenerated on top of the measurement diagrams
Moving the layer onto main kept llms-full.txt, the materials absorbers bundle and the conformance artefact as this layer had written them, which dropped what the diagram stack added to the suspended ceilings guide and the ISO 4866 re-citation. Regenerated from the tree, they carry both.
Check an outdoor sound program against its certified results, and find the quantiles of its level differences, by ISO 17534-1 (#904)
A noise map comes from a program, often run in a faster configuration than its method describes, and ISO 17534-1:2015 says how that program shows it implements the method and what the shortcut costs. The new module phonometry.environment.propagation.software_quality fills the TRC form of Annex B against the limits of each certified result, reads the 0,1- and 0,9-quantiles of the level differences of Annex C by Table C.1 and Formulas (C.1) and (C.2), places the sample points of C.2 and C.3, and gives the precision of a method across programs from a round robin, each result with its .plot(). A guide in English and Spanish runs the TRC form on the library's own ISO 9613-2 chain with test case T03 of ISO/TR 17534-3, and the errata registry gains Table 69 of that report.
Six more printed tables, and two kinds of row that are not an isotropic solid (#847)
* Six more printed tables: Norton & Karczub, Vigran and Rossing
Norton & Karczub's Appendix 4a (21 solids), Table 6.1 (11 loss factors)
and Appendices 4b and 4c (18 liquids and gases), and Vigran's Table 3.1
(9 building materials), join the solids and fluids catalogues. Two tables
that are not isotropic solids get a row type of their own: Norton &
Karczub's Table 3.1, the plateau-method constants, and Rossing's Table
15.5, the four plate stiffnesses of spruce and maple.
Three cells are registered as errata and held as printed but not served:
the cork modulus of Norton & Karczub, the aluminium Poisson ratio of
Vigran, and maple's scaling factor in Rossing, which is 1.4 where the
page's own stiffnesses give 1.50. The fluid loader now carries the
validity line of each table instead of one fixed sentence.
* Read the wood constants and the plateau height the way the page defines them
Rossing's equation (15.86) makes D1 and D3 the two directions, D2 the
Poisson coupling and D4 the twisting stiffness; the module, the page and
the catalogue headings had D2, D3 and D4 shifted, which is also where the
"sixteen times stiffer" came from (D1 over D3 is thirteen). None of the
four carries the plate thickness, and the scaling factor stretches one
wood's two directions, not one wood against the other.
Norton & Karczub's coincidence height is the level of the plateau, a
transmission loss, not the depth of a dip. building.PLATEAU_MATERIALS
typed the same table a second time; it is now built from the catalogue.
The appendix's critical-frequency column is held as printed rather than
replaced by this library's plate-speed product, which differs from it.
The static modulus of aerated concrete derives no dynamic quantity. The
fluid loader carries a row's note into the state's validity, the page
publishes fluids under their printed names with the note on the density,
and the two estimated maple cells are marked on the page. Three counts
in the table descriptions are corrected.
* Format the plateau constants helper
* The wave speeds guide counts nine tables and four tins
The steel lookup now answers with seven books and the tin lookup with
four, one of them a loss factor with no modulus, which the example no
longer divides. Norton & Karczub's 45 GPa sides with Bies against the two
books at 4.4, and the prose says so in both languages and in the mirror.
* Name the fluids package once in its catalogue loader
* Say which two cork cells carry a dash
Analyse a soundscape study by ISO/TS 12913: the questionnaire and its statistics, pleasantness and eventfulness, and the metrics at both ears (#875)
* Analyse a soundscape study by ISO/TS 12913-3: questionnaire, pleasantness and eventfulness, and the two ears
environment.pleasantness_eventfulness turns the eight perceived affective quality answers of ISO/TS 12913-2 Figure C.4 into the pleasantness and eventfulness of Formulas (A.1) and (A.2) of ISO/TS 12913-3:2019, per respondent and per site, raw in plus or minus (4 + sqrt(32)) and normalised to plus or minus 1, and its .plot() draws the two-dimensional model of Figure A.1 with every site on it. The site point is the formulas applied to the site medians, the central tendency A.2 prescribes; the mean is offered as well.
The questionnaire itself is published read-only: the four parts of Method A (Figures C.2 to C.6) and the four continuous scales of Method B (Figure C.7), every question, item and response category as printed, with the scale values of Tables A.1 and B.1. method_a_scale_values turns ticked boxes into those values, so parts 2 and 3 run 5 to 1; method_a_summary gives the median and range per site and item; method_b_scale_values, method_b_summary and method_b_source_ranking give the one-decimal scale value of a mark, the mean, standard deviation and 95 % confidence interval per site, and the median and range of each source's rank.
spearman_rank_correlation applies Formula (A.3) without ties and (A.4) with them, pearson_correlation Formulas (B.1) and (B.2), each with the probability value A.4 and B.3 ask for.
binaural_indicators computes every metric of Table D.1 at each ear of a calibrated two-channel recording with the library's own implementations (the levels, ISO 532-1 loudness, and the ECMA-418-2 tonality, roughness and fluctuation strength), with the higher ear as the representative value of D.2, their mean, and the N5/N95 variability ratio. The sharpness row is reported as not implemented, with the reason, because the library's DIN 45692 sharpness is stationary. Recordings shorter than the 3 min of ISO/TS 12913-2 D.3 or sampled below its 44,1 kHz raise a SoundscapeWarning.
SoundscapeReport is the minimum reporting record of ISO/TS 12913-2 Annex A, which refuses to be built with a required item missing and names its clause.
This implements the 2019 edition of ISO/TS 12913-3; a 2025 edition exists that revises Annex A. The tests anchor the formulas in closed form and check them against scipy and against a small derived subset of the International Soundscape Database (CC BY 4.0).
* ISO/TS 12913 is checked in closed form, four slips of its pages are errata, and two figures show a study
Fourteen conformance rows hold the soundscape analysis to what ISO/TS 12913-3:2019 and ISO/TS 12913-2:2018 print or imply, since neither prints a worked example: the 20 scale values of Table A.1 through method_a_scale_values; equal answers at the origin of Figure A.1; the extremes at the printed 9,66, and at plus or minus 1 once normalised; each attribute raised alone moving along its own arrow of the figure; Formula (A.3) against Pearson's coefficient of the ranks; Formula (A.4) and its probability value against scipy.stats.spearmanr on 93 real, heavily tied answers; Formulas (B.1) and (B.2) against scipy.stats.pearsonr; the Method B interval against scipy.stats.t.interval; the 24 cells of Table D.1; the higher ear as the representative level of D.2; the 33 printed strings of the Annex C questionnaire; and the root mean cubed loudness of A.3 f) on the library's own ISO 532-1 trace.
Four things on the pages are in the errata register, in English and Spanish. ISO/TS 12913-3 A.3 says Formulas (A.1) and (A.2) process "the results from part 3", where the perceived affective quality they read is part 2 everywhere else; Formula (A.3) prints a stray factor 1 before its fraction; ISO/TS 12913-2 C.3.2.3 speaks of three continuous scales where Figure C.7 prints four; and the questionnaire of Figures C.2 to C.4 reads "to what extend" and "reponse alternative".
Two figures are drawn by the results' own .plot(): eleven London sites of the International Soundscape Database (CC BY 4.0) on the model of Figure A.1 beside the rank correlation of their pleasantness with their level, and the levels and loudness of Table D.1 at both ears of a street recording. The model names each site in a legend below the axes, since the sites of one study sit too close together to be labelled beside their points; the binaural bars draw no vertical grid through their pairs and write the level symbols with an italic T.
* A respondent is drawn in the colour of their site, and the soundscape docstrings say what the code does
plot(respondents=True) promised each respondent in the colour of their site and drew every one of them in the same grey; each site's respondents are now a faint series of that site's hue, with a test that holds the dots to their site. The renderer no longer says its sites are labelled points (they are named in a legend), the Figure A.1 grid is drawn at the house alpha so it reads on the dark page, and the Spanish figure calls the vertical axis eventualidad, as the guide does.
The docstrings are tightened where they said more or less than the code: the Student probability value is exact for bivariate normal data, the p-value is described for one-sided alternatives too, a Method B scale runs to "very often" as well as "extremely", the binaural input check names its rank instead of silencing the linter, and English prose and messages write 44.1 kHz, 9.66 and 0.95 with a decimal point, keeping the comma only where the standard is quoted.
* Soundscape analysis gets its guide in both languages, and every index that lists guides lists it
The guide walks a study from the ISO/TS 12913-2 questionnaire to the Annex A report: the scale values and site medians, pleasantness and eventfulness on Figure A.1 for eleven London sites of the International Soundscape Database, the Spearman and Pearson correlations with their probability values, the Method B statistics, the binaural metrics of Table D.1 at both ears and what is not implemented. It is registered in the topic tree, the guides map (141 guides, in figures and in words), the documentation index, and the environment and assessment overviews in both languages, with their mirrors, llms.txt and the API reference regenerated. The CHANGELOG entry describes the whole addition.
* The soundscape model keeps its legend and labels on the page, its results keep their own data, and three more slips of ISO/TS 12913 are errata
PleasantnessEventfulness.plot() on a figure of its own now draws a square
figure laid out so the site legend and the title stay on the canvas, and the
attribute names past the arrow tips no longer run into the frame. The Method A
title breaks onto two lines, the Method B title puts the confidence level
where Spanish puts it, and the correlation plot names Spearman's coefficient
r_spearman, as Formulas (A.3) and (A.4) print it.
A correlation keeps a copy of x and y, and method_a_scale_values returns a new
array for parts 1 and 4, so a later change to the caller's arrays can no
longer rewrite a result. The N5 method string cites ISO 532-1:2017 term 3.21
and clause 6.4, the clause that asks for N5.
The where-list of Formula (A.4), which garbles the tie counts, the x_I of
(B.2), and the NOTE of ISO/TS 12913-2 A.3 f), whose text says "the exponent 3"
over a cube root, are registered in both errata files, and the page of
C.3.1.3 is corrected. The conformance domain title says that the 2019 edition
is checked and that the 2025 edition revises Annex A.
The docstrings and both guides say that the mean site point is the mean of
the respondents' points only when no attribute was left blank, give the
Pearson probability value as exact for bivariate normal data, quote Part 2
as printed, and show the code that draws the published figures. New tests
check what every soundscape plot draws, the 3 min and 44.1 kHz thresholds of
ISO/TS 12913-2 D.3 and D.6, the site description a recorded study owes, and
that results never share memory with their inputs.
* Eventfulness reads as actividad in Spanish, as the attributes around it already do
* The generated pages follow the layers below
* The guides index counts the soundscape guide, the Figure A.1 renderer reads as three steps, and the Table D.1 symbols are named once
Six places where the clause and the code had parted, from a microphone standing under its own clearance to an area that is not one number (ISO 10847, ISO 11820, ISO 11821, EN 16487) (#785)
* Six places where the clause and the code had parted, from a microphone standing under its own clearance to an area that is not one number (ISO 10847, ISO 11820, ISO 11821, EN 16487)
The reference microphone of ISO 10847 could stand lower than 7.2.2 allows.
The clause puts it at least 1,5 m above the top edge of the barrier with
"shall", and its NOTE lets a close source raise it until it looks 10 degrees
over the top; the height returned was the NOTE's alone whenever the source was
nearer than 15 m, which for a 3 m barrier 5 m away is 4,34 m against the 4,5 m
the clause asks for, and past 80 degrees a negative height. It is the higher of
the two now, and where no height reaches the 10 degrees the clearance holds and
a warning says why. The test and the conformance row had both pinned the short
geometry as correct.
ISO 11820 caps its energy subtraction at 3 dB, and Table 1 prints what that
3 dB is: the correction at a 3 dB margin, which the subtraction writes
unrounded as 3,0206 dB. The cap is judged on the margin of the two energy means
now, so the two routes the clause offers agree at the boundary they share and a
printed 3,0 dB pair is no longer decided by floating point. The window that
keeps such a pair out of the cap is the one the module declares and nothing
wider: the comparison names a relative tolerance of zero, as every other
closeness test in the package does, so the constant sets the tolerance it
documents instead of three times it. ISO 11821 7.4 c) reports the attenuation
of a screen to the nearest whole decibel, which the result now gives with
rounded() and rounded_a_weighted() as the barrier, enclosure and cabin results
already did.
The two loss functions of ISO 11820 took their areas as single numbers, where
the area of a diffuse room is a quarter of its absorption and moves with the
reverberation time band by band. They take each area and the field correction
as one value or one per band, and the two fields of the result are arrays of
one value per band even when single values went in. The thesis oracle that had
to be driven one band at a time is one call per table.
check_ceiling_specimen judged three of the limits clause 4 of EN 16487 prints
and published the rest as constants nothing applied. It judges the support
units of 4.1.1.2.3.6 and, given one value per measurement, the 50 % of 4.2.2;
the verdict carries both, and a type E depth other than 200 mm passes with a
warning that no longer calls the arrangement outside the test code. And
room_to_room_transmission gains receiver_distance_m, the direct field the
partition radiates into the receiving room, from Equations (7-71) and (7-72) of
Barron (2003), whose Example 7-6 a new conformance row holds; Norton's Equation
(4.101) is its far limit and stays the default.
The unit guard then read the new humidity_ok as a humidity without its unit: a
parameter typed bool holds a verdict and no number of the quantity it names, so
it is outside the rule. The printed tables the tests and the conformance rows
of these standards both read were transcribed twice, once on each side; they
are transcribed once now, in tests/reference_data, with the document, the folio
and the PDF page of each, and the report regenerates value for value.
The guides say all of it in both languages, with the mirrors, the curated API
table and the errata entry for the 6,2 dB of ISO 14257 Equation (4), which
stays as printed and is now stated where it is spent.
* Two receiver-correction rows a single band could satisfy, and a denominator with two spellings (ISO 10847, ISO 11820)
Both ISO 10847 receiver-correction rows read the largest shift across the three bands, so a correction that reached one band and left the other two alone would still have printed the 6 dB of the pressure doubling and passed. They now read the largest absolute departure from 6 dB, which is a statement about every band, and the 6 dB is written into the expected column as prose so the row still says what it is checking.
The Ver and Beranek absorption row said it was checking a quarter of the printed Sabine absorption area. It multiplies the quarter back up and compares the full printed 10,7 m2, so the row described a different quantity from the one it evaluates.
`receiving_absorption` is the denominator of the reverberant term, and the two books write that term over two different quantities: Norton over S2 alpha2 and Barron over the room constant R2. The module prose, the function docstring and the guide all say so, but the parameter line said only the first, and the parameter tables of the reference pages print that line on its own, away from the paragraph that explains it. It now names both, with the link to `room_constant` beside the one to `equivalent_absorption_area`.
The normalisation cell of the API table printed `spectrum_distribution_value(values, PINK_NOISE_WEIGHTS_DB values)`, two arguments juxtaposed with no accessor between them. The second argument is a sequence of the six weights, so it is `list(PINK_NOISE_WEIGHTS_DB.values())`.
* The background of Annex B case A goes with the label that carries it, not with the coordinates beside it (ISO 11690-3)
Table B.5 prints the 50 dB of background against the workstation it calls W1, and the entry already registered that the labels of that table are the half it gets right: Figure B.1 puts W1 beside machine M2, and that is where the levels of Table B.6 come back. The background was being heard in the far corner instead, which is where the other label belongs.
It is worth 0,004 dB, both readings round to the tenth Table B.6 prints, and no verdict moves. What changes is the second decimal of the two recomputed levels the entry quotes, 82,09 dB and 80,27 dB becoming 82,10 dB and 80,26 dB, and the entry now says where the background sits and what the other reading would cost.
The two counts in the Annex B check labels were written out by hand while the cells they describe were counted in the code beside them, so a row added or removed would have left the prose saying six and twelve. They come from the cells now.
* The Eq. (4) offset row judges every claim it prints, not only the first (ISO 14257)
The row publishes three findings about the fourteen Annex C values: the sum of the Table 1 weights puts none of them outside their rounding, the printed 6,2 dB puts nine outside, and every departure the printed constant gives is high. Its verdict only counted the first. The other two were computed and printed beside it and never judged, so the row would have gone on passing the day the printed constant agreed with the annex, while still saying it does not.
All three are judged now, with a fourth the description also claims, that none of the high cells reaches a second unit of the tenth. The nine is recorded as the finding it is rather than derived, and the fourteen comes from the cells. Made to fail both ways before committing: with the recorded count set as if the constant agreed with the annex, and with the printed departures pushed low.
In the release note, "both use one the angle governs now" becomes "both now use the height the angle governs".
* The two Annex B distances in the ISO 11690-3 entry are the ones the coordinates give
The entry said the position Table B.5 calls W2 is one metre from machine M2 and the one it calls W1 eleven metres from the nearer machine. From the printed coordinates they are 1,17 m and 11,42 m: W2 stands a metre away in plan but 0,6 m higher than the machine. Both now read 1,2 m and 11,4 m, in English and in Spanish. The argument does not change, since the near position is still the quieter one the table claims.
* The generated artefacts are regenerated on top of the measurement diagrams
Moving the layer onto main kept llms-full.txt, the materials absorbers bundle and the conformance artefact as this layer had written them, which dropped what the diagram stack added to the suspended ceilings guide and the ISO 4866 re-citation. Regenerated from the tree, they carry both.
Adjust a measured STI to other speech and noise levels (IEC 60268-16 Annex M) (#657)
* Answer what the empty room would score with the audience in it
A hall is measured out of hours, at whatever level the test signal ran, and
the rating it has to meet is the one for the hall in use. Annex M of
IEC 60268-16 moves the measurement to that condition without a second visit,
and an STIResult could not answer it at all.
speech.sti_adjusted_for_levels() runs the four steps of the annex: the matrix
as measured, the correction of the measurement condition divided out, the
correction of the operational condition applied, and the usual A.5.4 to A.5.6
processing into the index. STIResult.adjusted_for_levels() reads the
measurement condition off the result, which is why the result now carries the
ambient spectrum beside the speech one, and refuses a result computed without
band levels rather than undoing a correction that was never applied.
Steps 2 and 3 are one correction, inverted and then applied, so the auditory
masking of Table A.2 and the reception threshold of Table A.3 keep a single
implementation: the forward chain builds its factor from the same helper, and
a round trip to the levels already measured has to give the matrix back.
Checked against the printed intermediates of Table M.1, not only the STI it
ends on. Both 98-value MTF matrices land within one unit of the last printed
place, every scalar row on the way to them reproduces at the precision it is
printed to, the effective SNRs agree within 0,08 dB, the band MTI row is exact
at the annex's own two decimals and the index rounds to the printed 0,76.
Three defects in the printed table came out of that reading and are recorded
in docs/ERRATA.md: the redundancy row labelled with a formula its own numbers
do not follow, the I_k row tabulated a million times the scale of the two
quantities it is added to, and one masking-intensity cell that does not round
from the quantity it names.
What is implemented is the Edition 4 (2011) procedure. The Edition 5 foreword
says greater information is given in Annex M about these adjustments, and its
table of contents grows the annex from three printed pages to ten; the body
of the Edition 5 annex could not be obtained, so the guides say exactly that
instead of implying coverage of an edition nobody read.
* Say what the empty-hall adjustment is for, and what it cannot answer
The Annex M adjustment arrived with a guide section that walked its four steps
and stopped there. Two things a reader needs were missing: why the annex takes
the measurement's noise and masking out before putting the new ones in, rather
than adjusting the matrix where it stands, and what the answer does not cover.
The first is not ceremony. The measured matrix is a product, and only the
transmission channel survives the change of condition; the noise, the masking
and the threshold belong to the listening condition, and none of them is a
function of how far the levels moved. Auditory masking is piecewise in the
absolute combined level of the band below, breaking at 63, 67 and 100 dB, and
the reception threshold is an absolute intensity, so both have to be re-derived
at the new levels rather than shifted. The section also names the shortcut the
two steps forbid, which is re-running the noise correction over a matrix that
already carries the measurement's own noise, and says where the m > 1
truncation belongs.
The second is five things the procedure cannot tell you, the first of which is
the one that matters: it moves the listening condition, not the room. An
audience absorbs, so the occupied channel is really better than the measured
one, and an empty-hall measurement is pessimistic about the reverberation and
optimistic about the noise. This corrects the noise only.
A figure earns its place because the index hides the shape of the loss.
sti_occupancy_adjustment draws the per-band MTI of one hall measured empty,
adjusted for the audience, and adjusted with the talker 6 dB louder, over a
lower panel of the change from the measured index: the three differ by
hundredths on a scale whose bars have to start at zero, so the differences are
unreadable in the levels alone. The 125 Hz band gives up 0,07 of its index,
nearly four times what 500 Hz gives up, and the extra 6 dB gives back most
where most was lost.
Three conformance checks now hold the printed intermediates instead of only
the two matrices and the final index: every scalar row of step 2 and of step 3
against the rounding its own printing allows, and all 98 effective
signal-to-noise ratios of step 4a. The worst row of either step is the auditory
masking factor in dB, which the annex prints to one decimal and which uses
99 % of what that rounding permits; the 250 Hz masking intensity of step 3
stays out of the comparison and in the errata register rather than being
absorbed by a widened tolerance.
The guides say plainly that this is the Edition 4 procedure, verified against
its printed example, and that what the ten Edition 5 pages of the annex add
beside it is unknown because their body could not be obtained.
All three editions, the Spanish written as a peer with comma decimals.
Conformance, API reference, llms.txt and the PyPI README regenerated.
* Hold the erratum to its own arithmetic, and the Ed.5 claim to its foreword
A second reading against the print caught the erratum quoting numbers it had
not finished computing. The masking-intensity cell recomputes to 2 858 804,
not 2 858 700; its 500 Hz neighbour to 2 852 252; and the correction the
defect moves is 44 parts in a million, not 4. The register's equation now
carries the masking factor to the digit that makes it evaluate to the product
it states, and the test pins the cell to within one unit instead of accepting
a window a thousand wide.
The Edition 5 paragraph said the annex was expanded with alternative noise
and level adjustments, which reads as new methods where the foreword claims
none: item g says greater information is given in Annex M about adjustments
to the measured STI results. The guides, the docstrings and the changelog now
say that, with the evidence that exists: the table of contents grows the
annex from three printed pages to ten and adds a flow chart of the steps, and
the body of those pages could not be obtained.
Two oracle exclusions are now named instead of silent. The step 4 clamp and
transmission-index prints are derived by rounding the printed SNRs and then
clamping, a display chain, so they are deliberately not oracles for a library
that never rounds mid-chain; and the transcription header points at the one
row two steps print differently, the reception threshold at 250 Hz.
The truncation warning of sti_adjusted_for_levels pointed one stack frame
past the caller, because the shared validator assumed the depth of the
functions that route through the private chain; the depth is now a parameter.
The note claiming the measured matrix is what a meter reports claims less:
it is what STIResult.mtf holds after a measurement run. The wrong-length test
exercises all four level spectra rather than one. API reference, site errata
pages and llms shards regenerated.
* Hold each printed cell to its own last place, and each level to being a level
Review of the adjustment turned up one hole at the boundary and one shortcut
in the conformance rows, plus three smaller debts.
The four level spectra were validated for shape and not for content, so a NaN
rode through the exponentiation into every band the masking couples and an
infinity became an intensity no room has. The shared validator now refuses
non-finite values by the vector's name, which hardens the forward chain's
level and ambient arguments through the same door, and a test names all
three offenders.
The significant-figure rows of the Table M.1 checks were held to a flat half
percent of the printed value, which admits five times the printed rounding at
a leading-digit-5 cell like 508 000. Each cell is now allowed half a unit in
its own last printed place, with the two-figure cells of the I_rt and I_am
rows declared as such. That exposed one real propagation: the annex derives
its amf rows from its combined-level print, given to two decimals, and the
0,5 dB-per-dB masking slope carries up to 0,0025 dB of that rounding into
them - at 250 Hz of step 2 the annex's 77,90 gives 8,222 where the unrounded
77,90444 gives 8,227, and only the former prints the tabulated 8,22. The
allowance says so and both step rows land at 99 % of their tightest cell,
which is the amf-in-dB row either way.
The section 3 example leaned on a hall defined only in the figure block below
it, so a reader running it as printed got a NameError, and a reader running
the page top to bottom got a different room than the annotated 0,60/0,56/0,59
outputs; it now builds its own 0,9 s hall, identical in the three editions,
and the outputs were re-run. An editing note that survived into the Spanish
edition is deleted. The beta-row erratum now says what the seventh 0,000 cell
is: the placeholder of the 8 kHz column, whose band has no neighbour above it
to pair with, since the redundancy sum stops at k = 6. API reference, errata
pages, llms shards and the conformance artefact regenerated.
* Say what mtf accepts, and which ambient defaults to None
Review round. The parameter tables sold mtf as 0 to 1 where the validator
accepts any finite non-negative matrix, truncates above 1 and warns above
1.3; the three editions now say that. The API quick-reference bundled each
ambient spectrum with its level as one unconditional bullet, hiding that
both ambients default to None; the four inputs now have a bullet each. And
six decibels of talker becomes six decibels more from the talker, in the
two languages that had the shorthand.
* Say what the refused result actually carries
The guides justified the refusal of a level-less result by saying it has no
correction to undo, which is false for one computed with snr= alone: that
result carries the flat noise factor, only none of the level-dependent
masking and threshold and no spectra to re-derive them from. The sentence
now says that, in the three editions and the changelog.
Measure what a road surface adds to traffic noise, by the ISO 11819-1 statistical pass-by (#867)
* Measure what a road surface adds to traffic noise, by the ISO 11819-1 statistical pass-by
The regression of each vehicle category's maximum level on the logarithm of
speed, the vehicle sound level at the Table 1 reference speed, the index of
9.5, the difference from a reference surface and the average of Annex D,
with the 7.3 counts and the 9.3 speed window judged and warned about, the
Table 2 random errors published and each line's own confidence interval.
Levels are carried unrounded and rounded once, to one decimal, only where
they are reported.
* The Annex E report of ISO 11819-1 is a conformance row from pass-bys to its difference
Seven rows: the two printed tables, the vehicle sound levels read off
pass-bys whose lines are the printed ones, the index of the levels as the
report prints them, the corrected index, the difference from the 77,3 dB
reference surface and the Annex D average. Two defects of the printed page
are registered: the speed spreads of Annex E do not fit the regression
beside them, and the one table of Annex D is numbered after Annex E.
* A reference surface given as a numpy number is read as an index
Any real number now counts as the reference index, and only a mapping as the
three vehicle sound levels of a reference surface; a numpy integer used to
be taken for a mapping and refused.
* A guide to measuring what a road surface adds to traffic noise
The statistical pass-by of ISO 11819-1 in English and Spanish, with its
docs mirror: the vehicle and road speed categories, how the measurement
goes, the vehicle sound level and its speed window, the index, the
reference surface of clause 10 and Annex D, what the standard leaves to the
tester about temperature, how precise the result is, and the rounding the
Annex E example uses against the one the clause asks for. Two figures draw a
site's three clouds with their lines and one category with its window, and
the page is registered in the sources overview, the guides index and the
changelog.
* The Table 2 test says what the arithmetic reproduces and what it does not
Two standard errors of 100 cars give the printed 0,3 dB; for 40 heavy
vehicles they give 0,62 dB where 0,7 dB is printed, and the test no longer
offers an explanation the clause does not give.
* The pass-by index adds the vehicle sound levels as 9.2 reports them, so Annex E gives 79,9 dB end to end
9.5 defines the levels of its index as the vehicle sound levels "according
to 9.2", which rounds every level to one decimal, so statistical_pass_by now
indexes the three levels rounded once, half up, and does the same for
temperature-corrected levels and for a reference given as levels. Run from
pass-bys on the regression lines Annex E prints, the index is 79,946 dB and
reports as the printed 79,9 dB, where the unrounded levels gave 80,0 dB; that
unrounded index stays on the result as full_precision_index_db, and the
corrected levels as reported_corrected_vehicle_sound_levels_db.
The Annex E conformance row now reads the index the library returns instead
of recomputing it. New tests pin the 9.3 window on pass-bys placed with a
known mean and spread of lg v, the 7.3 counts on their boundaries, and other
weighting factors through every index of the result. The 9.3 window is drawn
as an opaque wash that stays visible on a light page, the figures label the
reported levels, and a pass-by is a "paso" in the Spanish figures as in the
guide.
* The pass-by guide draws the site, follows 9.2 and 9.5 to the index, and is linked from the environment overview
A diagram shows the microphone 7,5 m from the measuring lane and 1,2 m high,
the second position for a narrow shoulder, and the 30 m of level, straight
road each side of it. The rounding section now says what the clauses settle:
the index adds the levels of 9.2 to one decimal, the Annex E example does the
same, and its printed lines alone could not have told the two chains apart.
Annex D is described as the seven dense bituminous surfaces it prints, 10.1
as the clause that bounds the texture, the corrected report items as the
optional ones clause 13 lists, and the Spanish page quotes the standard
between angle quotes. The environment overview, the sources overview and the
guides index now list the page.
* The Annex E residual spreads agree with the regression within the rounding of what is printed beside them
The erratum on the Annex E speed spreads cited the residual row as matching
the printed slope, correlation and level spread outright. It matches within
the rounding of the printed r and s_L, as the speed row is judged, and the
entry now gives those ranges in both languages.
* The Annex E speed-spread erratum argues from the coefficient of variation
The claim that any conversion scaling with the mean speed and growing with the
spread of lg v keeps the dual-axle vehicles the widest did not follow, since
those vehicles have the lower mean and the wider spread. The entry now uses the
ratio of the standard deviation to the mean, which depends on the spread of
lg v alone, and gives its values to first order and for a log-normal speed.
* Regenerate the conformance counts and the llms files on the current main
Six places where the clause and the code had parted, from a microphone standing under its own clearance to an area that is not one number (ISO 10847, ISO 11820, ISO 11821, EN 16487) (#785)
* Six places where the clause and the code had parted, from a microphone standing under its own clearance to an area that is not one number (ISO 10847, ISO 11820, ISO 11821, EN 16487)
The reference microphone of ISO 10847 could stand lower than 7.2.2 allows.
The clause puts it at least 1,5 m above the top edge of the barrier with
"shall", and its NOTE lets a close source raise it until it looks 10 degrees
over the top; the height returned was the NOTE's alone whenever the source was
nearer than 15 m, which for a 3 m barrier 5 m away is 4,34 m against the 4,5 m
the clause asks for, and past 80 degrees a negative height. It is the higher of
the two now, and where no height reaches the 10 degrees the clearance holds and
a warning says why. The test and the conformance row had both pinned the short
geometry as correct.
ISO 11820 caps its energy subtraction at 3 dB, and Table 1 prints what that
3 dB is: the correction at a 3 dB margin, which the subtraction writes
unrounded as 3,0206 dB. The cap is judged on the margin of the two energy means
now, so the two routes the clause offers agree at the boundary they share and a
printed 3,0 dB pair is no longer decided by floating point. The window that
keeps such a pair out of the cap is the one the module declares and nothing
wider: the comparison names a relative tolerance of zero, as every other
closeness test in the package does, so the constant sets the tolerance it
documents instead of three times it. ISO 11821 7.4 c) reports the attenuation
of a screen to the nearest whole decibel, which the result now gives with
rounded() and rounded_a_weighted() as the barrier, enclosure and cabin results
already did.
The two loss functions of ISO 11820 took their areas as single numbers, where
the area of a diffuse room is a quarter of its absorption and moves with the
reverberation time band by band. They take each area and the field correction
as one value or one per band, and the two fields of the result are arrays of
one value per band even when single values went in. The thesis oracle that had
to be driven one band at a time is one call per table.
check_ceiling_specimen judged three of the limits clause 4 of EN 16487 prints
and published the rest as constants nothing applied. It judges the support
units of 4.1.1.2.3.6 and, given one value per measurement, the 50 % of 4.2.2;
the verdict carries both, and a type E depth other than 200 mm passes with a
warning that no longer calls the arrangement outside the test code. And
room_to_room_transmission gains receiver_distance_m, the direct field the
partition radiates into the receiving room, from Equations (7-71) and (7-72) of
Barron (2003), whose Example 7-6 a new conformance row holds; Norton's Equation
(4.101) is its far limit and stays the default.
The unit guard then read the new humidity_ok as a humidity without its unit: a
parameter typed bool holds a verdict and no number of the quantity it names, so
it is outside the rule. The printed tables the tests and the conformance rows
of these standards both read were transcribed twice, once on each side; they
are transcribed once now, in tests/reference_data, with the document, the folio
and the PDF page of each, and the report regenerates value for value.
The guides say all of it in both languages, with the mirrors, the curated API
table and the errata entry for the 6,2 dB of ISO 14257 Equation (4), which
stays as printed and is now stated where it is spent.
* Two receiver-correction rows a single band could satisfy, and a denominator with two spellings (ISO 10847, ISO 11820)
Both ISO 10847 receiver-correction rows read the largest shift across the three bands, so a correction that reached one band and left the other two alone would still have printed the 6 dB of the pressure doubling and passed. They now read the largest absolute departure from 6 dB, which is a statement about every band, and the 6 dB is written into the expected column as prose so the row still says what it is checking.
The Ver and Beranek absorption row said it was checking a quarter of the printed Sabine absorption area. It multiplies the quarter back up and compares the full printed 10,7 m2, so the row described a different quantity from the one it evaluates.
`receiving_absorption` is the denominator of the reverberant term, and the two books write that term over two different quantities: Norton over S2 alpha2 and Barron over the room constant R2. The module prose, the function docstring and the guide all say so, but the parameter line said only the first, and the parameter tables of the reference pages print that line on its own, away from the paragraph that explains it. It now names both, with the link to `room_constant` beside the one to `equivalent_absorption_area`.
The normalisation cell of the API table printed `spectrum_distribution_value(values, PINK_NOISE_WEIGHTS_DB values)`, two arguments juxtaposed with no accessor between them. The second argument is a sequence of the six weights, so it is `list(PINK_NOISE_WEIGHTS_DB.values())`.
* The background of Annex B case A goes with the label that carries it, not with the coordinates beside it (ISO 11690-3)
Table B.5 prints the 50 dB of background against the workstation it calls W1, and the entry already registered that the labels of that table are the half it gets right: Figure B.1 puts W1 beside machine M2, and that is where the levels of Table B.6 come back. The background was being heard in the far corner instead, which is where the other label belongs.
It is worth 0,004 dB, both readings round to the tenth Table B.6 prints, and no verdict moves. What changes is the second decimal of the two recomputed levels the entry quotes, 82,09 dB and 80,27 dB becoming 82,10 dB and 80,26 dB, and the entry now says where the background sits and what the other reading would cost.
The two counts in the Annex B check labels were written out by hand while the cells they describe were counted in the code beside them, so a row added or removed would have left the prose saying six and twelve. They come from the cells now.
* The Eq. (4) offset row judges every claim it prints, not only the first (ISO 14257)
The row publishes three findings about the fourteen Annex C values: the sum of the Table 1 weights puts none of them outside their rounding, the printed 6,2 dB puts nine outside, and every departure the printed constant gives is high. Its verdict only counted the first. The other two were computed and printed beside it and never judged, so the row would have gone on passing the day the printed constant agreed with the annex, while still saying it does not.
All three are judged now, with a fourth the description also claims, that none of the high cells reaches a second unit of the tenth. The nine is recorded as the finding it is rather than derived, and the fourteen comes from the cells. Made to fail both ways before committing: with the recorded count set as if the constant agreed with the annex, and with the printed departures pushed low.
In the release note, "both use one the angle governs now" becomes "both now use the height the angle governs".
* The two Annex B distances in the ISO 11690-3 entry are the ones the coordinates give
The entry said the position Table B.5 calls W2 is one metre from machine M2 and the one it calls W1 eleven metres from the nearer machine. From the printed coordinates they are 1,17 m and 11,42 m: W2 stands a metre away in plan but 0,6 m higher than the machine. Both now read 1,2 m and 11,4 m, in English and in Spanish. The argument does not change, since the near position is still the quieter one the table claims.
* The generated artefacts are regenerated on top of the measurement diagrams
Moving the layer onto main kept llms-full.txt, the materials absorbers bundle and the conformance artefact as this layer had written them, which dropped what the diagram stack added to the suspended ceilings guide and the ISO 4866 re-citation. Regenerated from the tree, they carry both.
Ninety-four partitions off six sideways pages, and the two columns that tell them apart (#838)
* Ninety-four partitions off six sideways pages, and the two columns that tell them apart
Transmission loss gets a catalogue of its own. Bies 5e Table 7.6 prints
ninety-four constructions in nine groups, from lead sheet and sandwich panels
through brick, stud partitions, glazing and doors to floors, each with the
thickness and the surface density beside the description and its loss in
eight octave bands.
Those two columns are not decoration. The page prints six windows called
"Single glass in heavy frame" and three floors called "Concrete, reinforced",
and the thickness is the only thing that tells them apart, so it is part of
the key and part of what the tests compare.
This is the table that shows what a formula does not. Two 280 mm brick walls,
same thickness and same surface weight, differ by 15 dB at 500 Hz and by 9 at
4 kHz because one is built on strip ties and the other on expanded metal
ties. The mass law gives a straight line and says nothing about the ties.
A band the page leaves empty, and thirty-eight rows leave 63 Hz empty, is
refused rather than answered: zero decibels of transmission loss is a
partition that transmits everything, which is the opposite of what the page
says. The book's own statement about the numbers, three lines and no
measurement standard, is quoted whole in the data file.
Read twice from the pages, as every table in this catalogue is: 752 cells, a
thickness and a surface weight per row, no difference between the readings.
* The wall ties differ by fifteen decibels where the table says they do
Read the glossary on a phone, and file the code the way the pages are filed
Read the glossary on a phone, and file the code the way the pages are filed
The glossary was 120 terms spread across markdown tables that read badly on a
phone. It now comes from one source rendered as cards, each term carrying its
symbol, unit, standard, clause and the guide that teaches it, with the guide
link text read from the content collection at build time so a slug that stops
existing fails the build instead of rotting. Three example fiches the guides
described but never showed are generated now, found by a new per-language check
that every committed fiche is actually shown on a page. A topic's landing page
lists what it holds on a phone, and the byline moved off the top of every page
into the footer.
Then the code got the same treatment. scripts/generate_graphs.py had reached
21020 lines; three rounds of splitting brought the largest file in the
repository down to 2862, which is the flat API surface and cannot be shorter.
Files over a thousand lines went from 41 to 40, and that is the point: splitting
a 21000-line file yields several of a thousand, and what changed is that none of
the remaining ones has an honest seam left. CONTRIBUTING now states the rule
those splits followed: there is no line limit, the test is cohesion, and a split
is a move proven by byte-identical generated output.
Splitting a module moves names between modules of the same package, and a
deprecated 3.x import path names only one of them, so 47 names would have
stopped resolving through a path that still promises a warning until 5.0.
_compat.py now knows which modules a split fed, and a test holds every name to
that promise.
Auditing the layout afterwards turned up four things the splits had damaged and
nothing had noticed: the pre-commit hook had quietly stopped regenerating the
conformance report, CONTRIBUTING pointed contributors at a file that holds no
figure builders any more, one figure could not be generated at all because
moving its builder left a parent count one level short, and one renderer was
filed under a result name instead of its domain. Six test files move to
directories that already carried their subject, two guides move into the
directory their sidebar group is named after, and eight section indexes stop
listing pages from other sections under a heading that reads as an inventory.
The ANP fleet database, the bridge from the EASA tables to the ECAC Doc 29
chain, had five public names and no guide: it appeared only in the generated
reference, where you have to already know the name to find it. It has a page in
both languages now, with two figures drawn off a real aircraft record, and it
states the limit nothing user-facing did: only the 13 aircraft with fixed-point
profiles have a ready-to-use trajectory.
Verified throughout by regenerating what the code produces: 1700 committed
figures match within tolerance, 70 fiches byte for byte, docs/CONFORMANCE.md
identically with its 533 checks passing, 8011 tests, and the site building and
validating in both languages.
Six more printed tables, and two kinds of row that are not an isotropic solid (#847)
* Six more printed tables: Norton & Karczub, Vigran and Rossing
Norton & Karczub's Appendix 4a (21 solids), Table 6.1 (11 loss factors)
and Appendices 4b and 4c (18 liquids and gases), and Vigran's Table 3.1
(9 building materials), join the solids and fluids catalogues. Two tables
that are not isotropic solids get a row type of their own: Norton &
Karczub's Table 3.1, the plateau-method constants, and Rossing's Table
15.5, the four plate stiffnesses of spruce and maple.
Three cells are registered as errata and held as printed but not served:
the cork modulus of Norton & Karczub, the aluminium Poisson ratio of
Vigran, and maple's scaling factor in Rossing, which is 1.4 where the
page's own stiffnesses give 1.50. The fluid loader now carries the
validity line of each table instead of one fixed sentence.
* Read the wood constants and the plateau height the way the page defines them
Rossing's equation (15.86) makes D1 and D3 the two directions, D2 the
Poisson coupling and D4 the twisting stiffness; the module, the page and
the catalogue headings had D2, D3 and D4 shifted, which is also where the
"sixteen times stiffer" came from (D1 over D3 is thirteen). None of the
four carries the plate thickness, and the scaling factor stretches one
wood's two directions, not one wood against the other.
Norton & Karczub's coincidence height is the level of the plateau, a
transmission loss, not the depth of a dip. building.PLATEAU_MATERIALS
typed the same table a second time; it is now built from the catalogue.
The appendix's critical-frequency column is held as printed rather than
replaced by this library's plate-speed product, which differs from it.
The static modulus of aerated concrete derives no dynamic quantity. The
fluid loader carries a row's note into the state's validity, the page
publishes fluids under their printed names with the note on the density,
and the two estimated maple cells are marked on the page. Three counts
in the table descriptions are corrected.
* Format the plateau constants helper
* The wave speeds guide counts nine tables and four tins
The steel lookup now answers with seven books and the tin lookup with
four, one of them a loss factor with no modulus, which the example no
longer divides. Norton & Karczub's 45 GPa sides with Bies against the two
books at 4.4, and the prose says so in both languages and in the mirror.
* Name the fluids package once in its catalogue loader
* Say which two cork cells carry a dash
A hundred and seventy-five more rows of airborne and impact insulation (#848)
* A hundred and seventy-five more rows of airborne and impact insulation
Rossing's Table 11.4 adds twenty-three partitions in six bands with a
sound transmission class, and seven tables of Chapter 31 of the Spanish
edition of Harris add a hundred and twenty-nine ratings with no band:
stud walls, block walls of two weights, block walls under six mountings,
doors unsealed and sealed, exterior doors, sealed windows (a table printed
with the ratings as rows, turned so that a row is a window) and
floor-ceiling systems. A column the page rates a construction in is a row
with the condition as its variant. TransmissionLossSpectrum gains
block_mass_kg and refers_to_row, and the catalogue page now shows the STC
column it already held for ASHRAE.
Tables 19.2 to 19.4 of Harris (1977), the Spanish edition of the first
Handbook of Noise Control, add twenty-three floor treatments on bare
concrete with the average improvement in impact sound insulation in
decibels, a quantity of its own on ImpactInsulation, and the load Table
19.4 prints in kg/cm2 held in pascals.
Every cell was read twice from the page and compared: 501 cells, no
disagreement. Rossing's "Open-plane office partition" is registered as a
typing slip, and Harris (1977) joins the bibliography.
* Say where the 1977 impact tables differ from Chapter 32
The 1977 rows credit no source, the average improvement is quoted on the
same page as its table, and two floors of Table 31.9 are rated under
several ceilings, not three.
* Say which rows are keyed by a slug, and that impact rows carry one of three results
The nonlinearity parameter B/A of a hundred and sixty-four liquid states, each with its paper (#849)
* The nonlinearity parameter B/A of a hundred and sixty-four liquid states
Rossing's Tables 8.1 to 8.4 join fluids as PUBLISHED_NONLINEARITY: pure
water from 0 to 100 C, water up to 50 MPa, organic liquids, liquid
metals and liquefied gases. Each value carries the temperature it was
measured at, the pressure and the year where its table prints them, the
paper it comes from spelled out from the chapter's reference list, and
the plus-or-minus the page prints beside it. A substance several papers
measured is several rows that do not agree, which is the point of
holding the reference.
The 1-pentanol line of Table 8.3, printed twice, is held once and
registered as an erratum. The catalogue page now writes a printed
uncertainty in its cell, which also shows the seven of Cox's ground table
that only a note carried, and writes a year without grouping its digits.
* B/A as the page defines it, and the two defects its tables carry
B/A is the ratio of B = rho0^2 (d2p/drho2)_s to A = rho0 (dp/drho)_s,
not of two Taylor coefficients, which carry a factor of two between
them. Table 8.1 prints 2001 for six rows its own reference list dates to
2002, and those rows serve no year. Six liquefied gases of Table 8.4 are
above their boiling point at the atmospheric pressure the caption gives,
and their rows say so. Both are registered.
Resilient moduli, damping treatments, carpets and the nonlinearity of solids (#850)
* Three small catalogues: resilient moduli, damping treatments and carpets
Vigran's Table 8.3 gives the dynamic modulus of six resilient materials
under a static load of about 2 kPa, from which a layer's dynamic
stiffness is the modulus over its thickness. Table 14.2 of Harris (1977)
rates eight asphalt felt treatments by the decay rate of the chapter's
standard steel panel at 160 Hz, held as a decay rate and not converted
into a loss factor the page does not print. Harris 3e Tables 30.2 and
30.3 describe nineteen carpets by their pile and rate them by their noise
reduction coefficient.
Five pile weights of Table 30.2 print an imperial half that is not the
metric one: three follow from 0.035 kg/m2 per oz/yd2 rather than the
0.0339 of the definition, one from neither, and one lost a digit to a
decimal comma. They are registered, and the four in doubt serve nothing.
* The nonlinearity parameter of solids
Rossing's Table 6.5 gives the ultrasonic beta of eight solids at room
temperature, averaged over the pure-mode directions of a cubic crystal.
It is the page's own beta, -(3 + K3/K2), which for a liquid is B/A + 2
and not B/A, and the module and the catalogue page say so. Five rows are
structures rather than materials; the misspelt Flourite is kept as
printed and registered.
* Carpets after the absorption areas, and what the page says of fibre
The carpets section split the absorption section from its areas and the
finder cut it at the wrong heading. The chapter's own text says the type
of fibre makes no significant difference, and the prose now says so.
The one carpet printed with a wood fibre carries a note pointing at its
wool twin in Table 30.3.
* The catalogue filter matches every word column the table shows
Wind turbine sound at a dwelling by IEC TS 61400-11-2, with its amplitude modulation rating checked against the IOA reference code (#903)
IEC 61400-11 measures what a turbine emits; IEC TS 61400-11-2:2024 measures what arrives at a neighbour's house, where the wind that drives the turbine also stirs the background. Two new modules in phonometry.environment move wind speeds between heights, bin the intervals by wind speed and direction with their uncertainty, take off the background under the 3 dB rule, predict the low frequency level indoors, give the emergence, the upper tone search frequency and the rating level, and rate the amplitude modulation of clause 13, checked against the IOA working group's reference code. Every result has .plot(), a new guide in both languages walks through a dwelling, and nine printed defects of the TS are in the errata register.
Six places where the clause and the code had parted, from a microphone standing under its own clearance to an area that is not one number (ISO 10847, ISO 11820, ISO 11821, EN 16487) (#785)
* Six places where the clause and the code had parted, from a microphone standing under its own clearance to an area that is not one number (ISO 10847, ISO 11820, ISO 11821, EN 16487)
The reference microphone of ISO 10847 could stand lower than 7.2.2 allows.
The clause puts it at least 1,5 m above the top edge of the barrier with
"shall", and its NOTE lets a close source raise it until it looks 10 degrees
over the top; the height returned was the NOTE's alone whenever the source was
nearer than 15 m, which for a 3 m barrier 5 m away is 4,34 m against the 4,5 m
the clause asks for, and past 80 degrees a negative height. It is the higher of
the two now, and where no height reaches the 10 degrees the clearance holds and
a warning says why. The test and the conformance row had both pinned the short
geometry as correct.
ISO 11820 caps its energy subtraction at 3 dB, and Table 1 prints what that
3 dB is: the correction at a 3 dB margin, which the subtraction writes
unrounded as 3,0206 dB. The cap is judged on the margin of the two energy means
now, so the two routes the clause offers agree at the boundary they share and a
printed 3,0 dB pair is no longer decided by floating point. The window that
keeps such a pair out of the cap is the one the module declares and nothing
wider: the comparison names a relative tolerance of zero, as every other
closeness test in the package does, so the constant sets the tolerance it
documents instead of three times it. ISO 11821 7.4 c) reports the attenuation
of a screen to the nearest whole decibel, which the result now gives with
rounded() and rounded_a_weighted() as the barrier, enclosure and cabin results
already did.
The two loss functions of ISO 11820 took their areas as single numbers, where
the area of a diffuse room is a quarter of its absorption and moves with the
reverberation time band by band. They take each area and the field correction
as one value or one per band, and the two fields of the result are arrays of
one value per band even when single values went in. The thesis oracle that had
to be driven one band at a time is one call per table.
check_ceiling_specimen judged three of the limits clause 4 of EN 16487 prints
and published the rest as constants nothing applied. It judges the support
units of 4.1.1.2.3.6 and, given one value per measurement, the 50 % of 4.2.2;
the verdict carries both, and a type E depth other than 200 mm passes with a
warning that no longer calls the arrangement outside the test code. And
room_to_room_transmission gains receiver_distance_m, the direct field the
partition radiates into the receiving room, from Equations (7-71) and (7-72) of
Barron (2003), whose Example 7-6 a new conformance row holds; Norton's Equation
(4.101) is its far limit and stays the default.
The unit guard then read the new humidity_ok as a humidity without its unit: a
parameter typed bool holds a verdict and no number of the quantity it names, so
it is outside the rule. The printed tables the tests and the conformance rows
of these standards both read were transcribed twice, once on each side; they
are transcribed once now, in tests/reference_data, with the document, the folio
and the PDF page of each, and the report regenerates value for value.
The guides say all of it in both languages, with the mirrors, the curated API
table and the errata entry for the 6,2 dB of ISO 14257 Equation (4), which
stays as printed and is now stated where it is spent.
* Two receiver-correction rows a single band could satisfy, and a denominator with two spellings (ISO 10847, ISO 11820)
Both ISO 10847 receiver-correction rows read the largest shift across the three bands, so a correction that reached one band and left the other two alone would still have printed the 6 dB of the pressure doubling and passed. They now read the largest absolute departure from 6 dB, which is a statement about every band, and the 6 dB is written into the expected column as prose so the row still says what it is checking.
The Ver and Beranek absorption row said it was checking a quarter of the printed Sabine absorption area. It multiplies the quarter back up and compares the full printed 10,7 m2, so the row described a different quantity from the one it evaluates.
`receiving_absorption` is the denominator of the reverberant term, and the two books write that term over two different quantities: Norton over S2 alpha2 and Barron over the room constant R2. The module prose, the function docstring and the guide all say so, but the parameter line said only the first, and the parameter tables of the reference pages print that line on its own, away from the paragraph that explains it. It now names both, with the link to `room_constant` beside the one to `equivalent_absorption_area`.
The normalisation cell of the API table printed `spectrum_distribution_value(values, PINK_NOISE_WEIGHTS_DB values)`, two arguments juxtaposed with no accessor between them. The second argument is a sequence of the six weights, so it is `list(PINK_NOISE_WEIGHTS_DB.values())`.
* The background of Annex B case A goes with the label that carries it, not with the coordinates beside it (ISO 11690-3)
Table B.5 prints the 50 dB of background against the workstation it calls W1, and the entry already registered that the labels of that table are the half it gets right: Figure B.1 puts W1 beside machine M2, and that is where the levels of Table B.6 come back. The background was being heard in the far corner instead, which is where the other label belongs.
It is worth 0,004 dB, both readings round to the tenth Table B.6 prints, and no verdict moves. What changes is the second decimal of the two recomputed levels the entry quotes, 82,09 dB and 80,27 dB becoming 82,10 dB and 80,26 dB, and the entry now says where the background sits and what the other reading would cost.
The two counts in the Annex B check labels were written out by hand while the cells they describe were counted in the code beside them, so a row added or removed would have left the prose saying six and twelve. They come from the cells now.
* The Eq. (4) offset row judges every claim it prints, not only the first (ISO 14257)
The row publishes three findings about the fourteen Annex C values: the sum of the Table 1 weights puts none of them outside their rounding, the printed 6,2 dB puts nine outside, and every departure the printed constant gives is high. Its verdict only counted the first. The other two were computed and printed beside it and never judged, so the row would have gone on passing the day the printed constant agreed with the annex, while still saying it does not.
All three are judged now, with a fourth the description also claims, that none of the high cells reaches a second unit of the tenth. The nine is recorded as the finding it is rather than derived, and the fourteen comes from the cells. Made to fail both ways before committing: with the recorded count set as if the constant agreed with the annex, and with the printed departures pushed low.
In the release note, "both use one the angle governs now" becomes "both now use the height the angle governs".
* The two Annex B distances in the ISO 11690-3 entry are the ones the coordinates give
The entry said the position Table B.5 calls W2 is one metre from machine M2 and the one it calls W1 eleven metres from the nearer machine. From the printed coordinates they are 1,17 m and 11,42 m: W2 stands a metre away in plan but 0,6 m higher than the machine. Both now read 1,2 m and 11,4 m, in English and in Spanish. The argument does not change, since the near position is still the quieter one the table claims.
* The generated artefacts are regenerated on top of the measurement diagrams
Moving the layer onto main kept llms-full.txt, the materials absorbers bundle and the conformance artefact as this layer had written them, which dropped what the diagram stack added to the suspended ceilings guide and the ISO 4866 re-citation. Regenerated from the tree, they carry both.